tengine_job 0.6.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +109 -0
- data/README.rdoc +20 -0
- data/Rakefile +42 -0
- data/VERSION +1 -0
- data/examples/0004_retry_one_layer.rb +24 -0
- data/examples/0004_retry_one_layer.sh +38 -0
- data/examples/0005_retry_two_layer.rb +54 -0
- data/examples/0005_retry_two_layer.sh +80 -0
- data/examples/0006_retry_three_layer.rb +58 -0
- data/examples/0006_retry_three_layer.sh +74 -0
- data/examples/0007_simple_jobnet.rb +7 -0
- data/examples/0021_dynamic_env.rb +20 -0
- data/examples/VERSION +1 -0
- data/examples/tengine_job_test.sh +10 -0
- data/lib/tengine/job.rb +94 -0
- data/lib/tengine/job/category.rb +54 -0
- data/lib/tengine/job/connectable.rb +43 -0
- data/lib/tengine/job/drivers/job_control_driver.rb +82 -0
- data/lib/tengine/job/drivers/job_execution_driver.rb +30 -0
- data/lib/tengine/job/drivers/jobnet_control_driver.rb +117 -0
- data/lib/tengine/job/drivers/schedule_driver.rb +30 -0
- data/lib/tengine/job/dsl_binder.rb +12 -0
- data/lib/tengine/job/dsl_evaluator.rb +18 -0
- data/lib/tengine/job/dsl_loader.rb +180 -0
- data/lib/tengine/job/edge.rb +150 -0
- data/lib/tengine/job/element_selector_notation.rb +169 -0
- data/lib/tengine/job/end.rb +32 -0
- data/lib/tengine/job/executable.rb +74 -0
- data/lib/tengine/job/execution.rb +141 -0
- data/lib/tengine/job/expansion.rb +37 -0
- data/lib/tengine/job/fork.rb +6 -0
- data/lib/tengine/job/job.rb +23 -0
- data/lib/tengine/job/jobnet.rb +173 -0
- data/lib/tengine/job/jobnet/builder.rb +150 -0
- data/lib/tengine/job/jobnet/job_state_transition.rb +167 -0
- data/lib/tengine/job/jobnet/jobnet_state_transition.rb +110 -0
- data/lib/tengine/job/jobnet/state_transition.rb +37 -0
- data/lib/tengine/job/jobnet_actual.rb +55 -0
- data/lib/tengine/job/jobnet_template.rb +10 -0
- data/lib/tengine/job/join.rb +6 -0
- data/lib/tengine/job/junction.rb +29 -0
- data/lib/tengine/job/killing.rb +30 -0
- data/lib/tengine/job/mm_compatibility.rb +6 -0
- data/lib/tengine/job/mm_compatibility/connectable.rb +13 -0
- data/lib/tengine/job/name_path.rb +31 -0
- data/lib/tengine/job/root.rb +16 -0
- data/lib/tengine/job/root_jobnet_actual.rb +39 -0
- data/lib/tengine/job/root_jobnet_template.rb +49 -0
- data/lib/tengine/job/script_executable.rb +235 -0
- data/lib/tengine/job/signal.rb +121 -0
- data/lib/tengine/job/start.rb +20 -0
- data/lib/tengine/job/stoppable.rb +15 -0
- data/lib/tengine/job/vertex.rb +172 -0
- data/lib/tengine_job.rb +3 -0
- data/spec/fixtures/rjn_0001_simple_jobnet_builder.rb +42 -0
- data/spec/fixtures/rjn_0002_simple_parallel_jobnet_builder.rb +42 -0
- data/spec/fixtures/rjn_0003_fork_join_jobnet_builder.rb +61 -0
- data/spec/fixtures/rjn_0004_parallel_jobnet_with_finally_fixture.rb +62 -0
- data/spec/fixtures/rjn_0005_retry_two_layer_fixture.rb +153 -0
- data/spec/fixtures/rjn_0008_expansion_fixture.rb +32 -0
- data/spec/fixtures/rjn_0009_tree_sequential_jobnet_builder.rb +174 -0
- data/spec/fixtures/rjn_0010_2jobs_and_1job_parallel_jobnet_builder.rb +39 -0
- data/spec/fixtures/rjn_0011_nested_fork_jobnet_builder.rb +96 -0
- data/spec/fixtures/rjn_0012_nested_and_finally_builder.rb +157 -0
- data/spec/fixtures/rjn_1004_hadoop_job_in_jobnet_fixture.rb +105 -0
- data/spec/fixtures/rjn_means_root_jobnet +0 -0
- data/spec/fixtures/test_credential_fixture.rb +12 -0
- data/spec/fixtures/test_server_fixture.rb +28 -0
- data/spec/mongoid.yml +35 -0
- data/spec/spec_helper.rb +56 -0
- data/spec/sshd/.gitignore +1 -0
- data/spec/sshd/id_rsa +51 -0
- data/spec/sshd/id_rsa.pub +1 -0
- data/spec/sshd/ssh_host_rsa_key +51 -0
- data/spec/sshd/ssh_host_rsa_key.pub +1 -0
- data/spec/sshd/sshd_config +10 -0
- data/spec/sshd/sshd_config.erb +11 -0
- data/spec/sshd/tengine_job_test.sh +6 -0
- data/spec/support/jobnet_fixture_builder.rb +145 -0
- data/spec/support/mongo_index_key_log.rb +91 -0
- data/spec/tengine/job/category_spec.rb +193 -0
- data/spec/tengine/job/connectable_spec.rb +94 -0
- data/spec/tengine/job/drivers/job_controll_driver/connection_error_spec.rb +236 -0
- data/spec/tengine/job/drivers/job_controll_driver/duplicated_job_start_spec.rb +302 -0
- data/spec/tengine/job/drivers/job_controll_driver/expansion_spec.rb +120 -0
- data/spec/tengine/job/drivers/job_controll_driver/stop_spec.rb +159 -0
- data/spec/tengine/job/drivers/job_controll_driver_spec.rb +623 -0
- data/spec/tengine/job/drivers/job_execution_driver_spec.rb +88 -0
- data/spec/tengine/job/drivers/jobnet_control_driver/nested_and_finally_spec.rb +472 -0
- data/spec/tengine/job/drivers/jobnet_control_driver/nested_jobnet_spec.rb +231 -0
- data/spec/tengine/job/drivers/jobnet_control_driver/stop_jobnet_spec.rb +202 -0
- data/spec/tengine/job/drivers/jobnet_control_driver_spec.rb +446 -0
- data/spec/tengine/job/drivers/schedule_driver_spec.rb +202 -0
- data/spec/tengine/job/dsl_binder_spec.rb +36 -0
- data/spec/tengine/job/dsl_loader_spec.rb +403 -0
- data/spec/tengine/job/dsls/0013_hadoop_job_run.rb +29 -0
- data/spec/tengine/job/dsls/0014_join_and_join.rb +19 -0
- data/spec/tengine/job/dsls/0015_fork_and_fork.rb +18 -0
- data/spec/tengine/job/dsls/0016_complex_fork_and_join.rb +20 -0
- data/spec/tengine/job/dsls/0017_finally.rb +15 -0
- data/spec/tengine/job/dsls/0018_expansion.rb +23 -0
- data/spec/tengine/job/dsls/0019_execute_job_on_event.rb +16 -0
- data/spec/tengine/job/dsls/0020_duplicated_jobnet_name.rb +16 -0
- data/spec/tengine/job/dsls/1060_test_dir1/1060_test_dir2/0013_hadoop_job_run.rb +29 -0
- data/spec/tengine/job/dsls/2003_expansion/expansion_5.rb +11 -0
- data/spec/tengine/job/dsls/VERSION +1 -0
- data/spec/tengine/job/dynamic_env_spec.rb +95 -0
- data/spec/tengine/job/edge_spec.rb +241 -0
- data/spec/tengine/job/element_selector_notation_spec.rb +354 -0
- data/spec/tengine/job/examples_spec.rb +62 -0
- data/spec/tengine/job/execution_spec.rb +100 -0
- data/spec/tengine/job/expansion_spec.rb +116 -0
- data/spec/tengine/job/hadoop_job_run_spec.rb +65 -0
- data/spec/tengine/job/job_spec.rb +4 -0
- data/spec/tengine/job/jobnet/1015_complecated_jobnet_spec.rb +72 -0
- data/spec/tengine/job/jobnet_actual_spec.rb +175 -0
- data/spec/tengine/job/jobnet_spec.rb +399 -0
- data/spec/tengine/job/jobnet_template_spec.rb +240 -0
- data/spec/tengine/job/killing_spec.rb +91 -0
- data/spec/tengine/job/reset_spec.rb +958 -0
- data/spec/tengine/job/reset_spec/4056_1_dump.txt +1 -0
- data/spec/tengine/job/root_jobnet_actual_spec.rb +89 -0
- data/spec/tengine/job/root_jobnet_template_spec.rb +248 -0
- data/spec/tengine/job/script_executable_spec.rb +132 -0
- data/spec/tengine/job/stoppable_spec.rb +176 -0
- data/spec/tengine/job/vertex_spec.rb +25 -0
- data/spec/tengine_job_spec.rb +4 -0
- data/tengine_job.gemspec +197 -0
- data/tmp/log/.gitignore +1 -0
- 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,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,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
|