unageanu-jiji 1.1.4 → 1.2.1

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 (233) hide show
  1. data/ChangeLog +24 -1
  2. data/README +0 -0
  3. data/base/shared_lib/moving_average.rb +34 -33
  4. data/base/shared_lib/system/cross.rb +76 -0
  5. data/base/shared_lib/system/position_manager.rb +160 -0
  6. data/base/shared_lib/system/signal.rb +347 -0
  7. data/html/css/datatable.css +4 -4
  8. data/html/css/default.css +57 -5
  9. data/html/css/treeview.css +205 -0
  10. data/html/img/bin_closed.png +0 -0
  11. data/html/img/bin_empty.png +0 -0
  12. data/html/img/button_add_small.gif +0 -0
  13. data/html/img/button_add_small_gray.gif +0 -0
  14. data/html/img/button_add_small_over.gif +0 -0
  15. data/html/img/button_mkcol.gif +0 -0
  16. data/html/img/button_mkcol_gray.gif +0 -0
  17. data/html/img/button_mkcol_over.gif +0 -0
  18. data/html/img/button_remove_small.gif +0 -0
  19. data/html/img/button_remove_small_gray.gif +0 -0
  20. data/html/img/button_remove_small_over.gif +0 -0
  21. data/html/img/button_rename.gif +0 -0
  22. data/html/img/button_rename_gray.gif +0 -0
  23. data/html/img/button_rename_over.gif +0 -0
  24. data/html/img/control_play.png +0 -0
  25. data/html/img/control_play_blue.png +0 -0
  26. data/html/img/folder.png +0 -0
  27. data/html/img/folder_brick.png +0 -0
  28. data/html/img/folder_user.png +0 -0
  29. data/html/{js/codepress/images → img}/line-numbers.png +0 -0
  30. data/html/img/page_white_ruby.png +0 -0
  31. data/html/img/sidebar_agent_edit.png +0 -0
  32. data/html/img/sidebar_agent_edit_over.png +0 -0
  33. data/html/img/sidebar_agent_edit_s.png +0 -0
  34. data/html/img/yui/treeview-sprite.gif +0 -0
  35. data/html/index.html +34 -18
  36. data/html/js/agent-editor/agent-editor-page.js +324 -0
  37. data/html/js/agent-editor/agent-editor.js +363 -0
  38. data/html/js/agent-editor/agent-list-tree.js +251 -0
  39. data/html/js/agent-selector.js +23 -28
  40. data/html/js/app.js +63 -91
  41. data/html/js/bt-create-page.js +25 -19
  42. data/html/js/container-min.js +1 -1
  43. data/html/js/container.js +944 -0
  44. data/html/js/edit_area/autocompletion.js +11 -13
  45. data/html/js/edit_area/edit_area.css +79 -40
  46. data/html/js/edit_area/edit_area.js +255 -226
  47. data/html/js/edit_area/edit_area_compressor.php +4 -4
  48. data/html/js/edit_area/edit_area_full.gz +0 -0
  49. data/html/js/edit_area/edit_area_full.js +31 -31
  50. data/html/js/edit_area/edit_area_full_with_plugins.gz +0 -0
  51. data/html/js/edit_area/edit_area_full_with_plugins.js +31 -31
  52. data/html/js/edit_area/edit_area_functions.js +448 -341
  53. data/html/js/edit_area/edit_area_loader.js +409 -397
  54. data/html/js/edit_area/elements_functions.js +120 -123
  55. data/html/js/edit_area/highlight.js +305 -197
  56. data/html/js/edit_area/images/goto.png +0 -0
  57. data/html/js/edit_area/images/help.png +0 -0
  58. data/html/js/edit_area/images/redo.png +0 -0
  59. data/html/js/edit_area/images/save.png +0 -0
  60. data/html/js/edit_area/images/search.png +0 -0
  61. data/html/js/edit_area/images/undo.png +0 -0
  62. data/html/js/edit_area/images/word_wrap.gif +0 -0
  63. data/html/js/edit_area/keyboard.js +5 -5
  64. data/html/js/edit_area/langs/bg.js +73 -0
  65. data/html/js/edit_area/langs/cs.js +2 -0
  66. data/html/js/edit_area/langs/de.js +2 -0
  67. data/html/js/edit_area/langs/dk.js +2 -0
  68. data/html/js/edit_area/langs/en.js +2 -0
  69. data/html/js/edit_area/langs/eo.js +2 -0
  70. data/html/js/edit_area/langs/es.js +2 -0
  71. data/html/js/edit_area/langs/fi.js +67 -0
  72. data/html/js/edit_area/langs/fr.js +2 -0
  73. data/html/js/edit_area/langs/hr.js +2 -0
  74. data/html/js/edit_area/langs/it.js +2 -0
  75. data/html/js/edit_area/langs/ja.js +2 -0
  76. data/html/js/edit_area/langs/mk.js +2 -0
  77. data/html/js/edit_area/langs/nl.js +2 -0
  78. data/html/js/edit_area/langs/pl.js +2 -0
  79. data/html/js/edit_area/langs/pt.js +2 -0
  80. data/html/js/edit_area/langs/ru.js +2 -0
  81. data/html/js/edit_area/langs/sk.js +2 -0
  82. data/html/js/edit_area/langs/zh.js +67 -0
  83. data/html/js/edit_area/manage_area.js +362 -205
  84. data/html/js/edit_area/plugins/charmap/langs/bg.js +12 -0
  85. data/html/js/edit_area/plugins/charmap/langs/zh.js +6 -0
  86. data/html/js/edit_area/plugins/test/langs/bg.js +10 -0
  87. data/html/js/edit_area/plugins/test/langs/zh.js +4 -0
  88. data/html/js/edit_area/reg_syntax/java.js +56 -0
  89. data/html/js/edit_area/reg_syntax/ruby.js +9 -9
  90. data/html/js/edit_area/reg_syntax.js +15 -13
  91. data/html/js/edit_area/regexp.js +36 -32
  92. data/html/js/edit_area/resize_area.js +43 -47
  93. data/html/js/edit_area/search_replace.js +29 -29
  94. data/html/js/edit_area/template.html +6 -4
  95. data/html/js/json-broker-client.js +23 -17
  96. data/html/js/result-page.js +107 -57
  97. data/html/js/rt-setting-page.js +38 -15
  98. data/html/js/sidebar.js +41 -27
  99. data/html/js/templates.js +167 -32
  100. data/html/js/utils.js +143 -7
  101. data/html/js/yui/treeview.js +3671 -0
  102. data/html/swf/chart.swf +0 -0
  103. data/html/test/agent_editor_spec.js +815 -0
  104. data/html/test/index.html +40 -0
  105. data/html/test/jsspec/JSSpec.css +224 -0
  106. data/html/test/jsspec/JSSpec.js +1549 -0
  107. data/html/test/jsspec/diff_match_patch.js +1 -0
  108. data/html/test/utils_spec.js +111 -0
  109. data/lib/jiji/agent/agent.rb +69 -12
  110. data/lib/jiji/agent/agent_manager.rb +18 -12
  111. data/lib/jiji/agent/agent_registry.rb +35 -121
  112. data/lib/jiji/collector.rb +16 -6
  113. data/lib/jiji/command.rb +46 -5
  114. data/lib/jiji/dao/file_system_dao.rb +158 -0
  115. data/lib/jiji/dao/timed_data_dao.rb +2 -0
  116. data/lib/jiji/dao/trade_result_dao.rb +1 -1
  117. data/lib/jiji/error.rb +24 -8
  118. data/lib/jiji/migration/migrator1_2_0.rb +67 -0
  119. data/lib/jiji/models.rb +82 -24
  120. data/lib/jiji/operator.rb +55 -51
  121. data/lib/jiji/output.rb +85 -29
  122. data/lib/jiji/output_manager.rb +84 -0
  123. data/lib/jiji/plugin/embedded/single_click_client.rb +2 -2
  124. data/lib/jiji/plugin/securities_plugin.rb +0 -1
  125. data/lib/jiji/process.rb +229 -208
  126. data/lib/jiji/process_manager.rb +190 -96
  127. data/lib/jiji/registry.rb +87 -19
  128. data/lib/jiji/server.rb +1 -0
  129. data/lib/jiji/service/agent_service.rb +147 -48
  130. data/lib/jiji/service/output_service.rb +37 -17
  131. data/lib/jiji/service/process_service.rb +3 -5
  132. data/lib/jiji/service/trade_result_service.rb +4 -5
  133. data/lib/jiji/util/file_lock.rb +4 -4
  134. data/lib/jiji/util/include_proxy.rb +17 -0
  135. data/lib/jiji/util/json_broker.rb +6 -4
  136. data/lib/jiji/util/util.rb +1 -1
  137. data/swf/chart/fx/chart/Chart.as +7 -0
  138. data/swf/chart/fx/chart/ui/graph/GraphManager.as +15 -2
  139. data/test/ProcessTest/agents/foo.rb +10 -0
  140. data/test/ProcessTest/conf/configuration.yaml +3 -0
  141. data/test/agent/agent_tests.rb +10 -0
  142. data/test/agent/test_AgentManager.rb +28 -12
  143. data/test/agent/test_AgentRegistry.rb +194 -99
  144. data/test/agent/test_PeriodicallyAgent.rb +1 -2
  145. data/test/agent/test_Permitter.rb +1 -2
  146. data/test/all_tests.rb +7 -19
  147. data/test/dao/dao_tests.rb +9 -0
  148. data/test/dao/test_FileSystemDao.rb +431 -0
  149. data/test/dao/test_RateDao.rb +5 -7
  150. data/test/dao/test_TradeResultDao.rb +1 -2
  151. data/test/migration/migration_tests.rb +10 -0
  152. data/test/migration/migrator1_2_0test_data/basic/out/M2NlOTA2ODEtZDdlNi00NWU1LWIwNDQtMjBmODY2ZGNkNzBj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  153. data/test/migration/migrator1_2_0test_data/basic/out/MDVhYzcxMjYtMGFlMS00Mzk0LWEyNmUtYjVjZjgwNDA0ZmE2/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  154. data/test/migration/migrator1_2_0test_data/basic/out/MzA1YTk0NDgtNzhjNi00NDk3LTk2NTktYzE1ZjBhNzdiYjNj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  155. data/test/migration/migrator1_2_0test_data/basic/out/YjRkOTI1MzEtZTM4MS00YjQwLTg1ZTQtMWFmZDRlNDUwMzBm/56e75YuV5bmz5Z2H57ea/meta.yaml +9 -0
  156. data/test/migration/migrator1_2_0test_data/basic/props.yaml +85 -0
  157. data/test/migration/migrator1_2_0test_data/illegal_props/out/M2NlOTA2ODEtZDdlNi00NWU1LWIwNDQtMjBmODY2ZGNkNzBj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  158. data/test/migration/migrator1_2_0test_data/illegal_props/out/MDVhYzcxMjYtMGFlMS00Mzk0LWEyNmUtYjVjZjgwNDA0ZmE2/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  159. data/test/migration/migrator1_2_0test_data/illegal_props/out/MzA1YTk0NDgtNzhjNi00NDk3LTk2NTktYzE1ZjBhNzdiYjNj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  160. data/test/migration/migrator1_2_0test_data/illegal_props/out/YjRkOTI1MzEtZTM4MS00YjQwLTg1ZTQtMWFmZDRlNDUwMzBm/56e75YuV5bmz5Z2H57ea/meta.yaml +9 -0
  161. data/test/migration/migrator1_2_0test_data/illegal_props/props.yaml +1 -0
  162. data/test/migration/migrator1_2_0test_data/no_outs/props.yaml +85 -0
  163. data/test/migration/migrator1_2_0test_data/no_props/out/M2NlOTA2ODEtZDdlNi00NWU1LWIwNDQtMjBmODY2ZGNkNzBj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  164. data/test/migration/migrator1_2_0test_data/no_props/out/MDVhYzcxMjYtMGFlMS00Mzk0LWEyNmUtYjVjZjgwNDA0ZmE2/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  165. data/test/migration/migrator1_2_0test_data/no_props/out/MzA1YTk0NDgtNzhjNi00NDk3LTk2NTktYzE1ZjBhNzdiYjNj/56e75YuV5bmz5Z2H57ea/meta.yaml +8 -0
  166. data/test/migration/migrator1_2_0test_data/no_props/out/YjRkOTI1MzEtZTM4MS00YjQwLTg1ZTQtMWFmZDRlNDUwMzBm/56e75YuV5bmz5Z2H57ea/meta.yaml +9 -0
  167. data/test/migration/test_Migrator.rb +1 -1
  168. data/test/migration/test_Migrator1_0_3.rb +1 -1
  169. data/test/migration/test_Migrator1_1_0.rb +1 -1
  170. data/test/migration/test_Migrator1_2_0.rb +94 -0
  171. data/test/plugin/embedded/test_SingleClickClient.rb +1 -2
  172. data/test/plugin/plugin_tests.rb +8 -0
  173. data/test/plugin/test_Loader.rb +1 -1
  174. data/test/shared/rate.csv +144 -0
  175. data/test/shared/shared_tests.rb +9 -0
  176. data/test/shared/test_Cross.rb +144 -0
  177. data/test/shared/test_PositionManager.rb +285 -0
  178. data/test/shared/test_Signal.rb +65 -0
  179. data/test/test_Output.rb +28 -21
  180. data/test/test_OutputManager.rb +162 -0
  181. data/test/test_Output_registry.rb +6 -17
  182. data/test/test_Process.rb +434 -222
  183. data/test/test_ProcessManager.rb +458 -101
  184. data/test/test_utils.rb +71 -8
  185. data/test/util/test_BlockToSession.rb +1 -2
  186. data/test/util/test_CSV.rb +1 -2
  187. data/test/util/test_SynchronizeInterceptor.rb +1 -2
  188. data/test/util/util_tests.rb +9 -0
  189. metadata +127 -47
  190. data/html/js/agent-editor-page.js +0 -440
  191. data/html/js/codepress/codepress.css +0 -21
  192. data/html/js/codepress/codepress.html +0 -35
  193. data/html/js/codepress/codepress.js +0 -138
  194. data/html/js/codepress/engines/gecko.js +0 -293
  195. data/html/js/codepress/engines/khtml.js +0 -0
  196. data/html/js/codepress/engines/msie.js +0 -304
  197. data/html/js/codepress/engines/older.js +0 -0
  198. data/html/js/codepress/engines/opera.js +0 -260
  199. data/html/js/codepress/images/line-numbers.gif +0 -0
  200. data/html/js/codepress/index.html +0 -443
  201. data/html/js/codepress/languages/asp.css +0 -71
  202. data/html/js/codepress/languages/asp.js +0 -117
  203. data/html/js/codepress/languages/autoit.css +0 -13
  204. data/html/js/codepress/languages/autoit.js +0 -32
  205. data/html/js/codepress/languages/csharp.css +0 -9
  206. data/html/js/codepress/languages/csharp.js +0 -25
  207. data/html/js/codepress/languages/css.css +0 -10
  208. data/html/js/codepress/languages/css.js +0 -23
  209. data/html/js/codepress/languages/generic.css +0 -9
  210. data/html/js/codepress/languages/generic.js +0 -25
  211. data/html/js/codepress/languages/html.css +0 -13
  212. data/html/js/codepress/languages/html.js +0 -59
  213. data/html/js/codepress/languages/java.css +0 -7
  214. data/html/js/codepress/languages/java.js +0 -24
  215. data/html/js/codepress/languages/javascript.css +0 -8
  216. data/html/js/codepress/languages/javascript.js +0 -30
  217. data/html/js/codepress/languages/perl.css +0 -11
  218. data/html/js/codepress/languages/perl.js +0 -27
  219. data/html/js/codepress/languages/php.css +0 -12
  220. data/html/js/codepress/languages/php.js +0 -61
  221. data/html/js/codepress/languages/ruby.css +0 -10
  222. data/html/js/codepress/languages/ruby.js +0 -26
  223. data/html/js/codepress/languages/sql.css +0 -10
  224. data/html/js/codepress/languages/sql.js +0 -30
  225. data/html/js/codepress/languages/text.css +0 -5
  226. data/html/js/codepress/languages/text.js +0 -9
  227. data/html/js/codepress/languages/vbscript.css +0 -71
  228. data/html/js/codepress/languages/vbscript.js +0 -117
  229. data/html/js/codepress/languages/xsl.css +0 -15
  230. data/html/js/codepress/languages/xsl.js +0 -103
  231. data/html/js/codepress/license.txt +0 -458
  232. data/html/js/edit_area/images/Thumbs.db +0 -0
  233. data/test/plugin/test_gem/a/lib/jiji_plugin_test.rb +0 -6
data/lib/jiji/command.rb CHANGED
@@ -116,10 +116,7 @@ module JIJI
116
116
  FileUtils.chmod(0600, "#{dir}/conf/configuration.yaml")
117
117
 
118
118
  # サンプルエージェント
119
- ["agents","shared_lib"].each {|d|
120
- mkdir("#{dir}/#{d}")
121
- FileUtils.copy( Dir.glob(File.expand_path("#{__FILE__}/../../../base/#{d}/*")), "#{dir}/#{d}" )
122
- }
119
+ copy_base_files( dir, h )
123
120
  rescue Exception
124
121
  puts "[ERROR] setting failed.(#{$!.to_s})"
125
122
  return
@@ -144,6 +141,44 @@ module JIJI
144
141
  end
145
142
 
146
143
  private
144
+ #サンプルのエージェント、共有ライブラリをコピーする。
145
+ def copy_base_files( dir, h )
146
+ src_dir = File.expand_path("#{__FILE__}/../../../base/")
147
+ files = []
148
+ ["agents","shared_lib"].each {|d|
149
+ files += Dir.glob(File.expand_path("#{src_dir}/#{d}/**/*")).reject {|i|
150
+ File.directory? i
151
+ }
152
+ }
153
+ overwrite = :yes
154
+ files.each {|f|
155
+ new_path = f.sub( /#{src_dir}/, dir )
156
+ if File.exist?(new_path) && overwrite != :all
157
+ overwrite = ask_overwrite( h, new_path )
158
+ else
159
+ overwrite = overwrite != :all ? :yes : :all
160
+ end
161
+ if overwrite != :no
162
+ mkdir( File.dirname( new_path ) )
163
+ copy( f, new_path )
164
+ end
165
+ }
166
+ end
167
+ #上書きするかどうか確認する。
168
+ def ask_overwrite( h, f )
169
+ result = nil
170
+ while ( !result )
171
+ tmp = h.ask("> File #{f} is already exist. Do you want to overwrite? ([y]es/[n]o/[a]ll files)")
172
+ next if !tmp || tmp.length == 0
173
+ result = case tmp[0,1].downcase
174
+ when "y"; :yes
175
+ when "n"; :no
176
+ when "a"; :all
177
+ end
178
+ end
179
+ result
180
+ end
181
+
147
182
  # データディレクトリを得る
148
183
  def data_dir
149
184
  base = "#{File.expand_path(JIJI_DIR_NAME)}/base"
@@ -154,10 +189,16 @@ module JIJI
154
189
  end
155
190
  # ディレクトリを作る。
156
191
  def mkdir( path )
192
+ return if File.exist? path
157
193
  FileUtils.mkdir_p path
158
194
  FileUtils.chmod(0755, path)
159
195
  puts "create. #{path}"
160
196
  end
161
-
197
+ # ファイルをコピーする。
198
+ def copy( path, to )
199
+ FileUtils.copy( path, to )
200
+ FileUtils.chmod(0644, to)
201
+ puts "create. #{to}"
202
+ end
162
203
  end
163
204
  end
@@ -0,0 +1,158 @@
1
+
2
+ require 'fileutils'
3
+ require 'jiji/error'
4
+
5
+ module JIJI
6
+ module Dao
7
+
8
+ #ファイルシステムにデータを保存するDAO
9
+ class FileSystemDao
10
+
11
+ #コンストラクタ
12
+ #base:: 保存先の基点となるディレクトリ
13
+ def initialize( base )
14
+ @base = base
15
+ end
16
+
17
+ #パスが示すファイルのデータを取得する。
18
+ def get( path )
19
+ path = validate_path( path, :exist, :is_file )
20
+ return FileLock.new(path).readlock {|f|
21
+ f.read
22
+ }
23
+ end
24
+
25
+ #パスが示すフォルダ配下の一覧を取得する。
26
+ def list( path="", recursive=false )
27
+ path = validate_path( path, :exist, :is_directory )
28
+ Dir.glob( "#{path}/#{recursive ? '**/*' : '*' }" ).map {|item|
29
+ next if File.basename(item) =~ /^\..*/
30
+ { :path =>item.sub( /^#{@base}\//, "" ),
31
+ :name =>File.basename(item),
32
+ :update=>File.mtime(item).to_i,
33
+ :type =>File.directory?(item) ? :directory : :file}
34
+ }.sort_by {|item| "#{item[:type]}/#{item[:path]}" }
35
+ end
36
+
37
+ #ファイルを追加する。
38
+ def add( path, body )
39
+ validate_path( path, :exist_parent, :not_exist )
40
+ put( path, body )
41
+ :success
42
+ end
43
+
44
+ #ファイルを追加/更新する。
45
+ def put( path, body )
46
+ path = validate_path( path, :exist_parent, :is_file )
47
+ FileLock.new(path).writelock {|f|
48
+ f << body
49
+ }
50
+ :success
51
+ end
52
+
53
+ #ファイルまたはディレクトリを破棄する
54
+ def delete( path )
55
+ path = validate_path( path, :exist )
56
+ if ( File.file? path )
57
+ FileLock.new(path).writelock {|f|
58
+ FileUtils.rm_rf path
59
+ }
60
+ else
61
+ FileUtils.rm_rf path
62
+ end
63
+ :success
64
+ end
65
+
66
+
67
+ #ファイル/フォルダを移動する
68
+ def move( from, to )
69
+ from = validate_path( from, :exist )
70
+ to = validate_path( to, :exist, :is_directory )
71
+ FileUtils.mv from, to
72
+ :success
73
+ end
74
+
75
+ #ファイル/フォルダをリネームする
76
+ def rename( from, to )
77
+ from = validate_path( from, :exist )
78
+ to = validate_path( to, :not_exist )
79
+ FileUtils.mv from, to
80
+ :success
81
+ end
82
+
83
+ #ファイル/フォルダをコピーする
84
+ def copy( from, to )
85
+ from = validate_path( from, :exist )
86
+ to = validate_path( to )
87
+ FileUtils.cp_r from, to
88
+ :success
89
+ end
90
+
91
+ #フォルダを作成する
92
+ def mkcol(path)
93
+ path = validate_path( path, :exist_parent, :not_exist )
94
+ FileUtils.mkdir_p path
95
+ :success
96
+ end
97
+
98
+ #ディレクトリかどうか評価する。
99
+ def directory?(path)
100
+ path = validate_path( path, :exist )
101
+ File.directory?(path)
102
+ end
103
+
104
+ #データ保存先の基点となるディレクトリ
105
+ attr_reader :base
106
+
107
+ private
108
+ #パスを正規化する
109
+ #steps:: パスを示す文字列
110
+ #return:: 正規化されたパス(baseからの絶対パス)
111
+ def validate_path( path, *options )
112
+ # パスの文字列をチェック。
113
+ steps = path.split( /\/+/ ).map{|str| str.strip }
114
+ steps.each {|step|
115
+ if !step || step.length <= 0 || step.strip.length <= 0
116
+ raise JIJI::UserError.new( JIJI::ERROR_ILLEGAL_NAME, "illegal file or directory name. name=#{step}" )
117
+ end
118
+ unless step =~ VALID_FILE_NAME
119
+ raise JIJI::UserError.new( JIJI::ERROR_ILLEGAL_NAME, "illegal file or directory name. name=#{step}" )
120
+ end
121
+ if step =~ /^\.+$/
122
+ raise JIJI::UserError.new( JIJI::ERROR_ILLEGAL_NAME, "illegal file or directory name. name=#{step}" )
123
+ end
124
+ if step =~ /^\..*/
125
+ raise JIJI::UserError.new( JIJI::ERROR_ILLEGAL_NAME, "illegal file or directory name. name=#{step}" )
126
+ end
127
+ }
128
+ #ファイルパス構築
129
+ file = "#{@base}#{ steps.empty? ? "" : "/" + steps.join( "/" )}"
130
+ parent = File.dirname( file )
131
+
132
+ #オプションのチェック
133
+ op = options.inject({}){|h,o| h[o] = true; h }
134
+ if op.key?(:is_directory) && File.exist?( file )
135
+ unless File.directory?( file )
136
+ raise JIJI::UserError.new( JIJI::ERROR_IS_NOT_FOLDER, "target is not a folder. path=#{file}" )
137
+ end
138
+ end
139
+ if op.key?(:is_file) && File.exist?( file )
140
+ unless File.file?( file )
141
+ raise JIJI::UserError.new( JIJI::ERROR_IS_NOT_FILE, "target is not a file. path=#{file}" )
142
+ end
143
+ end
144
+ if op.key?(:exist) && !File.exist?( file )
145
+ raise JIJI::UserError.new( JIJI::ERROR_NOT_FOUND, "file or directory is not found. path=#{file}" )
146
+ end
147
+ if op.key?(:not_exist) && File.exist?( file )
148
+ raise JIJI::UserError.new( JIJI::ERROR_ALREADY_EXIST, "file or directory is already exist. path=#{file}" )
149
+ end
150
+ if op.key?(:exist_parent) && !( File.exist?( parent ) && File.directory?( parent ))
151
+ raise JIJI::UserError.new( JIJI::ERROR_NOT_FOUND, "directory is not found. directory=#{parent}" )
152
+ end
153
+ return file
154
+ end
155
+ VALID_FILE_NAME = /^[A-Za-z0-9_\+\-\#\'\!\~\(\)\[\]\.\{\}]+$/
156
+ end
157
+ end
158
+ end
@@ -286,6 +286,8 @@ module JIJI
286
286
  end
287
287
  end
288
288
  def flush( time )
289
+ return unless @next #一度もnextが呼ばれていない場合、何もしない
290
+
289
291
  @end = time
290
292
  yield aggregated
291
293
  @start = @next
@@ -116,7 +116,7 @@ module JIJI
116
116
  return BasicTimedData.new( [str] \
117
117
  + [@start.to_i, @end.to_i], @end)
118
118
  ensure
119
- @values.clear
119
+ @values.clear if @values
120
120
  end
121
121
  end
122
122
  attr_reader :values
data/lib/jiji/error.rb CHANGED
@@ -1,29 +1,45 @@
1
1
 
2
2
  module JIJI
3
- # 致命的エラー
4
- class FatalError < StandardError
5
- def initialize( code, message="" )
3
+
4
+ class AbstractError < StandardError
5
+ def initialize( code, message="", info={} )
6
6
  super( message )
7
7
  @code = code
8
+ @info = info
9
+ end
10
+ def detail
11
+ {"code"=>@code,"info"=>@info}
8
12
  end
9
13
  attr :code
14
+ attr :info, true
15
+ end
16
+
17
+ # 致命的エラー
18
+ class FatalError < AbstractError
19
+ def initialize( code, message="", info={} )
20
+ super
21
+ end
10
22
  end
11
23
  # ユーザー操作により発生しうるエラー
12
- class UserError < StandardError
13
- def initialize( code, message="" )
14
- super( message )
15
- @code = code
24
+ class UserError < AbstractError
25
+ def initialize( code, message="", info={} )
26
+ super
16
27
  end
17
- attr :code
18
28
  end
19
29
 
20
30
  # エラーコード:存在しない
21
31
  ERROR_NOT_FOUND = "not_found"
22
32
  # エラーコード:すでに存在する
23
33
  ERROR_ALREADY_EXIST = "already_exist"
34
+ # エラーコード:ファイルでない
35
+ ERROR_IS_NOT_FILE = "is_not_file"
36
+ # エラーコード:フォルダでない
37
+ ERROR_IS_NOT_FOLDER = "is_not_folder"
24
38
 
25
39
  # エラーコード:不正な名前
26
40
  ERROR_ILLEGAL_NAME = "illegal_name"
41
+ # エラーコード:不正な引数
42
+ ERROR_ILLEGAL_ARGUMENTS = "illegal_arguments"
27
43
 
28
44
  # エラーコード:想定外エラー
29
45
  ERROR_FATAL = "fatal"
@@ -0,0 +1,67 @@
1
+
2
+ require 'fileutils'
3
+ require 'yaml'
4
+ require 'jiji/util/fix_yaml_bug'
5
+ require 'jiji/util/file_lock'
6
+ require 'jiji/process'
7
+ require 'kconv'
8
+
9
+ module JIJI
10
+ module Migration
11
+
12
+ #===1.1.3 → 1.2.0
13
+ class Migrator1_2_0
14
+ def migrate( registry )
15
+ logger = registry.server_logger
16
+
17
+ #出力の保存先を置換
18
+ Dir.glob("#{registry.process_dir}/*") {|d|
19
+
20
+ logger.info "convert : #{d}"
21
+ process_id = File.basename(d)
22
+ process_info = {}
23
+ begin
24
+ file = "#{d}/#{JIJI::ProcessInfo::PROPERTY_FILE}"
25
+ process_info = YAML.load_file(file) if File.exist?(file)
26
+ rescue Exception
27
+ logger.error $!
28
+ end
29
+
30
+ begin
31
+ # 出力データを列挙
32
+ Dir.glob("#{d}/out/*").map.each {|out_dir|
33
+ convert_out_dir( out_dir, process_info, logger )
34
+ }
35
+ rescue Exception
36
+ logger.error $!
37
+ end
38
+ }
39
+ end
40
+
41
+ #各出力ディリクトリデータのリネーム
42
+ def convert_out_dir( out_dir, info, logger )
43
+ begin
44
+ agent_id = JIJI::Util.decode( File.basename(out_dir))
45
+ agent_name = resolve_name( info, agent_id )
46
+ FileLock.new( "#{out_dir}/#{JIJI::Output::PROPERTIES_FILE_NAME}" ).writelock { |f|
47
+ f.write( YAML.dump({:agent_name=>agent_name}) )
48
+ }
49
+ FileUtils.mv out_dir, "#{File.dirname(out_dir)}/#{agent_id}"
50
+ rescue Exception
51
+ logger.error $!
52
+ end
53
+ end
54
+ #エージェント名を解決する
55
+ def resolve_name( process_info, agent_id )
56
+ if ( process_info["agents"] )
57
+ item = process_info["agents"].find {|i| i["id"] == agent_id }
58
+ return item["name"] if item
59
+ end
60
+ return "不明"
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+ end
67
+
data/lib/jiji/models.rb CHANGED
@@ -4,12 +4,23 @@ require "jiji/dao/timed_data_dao"
4
4
 
5
5
  module JIJI
6
6
 
7
- #==レートの集合
7
+ #===レートの集合
8
+ #通貨ペアコード(:EURJPYのようなシンボル)をキーとしてJIJI::Rateを保持します。
9
+ #
10
+ # rates = <省略>
11
+ #
12
+ # #EURJPYのレートを取得。
13
+ # rate = rates[:EURJPY] #=> JIJI::Rate
14
+ #
15
+ # #bidレート,askレートを取得
16
+ # p rate.bid
17
+ # p rate.ask
18
+ #
8
19
  class Rates < Hash
9
20
 
10
21
  include JIJI::Util::Model
11
22
 
12
- def initialize( pair_infos, list, time=Time.now )
23
+ def initialize( pair_infos, list, time=Time.now ) #:nodoc:
13
24
  super()
14
25
  @pair_infos = pair_infos
15
26
  @time = time
@@ -30,7 +41,7 @@ module JIJI
30
41
  include JIJI::Util::Model
31
42
  include JIJI::Dao::TimedData
32
43
 
33
- def initialize( bid=nil, ask=nil, sell_swap=nil, buy_swap=nil, time=nil )
44
+ def initialize( bid=nil, ask=nil, sell_swap=nil, buy_swap=nil, time=nil ) #:nodoc:
34
45
  @bid = bid
35
46
  @ask = ask
36
47
  @sell_swap = sell_swap
@@ -38,31 +49,54 @@ module JIJI
38
49
  @time = time
39
50
  end
40
51
  # 値を配列で取得する
41
- def values
52
+ def values #:nodoc:
42
53
  [bid,ask,sell_swap,buy_swap,time.to_i]
43
54
  end
44
55
  # 値を配列で設定する
45
- def values=(values)
56
+ def values=(values) #:nodoc:
46
57
  @bid = values[0].to_f
47
58
  @ask = values[1].to_f
48
59
  @sell_swap = values[2].to_f
49
60
  @buy_swap = values[3].to_f
50
61
  end
51
- attr_reader :bid, :ask, :sell_swap, :buy_swap
62
+ #bidレート
63
+ attr_reader :bid
64
+ #askレート
65
+ attr_reader :ask
66
+ #売りスワップ
67
+ attr_reader :sell_swap
68
+ #買いスワップ
69
+ attr_reader :buy_swap
52
70
  end
53
71
 
54
- #==一定期間のレートの集合
72
+ #===一定期間のレートの集合
73
+ #通貨ペアコード(:EURJPYのようなシンボル)をキーとしてJIJI::PeriodicallyRateを保持します。
74
+ #
75
+ # rates = <省略>
76
+ #
77
+ # #EURJPYのレートを取得。
78
+ # rate = rates[:EURJPY] #=> JIJI::PeriodicallyRate
79
+ #
80
+ # #bidレートの高値、安値を取得
81
+ # bid = rate.bid
82
+ # p bid.max
83
+ # p bid.min
84
+ #
55
85
  class PeriodicallyRates < Hash
56
86
 
57
87
  include JIJI::Util::Model
58
-
59
- def initialize( pair_infos, list=[] )
88
+ #====コンストラクタ
89
+ #pair_infos:: 通貨ペアの情報
90
+ #list:: 初期データ
91
+ def initialize( pair_infos, list=[] ) #:nodoc:
60
92
  super()
61
93
  @pair_infos = pair_infos
62
94
  list.each {|rates|
63
95
  self << rates
64
96
  }
65
97
  end
98
+ #====JIJI::Ratesを追加し各値の四本値を再計算します。
99
+ #rates:: JIJI::Rates
66
100
  def <<(rates)
67
101
  now = rates.time
68
102
  @start_time = now unless @start_time
@@ -72,22 +106,27 @@ module JIJI
72
106
  self[code] << rate
73
107
  }
74
108
  end
75
- def time
109
+ def time #:nodoc:
76
110
  @start_time
77
111
  end
112
+ #通貨ペアの情報(取引数量など)
78
113
  attr_reader :pair_infos
114
+ #集計開始日時
79
115
  attr :start_time, true
116
+ #集計終了日時
80
117
  attr :end_time, true
81
118
  end
82
119
 
83
- #==一定期間のレート
84
- #bid,ask,sell_swap,buy_swapは四本値(JIJI::PeriodicallyValue)で保持される。
120
+ #===一定期間のレート
121
+ #bid,ask,sell_swap,buy_swapの各値が四本値(JIJI::PeriodicallyValue)で保持されます。
85
122
  class PeriodicallyRate
86
123
 
87
124
  include JIJI::Util::Model
88
125
  include JIJI::Dao::TimedData
89
-
90
- def initialize( list=[] )
126
+
127
+ #====コンストラクタ
128
+ #list:: 初期データ
129
+ def initialize( list=[] ) #:nodoc:
91
130
  @bid = PeriodicallyValue.new
92
131
  @ask = PeriodicallyValue.new
93
132
  @sell_swap = PeriodicallyValue.new
@@ -96,7 +135,9 @@ module JIJI
96
135
  self << item
97
136
  }
98
137
  end
99
- def <<( rate )
138
+ #====JIJI::Rateを追加し各値の四本値を再計算します。
139
+ #rate:: JIJI::Rate
140
+ def <<( rate ) #:nodoc:
100
141
  @bid << rate.bid
101
142
  @ask << rate.ask
102
143
  @sell_swap << rate.sell_swap
@@ -105,12 +146,12 @@ module JIJI
105
146
  @end_time = rate.time
106
147
  end
107
148
  # 値を配列で取得する
108
- def values
149
+ def values #:nodoc:
109
150
  bid.values + ask.values + sell_swap.values + buy_swap.values \
110
151
  + [@start_time.to_i, @end_time.to_i]
111
152
  end
112
153
  # 値を配列で設定する
113
- def values=(values)
154
+ def values=(values) #:nodoc:
114
155
  @bid.values = values[0..3]
115
156
  @ask.values = values[4..7]
116
157
  @sell_swap.values = values[8..11]
@@ -118,28 +159,41 @@ module JIJI
118
159
  @start_time = Time.at(values[16].to_i)
119
160
  @end_time = Time.at(values[17].to_i)
120
161
  end
121
- def time
162
+ def time #:nodoc:
122
163
  @end_time
123
164
  end
124
- def time=(t)
165
+ def time=(t) #:nodoc:
125
166
  @end_time = t
126
167
  end
127
- attr_reader :bid, :ask, :sell_swap, :buy_swap
168
+ #bidレート
169
+ attr_reader :bid
170
+ #askレート
171
+ attr_reader :ask
172
+ #売りスワップ
173
+ attr_reader :sell_swap
174
+ #買いスワップ
175
+ attr_reader :buy_swap
176
+ #集計開始日時
128
177
  attr :start_time, true
178
+ #集計終了日時
129
179
  attr :end_time, true
130
180
  end
131
181
 
132
- #==一定期間の値
182
+ #===一定期間の値
133
183
  #始値、終値、高値、安値の四本値
134
184
  class PeriodicallyValue
135
185
 
136
186
  include JIJI::Util::Model
137
-
187
+
188
+ #====コンストラクタ
189
+ #list:: 初期データ
138
190
  def initialize( list=[] )
139
191
  list.each { |item|
140
192
  self << item
141
193
  }
142
194
  end
195
+ #====値を追加し四本値を再計算します。
196
+ #value:: 値
143
197
  def <<( value )
144
198
  @start = value if @start == nil
145
199
  @end = value
@@ -147,19 +201,23 @@ module JIJI
147
201
  @min = value if @min == nil || value < @min
148
202
  end
149
203
  # 値を配列で取得する
150
- def values
204
+ def values #:nodoc:
151
205
  [@start, @end, @max, @min]
152
206
  end
153
207
  # 値を配列で設定する
154
- def values=(values)
208
+ def values=(values) #:nodoc:
155
209
  @start = values[0].to_f
156
210
  @end = values[1].to_f
157
211
  @max = values[2].to_f
158
212
  @min = values[3].to_f
159
213
  end
214
+ #始値
160
215
  attr :start
216
+ #終値
161
217
  attr :end
218
+ #高値
162
219
  attr :max
220
+ #安値
163
221
  attr :min
164
222
  end
165
223
  end