有馬総一郎のブログ

(彼氏の事情)

2024年01月30日 20:26:22 JST - 5 minute read - Vim

Deno初心者が`deno test`で.envファイルから環境変数を設定させてテストする

既に解決済となってしまったが、IBus-SKKと GitHub - vim-skk/skkeleton: SKK implements for Vim/Neovim with denops.vimの併用のためには、skkeletonでユーザ辞書を書き込まれるときCoding Cookieを書き込んでくれれば良いと思ったので、ソースを修正してみた。

元のコミットは Merge pull request #187 from vim-skk/update_for_kvからForkしてみた。

オプションが変更されいる

まず、オプションがいくつか変更されていて、エラーが出まくったので、変更しておいた。

2024-01-11~

  • “globalJisyo” オプションと “globalJisyoEncoding” オプションの削除
  • “userJisyo” オプションは “userDictionary” オプションに変更
  • “immediatelyJisyoRW” オプションは “immediatelyDictionaryRW” オプションに変更

2024-01-10~

  • 使用する辞書は “sources” オプションにより指定するように

2023-12-30~

  • 補完の後処理と端末モードの相性が悪いので一旦無効化
call skkeleton#config({
-  \'globalJisyo':"/usr/share/skk/SKK-JISYO.L",
-  \'userJisyo':"~/.config/ibus-skk/user.dict",
+  \'globalDictionaries':["/usr/share/skk/SKK-JISYO.L"],
+  \'userDictionary':"~/.config/ibus-skk/user.dict.utf8",
・・・中略・・・
  \'eggLikeNewline':v:true,
  \'keepState':v:true,
-  \'useSkkServer':v:true,
+  \'sources':["skk_dictionary", "skk_server"],
  \'skkServerHost':"127.0.0.1",
  \'skkServerPort':1178,
  \'skkServerResEnc':"euc-jp",
  \'skkServerReqEnc':"euc-jp",
\})

skkeletonを修正

diff --git a/denops/skkeleton/dictionary.ts b/denops/skkeleton/dictionary.ts
index 7472ba2..9c2945f 100644
--- a/denops/skkeleton/dictionary.ts
+++ b/denops/skkeleton/dictionary.ts
@@ -5,6 +5,7 @@ import { RomanNum } from "./deps/roman.ts";
 import { zip } from "./deps/std/collections.ts";
 import type { CompletionData, RankData } from "./types.ts";
 
+export const condingCookie = ";;; -*- coding: utf-8 -*-";
 export const okuriAriMarker = ";; okuri-ari entries.";
 export const okuriNasiMarker = ";; okuri-nasi entries.";
 
diff --git a/denops/skkeleton/sources/user_dictionary.ts b/denops/skkeleton/sources/user_dictionary.ts
index 4551e34..d0cf61f 100644
--- a/denops/skkeleton/sources/user_dictionary.ts
+++ b/denops/skkeleton/sources/user_dictionary.ts
@@ -2,6 +2,7 @@ import { config } from "../config.ts";
 import { getKanaTable } from "../kana.ts";
 import type { CompletionData, RankData } from "../types.ts";
 import {
+  condingCookie,
   Dictionary as BaseDictionary,
   HenkanType,
   okuriAriMarker,
@@ -199,6 +200,7 @@ export class Dictionary implements UserDictionary {
       a[0].localeCompare(b[0])
     ).map((e) => `${e[0]} /${e[1].join("/")}/`);
     const data = [
+      [condingCookie],
       [okuriAriMarker],
       okuriAri,
       [okuriNasiMarker],

非常に単純な修正だけど、軽く動かしてみた感じ、上手くいっている。

deno test -Aが上手くいかない

実際の動作はともあれ、deno test -Aで確認しようとするとエラーとなって上手くいかない。ちなみに、Javascriptの開発経験はあるものの、denoの開発経験は0だ。

$ deno test -A
running 5 tests from ./denops/skkeleton/config_test.ts
egg like newline ... ok (1ms)
acceptIllegalResult ... ok (0ms)
immediatelyOkuriConvert ... ok (0ms)
keepMode (vim) ... FAILED (2ms)
keepMode (nvim) ... FAILED (0ms)
running 0 tests from ./denops/skkeleton/deps/denops_test.ts
running 11 tests from ./denops/skkeleton/dictionary_test.ts
・・・中略・・・
error: Error: Environment variable 'DENOPS_TEST_DENOPS_PATH' is required
        throw new Error(
              ^
    at https://deno.land/x/denops_test@v1.4.0/conf.ts:16:15
    at orElse (https://deno.land/x/denops_test@v1.4.0/or_else.ts:6:12)
    at getConfig (https://deno.land/x/denops_test@v1.4.0/conf.ts:15:32)
    at withDenops (https://deno.land/x/denops_test@v1.4.0/with.ts:61:16)
    at fn (https://deno.land/x/denops_test@v1.4.0/tester.ts:105:16)

 FAILURES 

FAILED | 32 passed (12 steps) | 20 failed (1s)

error: Test failed

vim-denops/deno-denops-test: 🌿 Test helper module for denops.vimにも環境変数、設定してね、とあるので以下のような .env を作成する。

.env

DENOPS_TEST_DENOPS_PATH=/home/arimasou16/.vim/plugged/denops.vim
DENOPS_TEST_VIM_EXECUTABLE=/usr/local/bin/vim
DENOPS_TEST_NVIM_EXECUTABLE=/usr/bin/nvim

しかし、同じエラー。source .envしてから、$DENOPS_TEST_DENOPS_PATHに値が設定されているのを確認してから、実行しても駄目。


追記 2024-02-01
冷静に考えるとexport付いてないのだからsourceしたところで意味なく。その後、

export DENOPS_TEST_DENOPS_PATH=/home/arimasou16/.vim/plugged/denops.vim
export DENOPS_TEST_VIM_EXECUTABLE=/usr/local/bin/vim
export DENOPS_TEST_NVIM_EXECUTABLE=/usr/bin/nvim

してから、deno test -Aをしたら成功した。一度嵌ると何かアホみたいなことで躓く。

追記ここまで


Deno で環境変数を設定する方法 #Deno - Qiitaを見ると .env ファイルから読み込み可能とあるが、dotenv/mod.tsは使ってなさそう。

前書き - Deno 日本語マニュアルを見ても良く分からなかったが(流し読みのせいもある)、 Deno Deployではdotenvを使えないを見ると、以下のような記述があった。

「Deno Deployではファイルシステム関連の機能はサポートしてない」とのことです。 なるほど。それならエラー出ますよね。

deployctlのドキュメントにありますが、–envオプションを使うことで.envファイルを読み込むことができます。

ということで、--envオプションを付けて実行してみる。

$ deno test --env -A
running 5 tests from ./denops/skkeleton/config_test.ts
egg like newline ... ok (2ms)
acceptIllegalResult ... ok (0ms)
immediatelyOkuriConvert ... ok (0ms)
keepMode (vim) ... ok (244ms)
keepMode (nvim) ... ok (225ms)
running 0 tests from ./denops/skkeleton/deps/denops_test.ts
running 11 tests from ./denops/skkeleton/dictionary_test.ts
load new JisyoJson ...
  SkkDictionary ... ok (4ms)
  DenoKvDictionary ... ok (12ms)
  ・・・中略・・・
preedit test ... ok (0ms)
preedit with emoji ... ok (0ms)

ok | 52 passed (12 steps) | 0 failed

まじか、成功したぞ。

上記、マニュアルを読み、-A--allow-allであることを知る。とはいえ、どこにも--envについては書かれてないなぁ。ともあれ、 .env ファイルによる環境変数の設定を行うという意味だろうか?多分、 .env ファイルで環境変数設定するの少数派なんだろうな。通常はどうやってるのだろうか。

--alow-の確認

--allow-envがないと、環境変数を読み取れないエラーが出る。

$ deno test --env --allow-read --allow-write --allow-net --allow-run
error: PermissionDenied: Requires env access to "DENOPS_TEST_DENOPS_PATH", run again with the --allow-env flag
  return Deno.env.get(`DENOPS_TEST_${name}`);
                  ^
    at Object.getEnv [as get] (ext:runtime/30_os.js:104:10)

--allow-netがないと、ネットワークアクセス出来ないエラーが出る。

$ deno test --env --allow-read --allow-write --allow-env
error: PermissionDenied: Requires net access to "127.0.0.1:0", run again with the --allow-net flag

--allow-runがないと、サブプロセスが実行できないエラーが出る。

$ deno test --env --allow-read --allow-write --allow-env --allow-net
error: PermissionDenied: Requires run access to "/usr/bin/nvim", run again with the --allow-run flag

--allow-read--allow-writeがないと /tmp 領域だろうと、読めない書けない。

~/.skkeletonに書き込めない

だが、テスト実行で、まだ気になることがあった。-Aを付けてるのにwarning(skkeleton): can't write userDictionary to ~/.skkeletonというファイルを書き込めない警告(エラー)が出るのだ。

おりゃあ、と777にしても駄目。

$ ls -l ~/.skkeleton
-rwxrwxrwx 1 arimasou16 arimasou16 7368  6月 19  2023 /home/arimasou16/.skkeleton

警告を出しているときのエラーを見ると

NotFound: No such file or directory (os error 2): writefile '~/.skkeleton'
    at async writeFile (ext:deno_fs/30_fs.js:901:7)

なので、ファイルを見れてないようだ。

Denoとしてのパス解決仕様がどこに書かれているのか分からないが、上記、記事など見ると~をDenoは解決してくれない?らしい。だから、エラーキャッチして警告どまりにしているんだな。

試しに

diff --git a/denops/skkeleton/config.ts b/denops/skkeleton/config.ts
index 905274e..c011d30 100644
--- a/denops/skkeleton/config.ts
+++ b/denops/skkeleton/config.ts
@@ -32,7 +32,7 @@ export const config: Omit<ConfigOptions, "globalDictionaries"> & {
   skkServerResEnc: "euc-jp",
   sources: ["skk_dictionary"],
   usePopup: true,
-  userDictionary: "~/.skkeleton",
+  userDictionary: "./.skkeleton",
 };
 
 type Validators = {

と相対パスにして、実行したところ、警告なく終了。作成されたファイルを見ると

.skkeleton

;;; -*- coding: utf-8 -*-
;; okuri-ari entries.
はg /剥/
おもu /思/
;; okuri-nasi entries.
あ /亜/
われ /我/

とちゃんとCoding Cookieを付けて出力された。

まあ、IBus-SKKの設定保存できるようになったのと、細かくソース見てないので、Denoどころか、TypeScriptすら怪しい人間なのでPRは出すのは止めよう。

Tags: Vim SKK

IBus-SKKで設定が保存されるようにする LinuxでChromebookのリカバリーUSBを作成する