hikiutils 0.2.3.8 → 0.2.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/hikiutils_bob/Rakefile +16 -4
  3. data/hikiutils_bob/figs/hikiutils_bob.002.bb +5 -0
  4. data/hikiutils_bob/hikiutils_bob/hikiutils_bob.002.bb +5 -0
  5. data/hikiutils_bob/latex_all.hiki +3 -3
  6. data/hikiutils_bob/latex_dir/hikiutils_bob.log +59 -24
  7. data/hikiutils_bob/latex_dir/hikiutils_bob.pdf +0 -0
  8. data/hikiutils_bob/latex_dir/hikiutils_bob.synctex.gz +0 -0
  9. data/hikiutils_bob/latex_dir/latex_all.tex +3 -3
  10. data/hikiutils_bob/latex_dir/sync.aux +1 -1
  11. data/hikiutils_bob/latex_dir/sync.tex +17 -13
  12. data/hikiutils_bob/sync.hiki +9 -6
  13. data/hikiutils_bob/toc.hiki +19 -15
  14. data/hikiutils_yamane/{results.hiki → command.hiki} +11 -13
  15. data/hikiutils_yamane/compare.hiki +13 -297
  16. data/hikiutils_yamane/figs/hikiutils_yamane.001.jpg +0 -0
  17. data/hikiutils_yamane/figs/hikiutils_yamane.002.bb +5 -0
  18. data/hikiutils_yamane/figs/hikiutils_yamane.002.jpg +0 -0
  19. data/hikiutils_yamane/figs/hikiutils_yamane.003.jpg +0 -0
  20. data/hikiutils_yamane/figs/hikiutils_yamane.004.jpg +0 -0
  21. data/hikiutils_yamane/figs/hikiutils_yamane.005.jpg +0 -0
  22. data/hikiutils_yamane/hikiutils_yamane.hiki +8 -7
  23. data/hikiutils_yamane/introduction.hiki +9 -26
  24. data/hikiutils_yamane/latex_dir/command.aux +34 -0
  25. data/hikiutils_yamane/latex_dir/{results.tex → command.tex} +10 -22
  26. data/hikiutils_yamane/latex_dir/compare.aux +24 -0
  27. data/hikiutils_yamane/latex_dir/compare.tex +13 -333
  28. data/hikiutils_yamane/latex_dir/hikiutils_yamane.aux +8 -7
  29. data/hikiutils_yamane/latex_dir/hikiutils_yamane.log +126 -87
  30. data/hikiutils_yamane/latex_dir/hikiutils_yamane.pdf +0 -0
  31. data/hikiutils_yamane/latex_dir/hikiutils_yamane.synctex.gz +0 -0
  32. data/hikiutils_yamane/latex_dir/hikiutils_yamane.tex +6 -5
  33. data/hikiutils_yamane/latex_dir/hikiutils_yamane.toc +25 -21
  34. data/hikiutils_yamane/latex_dir/{purpose.aux → introduction.aux} +6 -4
  35. data/hikiutils_yamane/latex_dir/introduction.tex +7 -29
  36. data/hikiutils_yamane/latex_dir/optparse.aux +29 -0
  37. data/hikiutils_yamane/latex_dir/optparse.tex +116 -0
  38. data/hikiutils_yamane/latex_dir/thor.aux +32 -0
  39. data/hikiutils_yamane/latex_dir/thor.tex +112 -0
  40. data/hikiutils_yamane/optparse.hiki +113 -0
  41. data/hikiutils_yamane/thor.hiki +108 -0
  42. data/hikiutils_yamane/toc.hiki +15 -17
  43. data/lib/hikiutils/version.rb +1 -1
  44. data/lib/templates/Rakefile_hiki_sync +16 -4
  45. data/lib/templates/hiki_help.yml +2 -2
  46. metadata +61 -80
  47. data/hikiutils_yamane/clidescription.hiki +0 -35
  48. data/hikiutils_yamane/code.hiki +0 -285
  49. data/hikiutils_yamane/command_table.hiki +0 -19
  50. data/hikiutils_yamane/figs/hikiutils_yamane.001.jpeg +0 -0
  51. data/hikiutils_yamane/figs/hikiutils_yamane.002.jpeg +0 -0
  52. data/hikiutils_yamane/figs/hikiutils_yamane.003.jpeg +0 -0
  53. data/hikiutils_yamane/figs/hikiutils_yamane.004.jpeg +0 -0
  54. data/hikiutils_yamane/figs/hikiutils_yamane.005.jpeg +0 -0
  55. data/hikiutils_yamane/figs/hikiutils_yamane.006.jpeg +0 -0
  56. data/hikiutils_yamane/figs/hikiutils_yamane.007.jpeg +0 -0
  57. data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.001.jpg +0 -0
  58. data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.002.jpg +0 -0
  59. data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.003.jpg +0 -0
  60. data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.004.jpg +0 -0
  61. data/hikiutils_yamane/figs/hikiutils_yamane_09_copy.005.jpg +0 -0
  62. data/hikiutils_yamane/hikiutils_yamane.key +0 -0
  63. data/hikiutils_yamane/latex_dir/clidescription.aux +0 -24
  64. data/hikiutils_yamane/latex_dir/clidescription.tex +0 -41
  65. data/hikiutils_yamane/latex_dir/code.aux +0 -41
  66. data/hikiutils_yamane/latex_dir/code.tex +0 -319
  67. data/hikiutils_yamane/latex_dir/command_table.tex +0 -29
  68. data/hikiutils_yamane/latex_dir/method.aux +0 -25
  69. data/hikiutils_yamane/latex_dir/method.tex +0 -14
  70. data/hikiutils_yamane/latex_dir/purpose.tex +0 -8
  71. data/hikiutils_yamane/latex_dir/results.aux +0 -28
  72. data/hikiutils_yamane/latex_dir/system.tex +0 -23
  73. data/hikiutils_yamane/method.hiki +0 -12
  74. data/hikiutils_yamane/mi +0 -0
  75. data/hikiutils_yamane/purpose.hiki +0 -7
  76. data/hikiutils_yamane/system.hiki +0 -18
  77. /data/hikiutils_yamane/figs/{hikiutils_yamane_09_copy.006.jpg → hikiutils_yamane.006.jpg} +0 -0
  78. /data/hikiutils_yamane/figs/{hikiutils_yamane_09_copy.007.jpg → hikiutils_yamane.007.jpg} +0 -0
  79. /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.001.jpg → hikiutils_yamane/hikiutils_yamane.001.jpg} +0 -0
  80. /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.002.jpg → hikiutils_yamane/hikiutils_yamane.002.jpg} +0 -0
  81. /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.003.jpg → hikiutils_yamane/hikiutils_yamane.003.jpg} +0 -0
  82. /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.004.jpg → hikiutils_yamane/hikiutils_yamane.004.jpg} +0 -0
  83. /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.005.jpg → hikiutils_yamane/hikiutils_yamane.005.jpg} +0 -0
  84. /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.006.jpg → hikiutils_yamane/hikiutils_yamane.006.jpg} +0 -0
  85. /data/hikiutils_yamane/{hikiutils_yamane_09_copy/hikiutils_yamane_09_copy.007.jpg → hikiutils_yamane/hikiutils_yamane.007.jpg} +0 -0
  86. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_FamilyChineseOahu_EN_00317_2040x1360-small-12.jpg +0 -0
  87. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_FamilyChineseOahu_EN_02016_981x654-small-14.jpg +0 -0
  88. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_familychineseoahu_en_00317_2040x1360-96.jpeg +0 -0
  89. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_familychineseoahu_en_02016_981x654-97.jpeg +0 -0
  90. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_familychineseoahu_en_02390_2880x1921-94.jpeg +0 -0
  91. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/110809_familychineseoahu_en_02390_2880x1921-small-95.jpg +0 -0
  92. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt0@2x-102.jpg +0 -0
  93. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt10@2x-112.jpg +0 -0
  94. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt1@2x-103.jpg +0 -0
  95. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt2@2x-104.jpg +0 -0
  96. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt3@2x-105.jpg +0 -0
  97. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt4@2x-106.jpg +0 -0
  98. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt5@2x-107.jpg +0 -0
  99. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt6@2x-108.jpg +0 -0
  100. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt7@2x-109.jpg +0 -0
  101. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt8@2x-110.jpg +0 -0
  102. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/mt9@2x-111.jpg +0 -0
  103. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/pasted-image-100.tiff +0 -0
  104. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/pasted-image-98.tiff +0 -0
  105. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/pasted-image-small-101.png +0 -0
  106. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/pasted-image-small-99.png +0 -0
  107. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st0-113.jpg +0 -0
  108. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st1-114.jpg +0 -0
  109. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st2-115.jpg +0 -0
  110. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st3-116.jpg +0 -0
  111. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st4-117.jpg +0 -0
  112. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st5-118.jpg +0 -0
  113. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/st6-119.jpg +0 -0
  114. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Data/tile_paper_medgray-93.jpg +0 -0
  115. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Index.zip +0 -0
  116. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Metadata/BuildVersionHistory.plist +0 -0
  117. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Metadata/DocumentIdentifier +0 -0
  118. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/Metadata/Properties.plist +0 -0
  119. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/preview-micro.jpg +0 -0
  120. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/preview-web.jpg +0 -0
  121. /data/hikiutils_yamane/{hikiutils_yamane_09_copy.key → hikiutils_yamane.key}/preview.jpg +0 -0
@@ -1,35 +0,0 @@
1
- {{toc}}
2
- //!CLIのコード
3
- hikiutilsのコマンドライン解析ツールをoptparseからthorに換えることでコマンドの書き換えを行うことができた.
4
- また,thorで書かれたhikiutilsはoptparseで書かれたものよりもコードが短くなり,コマンドの解析も簡単に行えることができた.
5
- ここではthorとoptparseのコードを比較しthorの良さを確認する.
6
- !CLIの解説
7
- !!Thor
8
- Thorとは,コマンドラインツールの作成を支援するライブラリのことである.
9
- gitやbundlerのようにサブコマンドを含むコマンドラインツールを簡単に作成することができる[1-2].
10
-
11
- Thorの基本的な流れとしては
12
-
13
- #Thorを継承したクラスのパブリックメソッドがコマンドになる
14
- #クラス.start(ARGV)でコマンドラインの処理をスタートする
15
- という流れである[1-2].
16
-
17
- startに渡す引数が空の場合,Thorはクラスのヘルプリストを出力する.
18
- また,Thorはサブコマンドやサブサブコマンドも作ることができる.
19
- !!optparse
20
- optparseとは,getoptよりも簡便で,柔軟性に富み,かつ強力なコマンドライン解析ライブラリである.
21
- optparseでは,より宣言的なスタイルのコマンドライン解析手法,すなわちOptionParserのインスタンスでコマンドラインを解析するという手法をとっている.
22
- これを使うと,GNU/POSIX構文でオプションを指定できるだけでなく,使用法やヘルプメッセージの生成も行える[1-3].
23
-
24
- 利用頻度はあまり高くないが古くから開発され,使用例が広く紹介されている.
25
-
26
- optparseの基本的な流れとしては
27
-
28
- #OptionParserオブジェクトoptを生成する
29
- #オプションを取り扱うブロックをopt.onに登録する
30
- #opt.parse(ARGV)でコマンドラインを実際にparseする
31
- という流れである.
32
-
33
- OptionParserはコマンドラインのオプション取り扱うためのクラスであるためオブジェクトoptを生成されopt.onにコマンドを登録することができる.
34
- しかし,OptionParser\#onにはコマンドが登録されているだけであるため,OptionParser\#parseが呼ばれた時,コマンドラインにオプションが指定されていれば実行される.
35
- optparseにはデフォルトとして--helpと--versionオプションを認識する[1-4].
@@ -1,285 +0,0 @@
1
- {{toc}}
2
- !Thorの初期化
3
- {{attach_view(hikiutils_yamane_09_copy.003.jpg,hikiutils_yamane)}}
4
- *Thorのinitializeでのコード
5
- #Hikithor::CLI.start(ARGV)が呼ばれる
6
- #initializeメソッドが呼ばれる
7
- #これではThorのinitializeメソッドが呼ばれない
8
- #superを書くことでThorのinitializeメソッドが呼ばれる
9
- optparseではrequireでoptparseを呼びoptparseのinitializeを定義する必要はないが,Thorはinitializeを定義する必要がある.
10
- Thorの定義方法はrequireでThorを呼びCLIクラスで継承し,initializeメソッドにsuperを書くことでThorのinitializeが呼ばれる.
11
- initializeメソッド内ではThorの初期設定がされていないため,スーパークラスのメソッドを読み出してくれるsuperを書き加えることで図のようにinitializeメソッド内でThorのinitilalizeメソッドが
12
- 呼ばれ定義される.
13
- !!コード
14
- <<< ruby
15
- # -*- coding: utf-8 -*-
16
- require 'thor'
17
- require 'kconv'
18
- require 'hikidoc'
19
- require 'erb'
20
- require "hikiutils/version"
21
- require "hikiutils/tmarshal"
22
- require "hikiutils/infodb"
23
- require 'systemu'
24
- require 'fileutils'
25
- require 'yaml'
26
- require 'pp'
27
-
28
- module Hikithor
29
-
30
- DATA_FILE=File.join(ENV['HOME'],'.hikirc')
31
- attr_accessor :src, :target, :editor_command, :browser, :data_name, :l_dir
32
-
33
- class CLI < Thor
34
- def initialize(*args)
35
- super
36
- @data_name=['nick_name','local_dir','local_uri','global_dir','global_uri']
37
- data_path = File.join(ENV['HOME'], '.hikirc')
38
- DataFiles.prepare(data_path)
39
-
40
- file = File.open(DATA_FILE,'r')
41
- @src = YAML.load(file.read)
42
- file.close
43
- @target = @src[:target]
44
- @l_dir=@src[:srcs][@target][:local_dir]
45
- browser = @src[:browser]
46
- @browser = (browser==nil) ? 'firefox' : browser
47
- p editor_command = @src[:editor_command]
48
- @editor_command = (editor_command==nil) ? 'open -a mi' : editor_command
49
- end
50
- >>>
51
- !コマンド表示と処理
52
- !!Thor
53
- {{attach_view(hikiutils_yamane_09_copy.004.jpg,hikiutils_yamane)}}
54
- #コマンド名,コマンドの説明を一覧に表示させる
55
- #パブリックメソッドのコマンドを別のコマンド名でも実行できるようにする
56
- #コマンドの命令の実行コード
57
- Thorではdescで一覧を表示させるコマンド名,コマンドの説明を登録する.しかし,ここで記述したコマンドは一覧で表示させるものであり,実行されることはないので実際のコマンドと対応させる必要がある.
58
- Thorでは処理実行を行うメソッドがコマンドとなる.しかし,それではコマンド名は1つしか使うことができない.
59
- ここで用いるものがmapである.
60
- <<<
61
- map A => B
62
- >>>
63
- mapとはBでしか読めないものをAでも読めるようにしてくれるものである.
64
- よって,これを使うことで別のコマンドも指定することができる.
65
- !!optparse
66
- {{attach_view(hikiutils_yamane_09_copy.005.jpg,hikiutils_yamane)}}
67
- #OptionParserオブジェクトoptを生成
68
- #optにコマンドを登録
69
- #入力されたコマンドの処理のメソッドへ移動
70
- optparseではOptionParserオブジェクトoptの生成を行い,コマンドをoptに登録することでコマンドを作成することができる.しかし,これはコマンドを登録しているだけで
71
- コマンドの一覧ではこれを表示することができるが,コマンドの実行を行うためには実行を行うためのメソッドを作成する必要がある.optparseでのコマンドの実行はoptで登録された
72
- コマンドが入力されることでそれぞれのコマンドの処理を行うメソッドに移動し処理を行う.しかし,このコマンド登録はハイフンを付けたコマンドしか登録ができず,ハイフンなしのコマンド登録は
73
- また別の手段でやらなくてはいけない.
74
- 以上より,Thorではコマンドの指定と処理にはdesc,map,処理メソッドだけで済むが,optparseではコマンドを登録するためのメソッドと処理メソッドが必要になってくる.
75
- また,コマンドはThorでは処理メソッドがコマンド名になるが,optparseではコマンドを登録するための処理も必要となってくる.
76
-
77
- !!コード
78
- *Thor
79
- <<< ruby
80
- desc 'show,--show', 'show sources'
81
- map "--show" => "show"
82
- def show
83
- printf("target_no:%i\n",@src[:target])
84
- printf("editor_command:%s\n",@src[:editor_command])
85
- @i_size,@n_size,@l_size,@g_size=3,5,30,15 #i,g_size are fixed
86
- n_l,l_l=0,0
87
- @src[:srcs].each_with_index{|src,i|
88
- n_l =(n_l= src[:nick_name].length)>@n_size? n_l:@n_size
89
- l_l =(l_l= src[:local_dir].length)>@l_size? l_l:@l_size
90
- }
91
- @n_size,@l_size=n_l,l_l
92
- command = Command.new
93
- header = command.display_format('id','name','local directory','global uri',@i_size,@n_size,@l_size,@g_size)
94
-
95
- puts header
96
- puts '-' * header.size
97
-
98
- @src[:srcs].each_with_index{|src,i|
99
- target = i==@src[:target] ? '*':' '
100
- id = target+i.to_s
101
- name=src[:nick_name]
102
- local=src[:local_dir]
103
- global=src[:global_uri]
104
- puts command.display_format(id,name,local,global,@i_size,@n_size,@l_size,@g_size)
105
- }
106
- end
107
- >>>
108
- *optparse
109
- <<< ruby
110
- def execute
111
- @argv << '--help' if @argv.size==0
112
- command_parser = OptionParser.new do |opt|
113
- opt.on('-v', '--version','show program Version.') { |v|
114
- opt.version = HikiUtils::VERSION
115
- puts opt.ver
116
- }
117
- opt.on('-s', '--show','show sources') {show_sources}
118
- opt.on('-a', '--add','add sources info') {add_sources }
119
- opt.on('-t', '--target VAL','set target id') {|val| set_target(val)}
120
- opt.on('-e', '--edit FILE','open file') {|file| edit_file(file) }
121
- opt.on('-l', '--list [FILE]','list files') {|file| list_files(file)}
122
- opt.on('-u', '--update FILE','update file') {|file| update_file(file) }
123
- opt.on('-r', '--rsync','rsync files') {rsync_files}
124
- opt.on('--database FILE','read database file') {|file| db_file(file)}
125
- opt.on('--display FILE','display converted hikifile') {|file| display(file)}
126
- opt.on('-c', '--checkdb','check database file') {check_db}
127
- opt.on('--remove FILE','remove file') {|file| remove_file(file)}
128
- opt.on('--move FILES','move file1,file2',Array) {|files| move_file(files)}
129
- opt.on('--euc FILE','translate file to euc') {|file| euc_file(file)}
130
- opt.on('--initialize','initialize source directory') {dir_init() }
131
- end
132
- begin
133
- command_parser.parse!(@argv)
134
- rescue=> eval
135
- p eval
136
- end
137
- dump_sources
138
- exit
139
- end
140
-
141
- def show_sources()
142
- printf("target_no:%i\n",@src[:target])
143
- printf("editor_command:%s\n",@src[:editor_command])
144
- check_display_size()
145
- header = display_format('id','name','local directory','global uri')
146
-
147
- puts header
148
- puts '-' * header.size
149
-
150
- @src[:srcs].each_with_index{|src,i|
151
- target = i==@src[:target] ? '*':' '
152
- id = target+i.to_s
153
- name=src[:nick_name]
154
- local=src[:local_dir]
155
- global=src[:global_uri]
156
- puts display_format(id,name,local,global)
157
- }
158
- end
159
-
160
- def add_sources
161
- cont = {}
162
- @data_name.each{|name|
163
- printf("%s ? ", name)
164
- tmp = gets.chomp
165
- cont[name.to_sym] = tmp
166
- }
167
- @src[:srcs] << cont
168
- show_sources
169
- end
170
- >>>
171
- !CLIの実行
172
- !!Thor
173
- {{attach_view(hikiutils_yamane_09_copy.006.jpg,hikiutils_yamane)}}
174
- *実行手順
175
-
176
- #hiki_thorのHikithor::CLI.start(ARGV)でhikiutils_thor.rbのCLIクラスを呼ぶ
177
- #hikiutils_thor.rbのCLIクラスのメソッドを順に実行していく
178
-
179
- Thorではstart(ARGV)を呼び出すことでCLIを開始する.Hikithor::CLI.start(ARGV)を実行されることによりrequireで呼ばれているhikiutils_thor.rbのCLIコマンドを順に実行する.
180
- そして,入力されたコマンドと一致するメソッドを探し,そのコマンドの処理が実行される.
181
- !!optparse
182
- {{attach_view(hikiutils_yamane_09_copy.007.jpg,hikiutils_yamane)}}
183
- *実行手順
184
-
185
- #HikiのHikiUtils::Command.run(ARGV)でhikiutils.rbのrunメソッドを呼ぶ
186
- #new(argv).executeでexecuteメソッドが実行される
187
- 一方,optparseではHikiutils::Command.run(ARGV)を実行される.requireで呼び出されたhikiutils.rbでrunメソッドが実行される.
188
- そこでコマンドを登録しているexecuteメソッドへ移動し入力したコマンドと対応させる.そして,対応したコマンドの処理が行われるメソッドに移動することで実行される.
189
- このようにoptparseでは実行を行うためのメソッドが必要であるが,Thorではクラスのメソッドを順に実行していくため
190
- runメソッドとexecuteメソッドは必要ない.また,optparseでの実行手順はメソッドの移動回数が多く複雑であるが,Thorは単純で分かりやすいものとなっている.
191
- !!コード
192
- *Thor
193
- <<< ruby
194
- #!/usr/bin/env ruby
195
-
196
- require "hikiutils_thor"
197
-
198
- Hikithor::CLI.start(ARGV)
199
- >>>
200
- <<< ruby
201
- # -*- coding: utf-8 -*-
202
- require 'thor'
203
- require 'kconv'
204
- require 'hikidoc'
205
- require 'erb'
206
- require "hikiutils/version"
207
- require "hikiutils/tmarshal"
208
- require "hikiutils/infodb"
209
- require 'systemu'
210
- require 'fileutils'
211
- require 'yaml'
212
- require 'pp'
213
-
214
- module Hikithor
215
-
216
- DATA_FILE=File.join(ENV['HOME'],'.hikirc')
217
- attr_accessor :src, :target, :editor_command, :browser, :data_name, :l_dir
218
-
219
- class CLI < Thor
220
- def initialize(*args)
221
- super
222
- @data_name=['nick_name','local_dir','local_uri','global_dir','global_uri']
223
- data_path = File.join(ENV['HOME'], '.hikirc')
224
- DataFiles.prepare(data_path)
225
-
226
- file = File.open(DATA_FILE,'r')
227
- @src = YAML.load(file.read)
228
- file.close
229
- @target = @src[:target]
230
- @l_dir=@src[:srcs][@target][:local_dir]
231
- browser = @src[:browser]
232
- @browser = (browser==nil) ? 'firefox' : browser
233
-
234
- >>>
235
- *optparse
236
- <<< ruby
237
- #!/usr/bin/env ruby
238
-
239
- require "hikiutils"
240
-
241
- HikiUtils::Command.run(ARGV)
242
- >>>
243
- <<< ruby
244
- def self.run(argv=[])
245
- print "hikiutils: provide utilities for helping hiki editing.\n"
246
- new(argv).execute
247
- end
248
-
249
- def execute
250
- @argv << '--help' if @argv.size==0
251
- command_parser = OptionParser.new do |opt|
252
- opt.on('-v', '--version','show program Version.') { |v|
253
- opt.version = HikiUtils::VERSION
254
- puts opt.ver
255
- }
256
- opt.on('-s', '--show','show sources') {show_sources}
257
- opt.on('-a', '--add','add sources info') {add_sources }
258
- opt.on('-t', '--target VAL','set target id') {|val| set_target(val) }
259
- opt.on('-e', '--edit FILE','open file') {|file| edit_file(file) }
260
- opt.on('-l', '--list [FILE]','list files') {|file| list_files(file) }
261
- opt.on('-u', '--update FILE','update file') {|file| update_file(file) }
262
- opt.on('-r', '--rsync','rsync files') {rsync_files}
263
- opt.on('--database FILE','read database file') {|file| db_file(file)}
264
- opt.on('--display FILE','display converted hikifile') {|file| display(f\
265
- ile)}
266
- opt.on('-c', '--checkdb','check database file') {check_db}
267
- opt.on('--remove FILE','remove file') {|file| remove_file(file)}
268
- opt.on('--move FILES','move file1,file2',Array) {|files| move_file(file\
269
- s)}
270
- opt.on('--euc FILE','translate file to euc') {|file| euc_file(file) }
271
- opt.on('--initialize','initialize source directory') {dir_init() }
272
- end
273
- begin
274
- command_parser.parse!(@argv)
275
- rescue=> eval
276
- p eval
277
- end
278
- dump_sources
279
- exit
280
- end
281
- >>>
282
- コードからもThorのほうが短くなっていることが分かる.
283
- よって,Thorとoptparseでのコードの違いは以上の部分になるが全体的にもThorのほうがコードが短くなり,
284
- コマンドの定義も簡単に行うことができる.また,実行手順も分かりやすくコードが読みやすいため書き換えもすぐ行うことが
285
- できるので,より直感的なコマンドを実装することも可能となった.
@@ -1,19 +0,0 @@
1
- !コマンド名の検討
2
- bashあるいはtcshなどのshellコマンドの振る舞いに似た振る舞いをするコマンドはおなじ名前を振るべきと考えられる.そこで,次のように検討を加える.
3
-
4
- ||現在のcommand||変える?||検討内容
5
- ||add || || add sources info
6
- ||checkdb || || check database file
7
- ||datebase FILE || || read datebase file
8
- ||display FILE ||?|| display converted hikifile
9
- ||edit FILE ||open|| open file
10
- ||euc FILE || || translate file to euc
11
- ||help [COMMAND] || || Describe available commands or one specific command
12
- ||list [FILE] ||ls|| list files
13
- ||move [FILE] ||mv| move file
14
- ||remove [FILE] ||rm|| remove files
15
- ||rsync || || rsync files
16
- ||show ||??||lsとかぶる.
17
- ||target VAL ||cd|| set target id
18
- ||update FILE ||touch|| update file
19
- ||version || || show program version
Binary file
@@ -1,24 +0,0 @@
1
- \relax
2
- \@writefile{toc}{\contentsline {subsection}{\numberline {4.4}CLIの解説}{12}}
3
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.4.1}Thor}{12}}
4
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.4.2}optparse}{12}}
5
- \@setckpt{clidescription}{
6
- \setcounter{page}{14}
7
- \setcounter{equation}{0}
8
- \setcounter{enumi}{3}
9
- \setcounter{enumii}{0}
10
- \setcounter{enumiii}{0}
11
- \setcounter{enumiv}{0}
12
- \setcounter{footnote}{0}
13
- \setcounter{mpfootnote}{0}
14
- \setcounter{part}{0}
15
- \setcounter{section}{4}
16
- \setcounter{subsection}{4}
17
- \setcounter{subsubsection}{2}
18
- \setcounter{paragraph}{0}
19
- \setcounter{subparagraph}{0}
20
- \setcounter{figure}{2}
21
- \setcounter{table}{1}
22
- \setcounter{lstnumber}{12}
23
- \setcounter{lstlisting}{0}
24
- }
@@ -1,41 +0,0 @@
1
- \verb|{{toc}}|
2
- hikiutilsのコマンドライン解析ツールをoptparseからthorに換えることでコマンドの書き換えを行うことができた.
3
- また,thorで書かれたhikiutilsはoptparseで書かれたものよりもコードが短くなり,コマンドの解析も簡単に行えることができた.
4
- ここではthorとoptparseのコードを比較しthorの良さを確認する.
5
-
6
- \subsection{CLIの解説}
7
- \subsubsection{Thor}
8
- Thorとは,コマンドラインツールの作成を支援するライブラリのことである.
9
- gitやbundlerのようにサブコマンドを含むコマンドラインツールを簡単に作成することができる[1-2].
10
-
11
- Thorの基本的な流れとしては
12
-
13
- \begin{enumerate}
14
- \item Thorを継承したクラスのパブリックメソッドがコマンドになる
15
- \item クラス.start(ARGV)でコマンドラインの処理をスタートする
16
- \end{enumerate}
17
- という流れである[1-2].
18
-
19
- startに渡す引数が空の場合,Thorはクラスのヘルプリストを出力する.
20
- また,Thorはサブコマンドやサブサブコマンドも作ることができる.
21
-
22
- \subsubsection{optparse}
23
- optparseとは,getoptよりも簡便で,柔軟性に富み,かつ強力なコマンドライン解析ライブラリである.
24
- optparseでは,より宣言的なスタイルのコマンドライン解析手法,すなわちOptionParserのインスタンスでコマンドラインを解析するという手法をとっている.
25
- これを使うと,GNU/POSIX構文でオプションを指定できるだけでなく,使用法やヘルプメッセージの生成も行える[1-3].
26
-
27
- 利用頻度はあまり高くないが古くから開発され,使用例が広く紹介されている.
28
-
29
- optparseの基本的な流れとしては
30
-
31
- \begin{enumerate}
32
- \item OptionParserオブジェクトoptを生成する
33
- \item オプションを取り扱うブロックをopt.onに登録する
34
- \item opt.parse(ARGV)でコマンドラインを実際にparseする
35
- \end{enumerate}
36
- という流れである.
37
-
38
- OptionParserはコマンドラインのオプション取り扱うためのクラスであるためオブジェクトoptを生成されopt.onにコマンドを登録することができる.
39
- しかし,OptionParser\#onにはコマンドが登録されているだけであるため,OptionParser\#parseが呼ばれた時,コマンドラインにオプションが指定されていれば実行される.
40
- optparseにはデフォルトとして--helpと--versionオプションを認識する[1-4].
41
-
@@ -1,41 +0,0 @@
1
- \relax
2
- \@writefile{toc}{\contentsline {subsection}{\numberline {4.5}Thorの初期化}{14}}
3
- \@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces }}{14}}
4
- \newlabel{default}{{3}{14}}
5
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.5.1}コード}{14}}
6
- \@writefile{toc}{\contentsline {subsection}{\numberline {4.6}コマンド表示と処理}{15}}
7
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.6.1}Thor}{15}}
8
- \@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces }}{16}}
9
- \newlabel{default}{{4}{16}}
10
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.6.2}optparse}{16}}
11
- \@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces }}{17}}
12
- \newlabel{default}{{5}{17}}
13
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.6.3}コード}{17}}
14
- \@writefile{toc}{\contentsline {subsection}{\numberline {4.7}CLIの実行}{20}}
15
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.1}Thor}{20}}
16
- \@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces }}{20}}
17
- \newlabel{default}{{6}{20}}
18
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.2}optparse}{20}}
19
- \@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces }}{21}}
20
- \newlabel{default}{{7}{21}}
21
- \@writefile{toc}{\contentsline {subsubsection}{\numberline {4.7.3}コード}{21}}
22
- \@setckpt{code}{
23
- \setcounter{page}{25}
24
- \setcounter{equation}{0}
25
- \setcounter{enumi}{2}
26
- \setcounter{enumii}{0}
27
- \setcounter{enumiii}{0}
28
- \setcounter{enumiv}{0}
29
- \setcounter{footnote}{0}
30
- \setcounter{mpfootnote}{0}
31
- \setcounter{part}{0}
32
- \setcounter{section}{4}
33
- \setcounter{subsection}{7}
34
- \setcounter{subsubsection}{3}
35
- \setcounter{paragraph}{0}
36
- \setcounter{subparagraph}{0}
37
- \setcounter{figure}{7}
38
- \setcounter{table}{1}
39
- \setcounter{lstnumber}{38}
40
- \setcounter{lstlisting}{0}
41
- }