tengine_job 0.6.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +23 -0
  4. data/Gemfile.lock +109 -0
  5. data/README.rdoc +20 -0
  6. data/Rakefile +42 -0
  7. data/VERSION +1 -0
  8. data/examples/0004_retry_one_layer.rb +24 -0
  9. data/examples/0004_retry_one_layer.sh +38 -0
  10. data/examples/0005_retry_two_layer.rb +54 -0
  11. data/examples/0005_retry_two_layer.sh +80 -0
  12. data/examples/0006_retry_three_layer.rb +58 -0
  13. data/examples/0006_retry_three_layer.sh +74 -0
  14. data/examples/0007_simple_jobnet.rb +7 -0
  15. data/examples/0021_dynamic_env.rb +20 -0
  16. data/examples/VERSION +1 -0
  17. data/examples/tengine_job_test.sh +10 -0
  18. data/lib/tengine/job.rb +94 -0
  19. data/lib/tengine/job/category.rb +54 -0
  20. data/lib/tengine/job/connectable.rb +43 -0
  21. data/lib/tengine/job/drivers/job_control_driver.rb +82 -0
  22. data/lib/tengine/job/drivers/job_execution_driver.rb +30 -0
  23. data/lib/tengine/job/drivers/jobnet_control_driver.rb +117 -0
  24. data/lib/tengine/job/drivers/schedule_driver.rb +30 -0
  25. data/lib/tengine/job/dsl_binder.rb +12 -0
  26. data/lib/tengine/job/dsl_evaluator.rb +18 -0
  27. data/lib/tengine/job/dsl_loader.rb +180 -0
  28. data/lib/tengine/job/edge.rb +150 -0
  29. data/lib/tengine/job/element_selector_notation.rb +169 -0
  30. data/lib/tengine/job/end.rb +32 -0
  31. data/lib/tengine/job/executable.rb +74 -0
  32. data/lib/tengine/job/execution.rb +141 -0
  33. data/lib/tengine/job/expansion.rb +37 -0
  34. data/lib/tengine/job/fork.rb +6 -0
  35. data/lib/tengine/job/job.rb +23 -0
  36. data/lib/tengine/job/jobnet.rb +173 -0
  37. data/lib/tengine/job/jobnet/builder.rb +150 -0
  38. data/lib/tengine/job/jobnet/job_state_transition.rb +167 -0
  39. data/lib/tengine/job/jobnet/jobnet_state_transition.rb +110 -0
  40. data/lib/tengine/job/jobnet/state_transition.rb +37 -0
  41. data/lib/tengine/job/jobnet_actual.rb +55 -0
  42. data/lib/tengine/job/jobnet_template.rb +10 -0
  43. data/lib/tengine/job/join.rb +6 -0
  44. data/lib/tengine/job/junction.rb +29 -0
  45. data/lib/tengine/job/killing.rb +30 -0
  46. data/lib/tengine/job/mm_compatibility.rb +6 -0
  47. data/lib/tengine/job/mm_compatibility/connectable.rb +13 -0
  48. data/lib/tengine/job/name_path.rb +31 -0
  49. data/lib/tengine/job/root.rb +16 -0
  50. data/lib/tengine/job/root_jobnet_actual.rb +39 -0
  51. data/lib/tengine/job/root_jobnet_template.rb +49 -0
  52. data/lib/tengine/job/script_executable.rb +235 -0
  53. data/lib/tengine/job/signal.rb +121 -0
  54. data/lib/tengine/job/start.rb +20 -0
  55. data/lib/tengine/job/stoppable.rb +15 -0
  56. data/lib/tengine/job/vertex.rb +172 -0
  57. data/lib/tengine_job.rb +3 -0
  58. data/spec/fixtures/rjn_0001_simple_jobnet_builder.rb +42 -0
  59. data/spec/fixtures/rjn_0002_simple_parallel_jobnet_builder.rb +42 -0
  60. data/spec/fixtures/rjn_0003_fork_join_jobnet_builder.rb +61 -0
  61. data/spec/fixtures/rjn_0004_parallel_jobnet_with_finally_fixture.rb +62 -0
  62. data/spec/fixtures/rjn_0005_retry_two_layer_fixture.rb +153 -0
  63. data/spec/fixtures/rjn_0008_expansion_fixture.rb +32 -0
  64. data/spec/fixtures/rjn_0009_tree_sequential_jobnet_builder.rb +174 -0
  65. data/spec/fixtures/rjn_0010_2jobs_and_1job_parallel_jobnet_builder.rb +39 -0
  66. data/spec/fixtures/rjn_0011_nested_fork_jobnet_builder.rb +96 -0
  67. data/spec/fixtures/rjn_0012_nested_and_finally_builder.rb +157 -0
  68. data/spec/fixtures/rjn_1004_hadoop_job_in_jobnet_fixture.rb +105 -0
  69. data/spec/fixtures/rjn_means_root_jobnet +0 -0
  70. data/spec/fixtures/test_credential_fixture.rb +12 -0
  71. data/spec/fixtures/test_server_fixture.rb +28 -0
  72. data/spec/mongoid.yml +35 -0
  73. data/spec/spec_helper.rb +56 -0
  74. data/spec/sshd/.gitignore +1 -0
  75. data/spec/sshd/id_rsa +51 -0
  76. data/spec/sshd/id_rsa.pub +1 -0
  77. data/spec/sshd/ssh_host_rsa_key +51 -0
  78. data/spec/sshd/ssh_host_rsa_key.pub +1 -0
  79. data/spec/sshd/sshd_config +10 -0
  80. data/spec/sshd/sshd_config.erb +11 -0
  81. data/spec/sshd/tengine_job_test.sh +6 -0
  82. data/spec/support/jobnet_fixture_builder.rb +145 -0
  83. data/spec/support/mongo_index_key_log.rb +91 -0
  84. data/spec/tengine/job/category_spec.rb +193 -0
  85. data/spec/tengine/job/connectable_spec.rb +94 -0
  86. data/spec/tengine/job/drivers/job_controll_driver/connection_error_spec.rb +236 -0
  87. data/spec/tengine/job/drivers/job_controll_driver/duplicated_job_start_spec.rb +302 -0
  88. data/spec/tengine/job/drivers/job_controll_driver/expansion_spec.rb +120 -0
  89. data/spec/tengine/job/drivers/job_controll_driver/stop_spec.rb +159 -0
  90. data/spec/tengine/job/drivers/job_controll_driver_spec.rb +623 -0
  91. data/spec/tengine/job/drivers/job_execution_driver_spec.rb +88 -0
  92. data/spec/tengine/job/drivers/jobnet_control_driver/nested_and_finally_spec.rb +472 -0
  93. data/spec/tengine/job/drivers/jobnet_control_driver/nested_jobnet_spec.rb +231 -0
  94. data/spec/tengine/job/drivers/jobnet_control_driver/stop_jobnet_spec.rb +202 -0
  95. data/spec/tengine/job/drivers/jobnet_control_driver_spec.rb +446 -0
  96. data/spec/tengine/job/drivers/schedule_driver_spec.rb +202 -0
  97. data/spec/tengine/job/dsl_binder_spec.rb +36 -0
  98. data/spec/tengine/job/dsl_loader_spec.rb +403 -0
  99. data/spec/tengine/job/dsls/0013_hadoop_job_run.rb +29 -0
  100. data/spec/tengine/job/dsls/0014_join_and_join.rb +19 -0
  101. data/spec/tengine/job/dsls/0015_fork_and_fork.rb +18 -0
  102. data/spec/tengine/job/dsls/0016_complex_fork_and_join.rb +20 -0
  103. data/spec/tengine/job/dsls/0017_finally.rb +15 -0
  104. data/spec/tengine/job/dsls/0018_expansion.rb +23 -0
  105. data/spec/tengine/job/dsls/0019_execute_job_on_event.rb +16 -0
  106. data/spec/tengine/job/dsls/0020_duplicated_jobnet_name.rb +16 -0
  107. data/spec/tengine/job/dsls/1060_test_dir1/1060_test_dir2/0013_hadoop_job_run.rb +29 -0
  108. data/spec/tengine/job/dsls/2003_expansion/expansion_5.rb +11 -0
  109. data/spec/tengine/job/dsls/VERSION +1 -0
  110. data/spec/tengine/job/dynamic_env_spec.rb +95 -0
  111. data/spec/tengine/job/edge_spec.rb +241 -0
  112. data/spec/tengine/job/element_selector_notation_spec.rb +354 -0
  113. data/spec/tengine/job/examples_spec.rb +62 -0
  114. data/spec/tengine/job/execution_spec.rb +100 -0
  115. data/spec/tengine/job/expansion_spec.rb +116 -0
  116. data/spec/tengine/job/hadoop_job_run_spec.rb +65 -0
  117. data/spec/tengine/job/job_spec.rb +4 -0
  118. data/spec/tengine/job/jobnet/1015_complecated_jobnet_spec.rb +72 -0
  119. data/spec/tengine/job/jobnet_actual_spec.rb +175 -0
  120. data/spec/tengine/job/jobnet_spec.rb +399 -0
  121. data/spec/tengine/job/jobnet_template_spec.rb +240 -0
  122. data/spec/tengine/job/killing_spec.rb +91 -0
  123. data/spec/tengine/job/reset_spec.rb +958 -0
  124. data/spec/tengine/job/reset_spec/4056_1_dump.txt +1 -0
  125. data/spec/tengine/job/root_jobnet_actual_spec.rb +89 -0
  126. data/spec/tengine/job/root_jobnet_template_spec.rb +248 -0
  127. data/spec/tengine/job/script_executable_spec.rb +132 -0
  128. data/spec/tengine/job/stoppable_spec.rb +176 -0
  129. data/spec/tengine/job/vertex_spec.rb +25 -0
  130. data/spec/tengine_job_spec.rb +4 -0
  131. data/tengine_job.gemspec +197 -0
  132. data/tmp/log/.gitignore +1 -0
  133. metadata +296 -0
@@ -0,0 +1 @@
1
+ /sshd.pid
data/spec/sshd/id_rsa ADDED
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEA4f7DPhFU/rWePj9PIAiHArgBVXq+g1fWYjtQj2CldoMn+lL4TU5J8rNRYBc5NaG4G8iyEn5iHMBIH4BFod5Nhs6XCdlMfhps3ndX8Md71OcwTacVucoXaEO3i6mN6an6KfDCjIBHLORfRuLWt33E+0220gRT7NIgads5bV7P9/1uUsliaDFMH36+NTDZI4IYFmtLrIo9c0UD2FDRNaZLlh/ANsrRxbZkQs/yOkOP7/XCSi7ED1UenBj3TKrk2NfDKTlga1Vj3+24dSqkM3uWd2MzVCM3Umm+pxFvpf/hgtD4TZFgbaUEblaU2v2RRaxrItNV1dtw17DSHWBfIlXNpWGcHmt1lbEKH5zFiZSp9Vf9o+AyUVPUjI05kmyw+90eYfUeNrkJB7KMyhwaWLk4R6/Fmz103NvaCSnxgp6U3M/mIblbCz+lKOdTALWBzGV8UsTO6XWwHY8vRZyeibXVBYNgPBXb1YRnqFufl0z+j7lXrsPIwYxHEf55PC6xpCIpyrFUiYBeJR8Y6CvGZYBAfVCaU5EI0yIRavyJAOaTOg3nPYxRciQd55YJ+8ddUxTNiC8KnlQXmW2ljREWRgifa1co6Ip50xECj7jALKnpCb7v4PtLqjY+cXm8K8EQsBfBwDjeolZO1Ka0Q+0Rnpz+c+Yj0VrejzkrbAT3yA34C3c= tengine job test sshd client rsa key
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEA1VmHE0WvJgj82+ltiOXtJ86yf8HHUHq1agt/PXl8/E0Ayl69VXft0p0837oxjlQNZZxPV+Zf/gI1X5NyB/x0+Kn4T/CJ1ubMQ8COpX7J3h/uA/DBljjWizLkh4x5WqztQ7HIEgt2zKDV+qaiJOO7l8IYnIT7Iq7ArFUyms+nAHuc/VzOFErUD0njHjfiVLq9fzJuvjaIMHV0tX3tXlA6mv7LAz1qphxaiKj50OGXpSXDQrTLEYQW+5/WruXhQ3gj46IcgVaBeKMD/D6dO4vg81Z0kbgylJvnXZBqugqnLXzOJmz0tMfJx6ZjGDJ5EHl2mUEQmPoeOKy6Xsni2T2TFiAQebSLjhRyDdDPKiSUx5sNo76qPKSpBJJOAfeDV288K9mo7KdZ+fHoyoy77HPgUnXUcpig5KdKpfaYxFL2f6gHZKk30s+6y3Iwz3WmZ3R7iCkQwjc2x9xcbTRBjFuYuMFTyX3Qo5Yg2h8RBTgz9O8LaCdb0girct8BIbZUA0SL8pQZg7xTQNL6isDbOMHo34L1NpljgidVnZflPLQ5iyGPsLMcnai4DM37ORNbkSOPHcefoRfJNFWyryrzpiVh6u/cIw4UYRnAbq6yBwhIFNoJkAwXSaZyNdVEKhCXIdSvXh2hH9g+2zEREppCRaoPWLG8jjYUzUWiJMfRVxFYNK8= tengine job test sshd host rsa key
@@ -0,0 +1,10 @@
1
+ Port 1234
2
+ AddressFamily any
3
+ Protocol 2
4
+
5
+ PermitRootLogin no
6
+ StrictModes yes
7
+ PubkeyAuthentication yes
8
+ PasswordAuthentication no
9
+ PermitEmptyPasswords no
10
+ AuthorizedKeysFile /Users/shyouhei/data/src/tengine/tengine_job/spec/sshd/id_rsa.pub
@@ -0,0 +1,11 @@
1
+ Port <%= @port %>
2
+ AddressFamily any
3
+ Protocol 2
4
+
5
+ PermitRootLogin no
6
+ StrictModes yes
7
+ PubkeyAuthentication yes
8
+ PasswordAuthentication no
9
+ PermitEmptyPasswords no
10
+ AuthorizedKeysFile <%= File.expand_path("id_rsa.pub", ssh_dir) %>
11
+ PidFile <%= File.expand_path("sshd.pid", ssh_dir) %>
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ typeset -i time=$1
3
+ export LOGFILE=tengine_job_test.log
4
+ echo "`date` tengine_job_test $2 start" >> $LOGFILE
5
+ sleep `expr 1 + $time`
6
+ echo "`date` tengine_job_test $2 finish" >> $LOGFILE
@@ -0,0 +1,145 @@
1
+ class JobnetFixtureBuilder
2
+ def initialize
3
+ reset
4
+ end
5
+
6
+ def reset
7
+ @instances = {}
8
+ @start_count = 0
9
+ @end_count = 0
10
+ @fork_count = 0
11
+ @join_count = 0
12
+ @edge_count = 0
13
+ end
14
+
15
+
16
+ def [](instance_name)
17
+ @instances[instance_name.to_sym]
18
+ end
19
+
20
+ def []=(instance_name, instance)
21
+ @instances[instance_name.to_sym] = instance
22
+ end
23
+
24
+ def create_template(options = {})
25
+ reset
26
+ @mode = :template
27
+ create(options)
28
+ end
29
+
30
+ def create_actual(options = {})
31
+ template = create_template
32
+ reset
33
+ @mode = :actual
34
+ options = (options || {}).update(:template => template)
35
+ create(options)
36
+ end
37
+
38
+ def context
39
+ self
40
+ end
41
+
42
+ def vertex(vertex_name)
43
+ cached = self[vertex_name.to_sym]
44
+ raise ArgumentError, "no vertex found for #{vertex_name.inspect}" unless cached
45
+ self[:root].vertex(cached.id)
46
+ end
47
+
48
+ def edge(edge_name)
49
+ cached = self[edge_name.to_sym]
50
+ raise ArgumentError, "no edge found for #{edge_name.inspect}" unless cached
51
+ self[:root].edge(cached.id)
52
+ end
53
+
54
+ def create(options = {})
55
+ raise NotImplementedError, "You must use inherited class of FixtureBuilder"
56
+ end
57
+
58
+ MODE_AND_METHOD_TO_CLASS = {
59
+ [:template, :root_jobnet] => Tengine::Job::RootJobnetTemplate,
60
+ [:actual , :root_jobnet] => Tengine::Job::RootJobnetActual ,
61
+ [:template, :jobnet ] => Tengine::Job::JobnetTemplate ,
62
+ [:actual , :jobnet ] => Tengine::Job::JobnetActual ,
63
+ [:template, :script ] => Tengine::Job::JobnetTemplate ,
64
+ [:actual , :script ] => Tengine::Job::JobnetActual ,
65
+ [:template, :finally ] => Tengine::Job::JobnetTemplate ,
66
+ [:actual , :finally ] => Tengine::Job::JobnetActual ,
67
+ }.freeze
68
+
69
+ %w[root_jobnet jobnet script].each do |method_name|
70
+ root_assign = method_name =~ /^root_/ ? "@instances[:root] = result" : ""
71
+
72
+ class_eval(<<-EOS)
73
+ def new_#{method_name}(name, attrs = {}, &block)
74
+ attrs[:name] = name.to_s
75
+ klass = MODE_AND_METHOD_TO_CLASS[ [@mode, :#{method_name}] ]
76
+ if klass == Tengine::Job::RootJobnetTemplate
77
+ attrs[:dsl_version] ||= Tengine::Core::Setting.dsl_version
78
+ end
79
+ result = klass.new(attrs, &block)
80
+ @instances[name.to_sym] = result
81
+ #{root_assign}
82
+ result
83
+ end
84
+ EOS
85
+ end
86
+
87
+ def new_finally
88
+ klass = MODE_AND_METHOD_TO_CLASS[ [@mode, :finally] ]
89
+ result = klass.new(:name => "finally", :jobnet_type_key => :finally)
90
+ result
91
+ end
92
+
93
+ def new_expansion(name, attrs = {}, &block)
94
+ raise "expansion can be used only as template" unless @mode == :template
95
+ result = Tengine::Job::Expansion.new({:name => name}.update(attrs || {}))
96
+ @instances[name.to_sym] = result
97
+ result
98
+ end
99
+
100
+
101
+ ABBREVIATES = {
102
+ 'start' => 'S',
103
+ 'end' => 'E',
104
+ 'fork' => 'F',
105
+ 'join' => 'J',
106
+ }.freeze
107
+
108
+ %w[start end fork join].each do |method_name|
109
+ class_eval(<<-EOS)
110
+ def new_#{method_name}(attrs = {}, &block)
111
+ klass = Tengine::Job::#{method_name.camelcase}
112
+ result = klass.new(attrs, &block)
113
+ register_#{method_name}(result)
114
+ end
115
+
116
+ def register_#{method_name}(result)
117
+ @#{method_name}_count += 1
118
+ name = ABBREVIATES["#{method_name}"] + @#{method_name}_count.to_s
119
+ @instances[name.to_sym] = result
120
+ result
121
+ end
122
+ EOS
123
+ end
124
+
125
+ def new_edge(origin, dest)
126
+ origin_vertex = origin.is_a?(Symbol) ? self[origin] : origin
127
+ dest_vertex = dest .is_a?(Symbol) ? self[dest ] : dest
128
+ raise "no origin vertex found: #{origin.inspect}" unless origin_vertex
129
+ raise "no dest vertex found: #{dest.inspect }" unless dest_vertex
130
+ result = Tengine::Job::Edge.new(:origin_id => origin_vertex.id, :destination_id => dest_vertex.id)
131
+ remember_edge(result)
132
+ end
133
+
134
+ def remember_edge(edge)
135
+ @edge_count += 1
136
+ name = "e#{@edge_count}"
137
+ @instances[name.to_sym] = edge
138
+ edge
139
+ end
140
+
141
+ def check_edge_count(expected)
142
+ raise "edge count error: expected #{expected} but #{@edge_count}" unless @edge_count == expected
143
+ end
144
+
145
+ end
@@ -0,0 +1,91 @@
1
+ # -*- coding: utf-8 -*-
2
+ # 使い方
3
+ # テスト実行時に 環境変数MONGO_INDEX_KEY_LOGにログの出力先のファイル名を指定しておくと、
4
+ # そこにmongoに対してどんな検索条件やソート、ヒントなどをどのように指定しているのかを出力できます
5
+ #
6
+ # この出力された結果のファイルに対して sort と uniq をかけることにより、どんなインデックスを
7
+ # 作れば良いのか判断する材料となります。
8
+ #
9
+ # export MONGO_INDEX_KEY_LOG=$HOME/tmp/mongo_index_key.log
10
+ # cd tenigne_core && rake spec
11
+ # cd tenigne_resource && rake spec
12
+ # cd tenigne_job && rake spec
13
+ # cd tenigne_console && rake spec
14
+ # cd $HOME/tmp
15
+ # cat mongo_index_key.log | sort | uniq > mongo_index_key_summary.log
16
+ #
17
+ # これで $HOME/tmp/mongo_index_key_summary.log にどのようなキーが使われているのかがまとめられます
18
+ #
19
+ if ENV['MONGO_INDEX_KEY_LOG']
20
+ file_path = File.expand_path(ENV['MONGO_INDEX_KEY_LOG'])
21
+ STDOUT.puts("MONGO_INDEX_KEY_LOG enable logging key infomation for index to #{file_path}")
22
+
23
+ Mongo::Collection.class_eval do
24
+ def index_key_log_file
25
+ unless defined?(@@index_key_log_file)
26
+ file_path = File.expand_path(ENV['MONGO_INDEX_KEY_LOG'])
27
+ @@index_key_log_file = File.open(file_path, "a")
28
+ end
29
+ @@index_key_log_file
30
+ end
31
+
32
+ def find_with_index_key_log(selector={}, opts={}, &block)
33
+ result = find_without_index_key_log(selector, opts, &block)
34
+ index_key_log_file.puts("#{self.name}.find({#{_hash_keys_(selector)}}, {#{_hash_keys_(opts.dup)}}): #{_explain_summary_(result.explain)}")
35
+ result
36
+ end
37
+ alias_method :find_without_index_key_log, :find
38
+ alias_method :find, :find_with_index_key_log
39
+
40
+
41
+ def find_and_modify_with_index_key_log(opts={}, &block)
42
+ o = opts.dup
43
+ query = o.delete(:query)
44
+ index_key_log_file.puts("#{self.name}.find_and_modify({#{_hash_keys_(query)}}, {#{_hash_keys_(o)}})")
45
+ find_and_modify_without_index_key_log(opts, &block)
46
+ end
47
+ alias_method :find_and_modify_without_index_key_log, :find_and_modify
48
+ alias_method :find_and_modify, :find_and_modify_with_index_key_log
49
+
50
+ def _hash_keys_(hash)
51
+ res = []
52
+ [:sort, :hint, :limit].each do |key|
53
+ if value = hash.delete(key)
54
+ res << "#{key.inspect} => #{value.inspect}"
55
+ end
56
+ end
57
+ res += hash.keys.map(&:inspect)
58
+ res.join(',')
59
+ end
60
+
61
+ def _explain_summary_(hash)
62
+ case cursor = hash['cursor']
63
+ when /^BtreeCursor/ then
64
+ res = []
65
+ %w[cursor].each do |key|
66
+ if value = hash.delete(key)
67
+ res << "#{key.inspect} => #{value.inspect}"
68
+ end
69
+ end
70
+ res += hash.keys.map(&:inspect)
71
+ "{" << res.join(',') << "}"
72
+ else
73
+ res = []
74
+ res << "'cursor' => #{hash.delete('cursor').inspect}"
75
+ {"nscanned" => 1, "nscannedObjects" => 1, "n" => 1, "millis" => 0, "nYields"=>0, "nChunkSkips"=>0 }.each do |key, border|
76
+ if value = hash.delete(key)
77
+ if value > border
78
+ res << "#{key.inspect} => '>#{border.inspect}'"
79
+ else
80
+ res << "#{key.inspect} => #{value.inspect}"
81
+ end
82
+ end
83
+ end
84
+ res += hash.keys.map(&:inspect)
85
+ "{" << res.join(',') << "}"
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ end
@@ -0,0 +1,193 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+ require 'tmpdir'
4
+ require 'fileutils'
5
+
6
+ describe Tengine::Job::Category do
7
+
8
+ describe :update_for do
9
+
10
+ context "RootJobnetTemplateのdsl_filepathからCategoryを登録します" do
11
+
12
+ before do
13
+ Tengine::Job::Vertex.delete_all
14
+ Tengine::Job::Category.delete_all
15
+ @root1 = Tengine::Job::RootJobnetTemplate.create!({
16
+ :name => "root_jobnet_template01",
17
+ :dsl_filepath => "foo/bar1/jobnet01.rb",
18
+ :dsl_lineno => 4,
19
+ :dsl_version => "1"
20
+ })
21
+ @root2 = Tengine::Job::RootJobnetTemplate.create!({
22
+ :name => "root_jobnet_template01",
23
+ :dsl_filepath => "foo/bar2/jobnet01.rb",
24
+ :dsl_lineno => 4,
25
+ :dsl_version => "2"
26
+ })
27
+ @root3 = Tengine::Job::RootJobnetTemplate.create!({
28
+ :name => "root_jobnet_template01",
29
+ :dsl_filepath => "foo/bar3/jobnet2.rb",
30
+ :dsl_lineno => 4,
31
+ :dsl_version => "2"
32
+ })
33
+ @root4 = Tengine::Job::RootJobnetTemplate.create!({
34
+ :name => "root_jobnet_template04",
35
+ :dsl_filepath => "jobnet4.rb",
36
+ :dsl_lineno => 4,
37
+ :dsl_version => "2"
38
+ })
39
+ @tmp_dir = Dir.tmpdir
40
+ @base_dir = File.expand_path("root", @tmp_dir)
41
+ FileUtils.mkdir_p(File.expand_path("foo/bar2", @base_dir))
42
+ FileUtils.mkdir_p(File.expand_path("foo/bar3", @base_dir))
43
+ File.open(File.expand_path("dictionary.yml", @tmp_dir), "w"){|f| YAML.dump({"root" => "ルート"}, f)}
44
+ File.open(File.expand_path("dictionary.yml", @base_dir), "w"){|f| YAML.dump({"foo" => "ほげ"}, f)}
45
+ File.open(File.expand_path("foo/dictionary.yml", @base_dir), "w"){|f|
46
+ YAML.dump({"bar1" => "ばー1", "bar2" => "ばー2"}, f)}
47
+ end
48
+
49
+ context "指定されたバージョンのRootJobneTTemplateからカテゴリを生成します" do
50
+ it "全ドキュメントを対象にしています・・・" do
51
+ expect{
52
+ Tengine::Job::Category.update_for(@base_dir)
53
+ }.to change(Tengine::Job::Category, :count).by(5)
54
+ root = Tengine::Job::Category.first(:conditions => {:parent_id => nil})
55
+ root.name.should == "root"
56
+ root.caption.should == "ルート"
57
+ root.children.count.should == 1
58
+ foo = root.children[0]
59
+ foo.name.should == "foo"
60
+ foo.caption.should == "ほげ"
61
+ foo.children.count.should == 3
62
+ foo.children[0].tap do |c|
63
+ c.name.should == "bar1"
64
+ c.caption.should == "ばー1"
65
+ c.parent_id.should == foo.id
66
+ @root1.reload
67
+ @root1.category_id.should == c.id
68
+ end
69
+ foo.children[1].tap do |c|
70
+ c.name.should == "bar2"
71
+ c.caption.should == "ばー2"
72
+ c.parent_id.should == foo.id
73
+ @root2.reload
74
+ @root2.category_id.should == c.id
75
+ end
76
+ foo.children[2].tap do |c|
77
+ c.name.should == "bar3"
78
+ c.caption.should == "bar3"
79
+ c.parent_id.should == foo.id
80
+ @root3.reload
81
+ @root3.category_id.should == c.id
82
+ end
83
+ end
84
+ end
85
+
86
+ it "後から追加された場合" do
87
+ expect{
88
+ Tengine::Job::Category.update_for(@base_dir)
89
+ }.to change(Tengine::Job::Category, :count).by(5)
90
+ @root4 = Tengine::Job::RootJobnetTemplate.create!({
91
+ :name => "root_jobnet_template01",
92
+ :dsl_filepath => "foo/bar3/baz1/jobnet2.rb",
93
+ :dsl_lineno => 4,
94
+ :dsl_version => "3"
95
+ })
96
+ expect{
97
+ Tengine::Job::Category.update_for(@base_dir)
98
+ }.to change(Tengine::Job::Category, :count).by(1)
99
+ root = Tengine::Job::Category.first(:conditions => {:parent_id => nil})
100
+ foo = root.children[0]
101
+ foo.children[2].tap do |bar3|
102
+ bar3.name.should == "bar3"
103
+ bar3.caption.should == "bar3"
104
+ bar3.parent_id.should == foo.id
105
+ bar3.children.first.tap do |baz1|
106
+ baz1.name.should == "baz1"
107
+ baz1.caption.should == "baz1"
108
+ baz1.parent_id.should == bar3.id
109
+ @root4.reload
110
+ @root4.category_id.should == baz1.id
111
+ end
112
+ end
113
+ end
114
+
115
+ it "Tengine::Job.notifyでジョブDSLのロード終了を通知された場合" do
116
+ mock_config = mock(:config)
117
+ mock_config.should_receive(:dsl_dir_path).and_return(@base_dir)
118
+ mock_sender = mock(:sender)
119
+ mock_sender.should_receive(:respond_to?).with(:config).and_return(true)
120
+ mock_sender.should_receive(:config).and_return(mock_config)
121
+ expect{
122
+ Tengine::Job.notify(mock_sender, :after_load_dsl)
123
+ }.to change(Tengine::Job::Category, :count).by(5)
124
+ root = Tengine::Job::Category.first(:conditions => {:parent_id => nil})
125
+ root.name.should == "root"
126
+ root.caption.should == "ルート"
127
+ root.children.count.should == 1
128
+ foo = root.children[0]
129
+ foo.name.should == "foo"
130
+ foo.caption.should == "ほげ"
131
+ foo.should_not be_nil
132
+ foo.children.count.should == 3
133
+ foo.children[0].tap do |c|
134
+ c.name.should == "bar1"
135
+ c.caption.should == "ばー1"
136
+ c.parent_id.should == foo.id
137
+ @root1.reload
138
+ @root1.category_id.should == c.id
139
+ end
140
+ foo.children[1].tap do |c|
141
+ c.name.should == "bar2"
142
+ c.caption.should == "ばー2"
143
+ c.parent_id.should == foo.id
144
+ @root2.reload
145
+ @root2.category_id.should == c.id
146
+ end
147
+ foo.children[2].tap do |c|
148
+ c.name.should == "bar3"
149
+ c.caption.should == "bar3"
150
+ c.parent_id.should == foo.id
151
+ @root3.reload
152
+ @root3.category_id.should == c.id
153
+ end
154
+ end
155
+
156
+ end
157
+
158
+ end
159
+
160
+
161
+ describe "名前で検索" do
162
+ before do
163
+ Tengine::Job::Category.delete_all
164
+ Tengine::Job::Category.create!(:name => "category1", :caption => "ONE")
165
+ Tengine::Job::Category.create!(:name => "category2", :caption => "TWO")
166
+ end
167
+
168
+ [:find_by_name, :find_by_name!].each do |method_name|
169
+ it "存在する場合はそれを返す" do
170
+ driver = Tengine::Job::Category.send(method_name, "category1")
171
+ driver.should be_a(Tengine::Job::Category)
172
+ driver.name.should == "category1"
173
+ driver.caption.should == "ONE"
174
+ end
175
+ end
176
+
177
+ it ":find_by_nameは見つからなかった場合はnilを返す" do
178
+ Tengine::Job::Category.find_by_name("unexist_category").should == nil
179
+ end
180
+
181
+ it ":find_by_name!は見つからなかった場合はTengine::Core::FindByName::Errorをraiseする" do
182
+ begin
183
+ Tengine::Job::Category.find_by_name!("unexist_category")
184
+ rescue Tengine::Errors::NotFound => e
185
+ e.message.should == "Tengine::Job::Category named \"unexist_category\" not found"
186
+ end
187
+ end
188
+
189
+ end
190
+
191
+
192
+
193
+ end