tes-request 0.5 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e774934b2a6f8f2ab03e09decaa0dd67c673593d
4
- data.tar.gz: 3962eafc89f185fa6934dcf17aa9d3c38ea8ce01
3
+ metadata.gz: ee579434188f04c4db17b2e3a6320309674553e1
4
+ data.tar.gz: 10cc0dc545f2940cd09f04a7c7f881f88e64cdc6
5
5
  SHA512:
6
- metadata.gz: de707683b0a3ec460a29c8760ae0c8dbfbf3bb0c08e6a9f2cfdde62382f1c7889aae31bcf2a36471c48d701e9b351f4828844962b34d47d6e60562d432b2a082
7
- data.tar.gz: 780778bc28e7573fa19534b9b4354dc3b2254275d9fcc90ce376e99080e74cd7013d969b9d4ed118f2d76772c69c85cae7d3f5090f133dcb1d2e6750fc01c58a
6
+ metadata.gz: a617bedb04228f37f07e8eec36a050eb4bf3cd0f6b84430cef820e824209719c9c42fb4265a4ce1688806ca5106d2931ebdb3e897e55bac1774dcf9d14d0a22f
7
+ data.tar.gz: f431578c1a9224b366d30a7d1dd9d7768f3e5cb7d3f0406f083826f64de7746f0a90a0f32438fed38691b2c96f47d41dd666dfe80aa153de8932cabef2941486
@@ -9,20 +9,21 @@ module Tes
9
9
  # @param [String] ask_str 单个资源的请求要求字符串
10
10
  def initialize(ask_str)
11
11
  snippets = ask_str.strip.sub(/^\*\d+:/, '').sub(/^&\d+\./, '').split(/\s*,\s*/)
12
- expressions = snippets.map { |s| Expression.new(s) }
13
- @data = expressions.inject({}) { |t, e| t.merge(e.data[:left_exp] => e) }
12
+ expressions = snippets.map {|s| Expression.new(s)}
13
+ @data = expressions.inject({}) {|t, e| t.merge(e.data[:left_exp] => e)}
14
14
  # @reference 是表达式列表
15
15
  @reference = []
16
16
  @greedy = false
17
+ @lock_type = :lock
17
18
  end
18
19
 
19
20
  attr_reader :data, :reference
20
- attr_accessor :greedy
21
+ attr_accessor :greedy, :lock_type
21
22
 
22
23
  # 计算数据是否满足要求
23
24
  # @param [Object] data
24
25
  def match?(data)
25
- @data.all? { |_n, exp| exp.match?(data) }
26
+ @data.all? {|_n, exp| exp.match?(data)}
26
27
  end
27
28
 
28
29
  def <=>(other)
@@ -45,10 +46,10 @@ module Tes
45
46
  elsif self.data < other.data
46
47
  -1
47
48
  else
48
- a_to_b_results = @data.map { |n, e| exp_compare_lab.call(e, other.data[n]) }
49
- if a_to_b_results.all? { |ret| ret and ret <= 0 }
49
+ a_to_b_results = @data.map {|n, e| exp_compare_lab.call(e, other.data[n])}
50
+ if a_to_b_results.all? {|ret| ret and ret <= 0}
50
51
  -1
51
- elsif a_to_b_results.all? { |ret| ret and ret >= 0 }
52
+ elsif a_to_b_results.all? {|ret| ret and ret >= 0}
52
53
  # 这时必须要求other的表达式全部能被self覆盖.
53
54
  (other.data.keys - @data.keys).size > 0 ? nil : 1
54
55
  else
@@ -65,6 +66,16 @@ module Tes
65
66
  else
66
67
  ret
67
68
  end
69
+ case [lock_type, other.lock_type]
70
+ when [:lock, :share]
71
+ return ret unless ret
72
+ ret >=0 ? 1 : nil
73
+ when [:share, :lock]
74
+ return ret unless ret
75
+ ret <=0 ? -1 : nil
76
+ else
77
+ ret
78
+ end
68
79
  end
69
80
 
70
81
  # 相对other要求多的和严格的
@@ -75,8 +86,9 @@ module Tes
75
86
  o_e && e <= o_e
76
87
  end
77
88
 
78
- diff_ask = self.new('')
89
+ diff_ask = self.class.new('')
79
90
  diff_ask.data.merge!(diff_data)
91
+ diff_ask.lock_type = lock_type
80
92
  diff_ask
81
93
  end
82
94
 
@@ -95,13 +107,15 @@ module Tes
95
107
  self_gt_other = self.-(other)
96
108
  other_gt_self = other.-(self)
97
109
 
98
- ask1 = self.new('')
99
- ask2 = self.new('')
110
+ ask1 = self.class.new('')
111
+ ask2 = self.class.new('')
100
112
  ask1.data.merge!(self.data)
101
113
  ask1.data.merge!(other_gt_self)
102
114
  ask2.data.merge!(other.data)
103
115
  ask2.data.merge!(self_gt_other)
104
- ask1 >= ask2 ? ask1 : ask2
116
+ ask = ask1 >= ask2 ? ask1 : ask2
117
+ ask.lock_type = (lock_type == other.lock_type ? lock_type : :lock)
118
+ ask
105
119
  end
106
120
  end
107
121
 
@@ -103,7 +103,7 @@ module Tes
103
103
  ret = @data[:expect_val] <=> other.data[:expect_val]
104
104
  ret == 0 ? -1 : ret
105
105
  when %w(<= =)
106
- @data[:expect_val] <= other.data[:expect_val] ? 1 : nil
106
+ @data[:expect_val] > other.data[:expect_val] ? -1 : nil
107
107
  when %w(<= <)
108
108
  ret = other.data[:expect_val] <=> @data[:expect_val]
109
109
  ret == 0 ? -1 : ret
@@ -5,6 +5,7 @@ module Tes
5
5
  class Profile
6
6
  include Comparable
7
7
 
8
+ REG_LOCK_HEADER = /^(@|\$)\s*\|+\s*/
8
9
  REG_POINT_ASK = /^\*(\d+):/
9
10
  REG_REFER_ASK = /^&(\d+)\./
10
11
  REG_POINT_ASK_GREEDY = /^\[\*(\d+)\]:/
@@ -17,16 +18,21 @@ module Tes
17
18
 
18
19
  # 不因申明顺序不一致性等其他差异而误判环境要求的一致性
19
20
  point_asks = {}
20
- profile_lines.each do |line|
21
+ profile_lines.each do |raw_line|
22
+ lock_type = (raw_line =~ REG_LOCK_HEADER and raw_line =~ /^\$/) ? :share : :lock
23
+ line = raw_line.sub(REG_LOCK_HEADER, '')
24
+
21
25
  case line
22
26
  when REG_POINT_ASK
23
27
  mt = line.match(REG_POINT_ASK)
24
28
  ask = Ask.new line.sub(REG_POINT_ASK, '')
29
+ ask.lock_type = lock_type
25
30
  point_asks[mt[1]] = ask
26
31
  when REG_POINT_ASK_GREEDY
27
32
  mt = line.match(REG_POINT_ASK_GREEDY)
28
33
  ask = Ask.new line.sub(REG_POINT_ASK_GREEDY, '')
29
34
  ask.greedy= true
35
+ ask.lock_type = lock_type
30
36
  point_asks[mt[1]] = ask
31
37
  when REG_REFER_ASK
32
38
  mt= line.match(REG_REFER_ASK)
@@ -39,7 +45,9 @@ module Tes
39
45
  ref_exp = Expression.new line.sub(REG_REFER_ASK_GREEDY, '')
40
46
  src_ask.reference << ref_exp
41
47
  else
42
- @data << Ask.new(line)
48
+ ask = Ask.new(line)
49
+ ask.lock_type =lock_type
50
+ @data << ask
43
51
  end
44
52
  end
45
53
 
@@ -49,15 +57,15 @@ module Tes
49
57
  attr_reader :data
50
58
 
51
59
  def <=>(other)
52
- all_self_hash = self.data.group_by { |e| e.to_s }
60
+ all_self_hash = self.data.group_by {|e| e.to_s}
53
61
  all_self_hash_keys = Set.new all_self_hash.keys
54
- all_other_hash = other.data.group_by { |e| e.to_s }
62
+ all_other_hash = other.data.group_by {|e| e.to_s}
55
63
  all_other_hash_keys = Set.new all_other_hash.keys
56
64
 
57
65
  # 如果相等或者可比较则直接返回(只在相等的时候有效)
58
66
  return 0 if all_self_hash == all_other_hash
59
67
 
60
- hash1 = Hash[all_self_hash_keys.to_a.map { |e| [e, true] }]
68
+ hash1 = Hash[all_self_hash_keys.to_a.map {|e| [e, true]}]
61
69
  all_other_hash_keys.to_a.each do |k|
62
70
  hash1.include?(k)
63
71
  end
@@ -99,7 +107,7 @@ module Tes
99
107
  # @param [Hash<String,Hash>] pool 所有空闲可用的资源池
100
108
  def request(pool)
101
109
  get_candidates_lab = ->(ask, answer_cache) do
102
- pool.keys.select { |k| !answer_cache.include?(k) && ask.match?(pool[k]) }
110
+ pool.keys.select {|k| !answer_cache.include?(k) && ask.match?(pool[k])}
103
111
  end
104
112
 
105
113
  answers_flat = []
@@ -146,16 +154,17 @@ module Tes
146
154
  ret = []
147
155
  point = 0
148
156
  @data.each do |ask|
157
+ header = (ask.lock_type == :share ? '$|' : '@|')
149
158
  if ask.reference and ask.reference.size > 0
150
159
  point_ask = ask
151
160
  refer_asks = ask.reference
152
161
  point += 1
153
- ret << ("*#{point}:" + point_ask.to_s)
162
+ ret << header + ("*#{point}:" + point_ask.to_s)
154
163
  refer_asks.each do |r_ask|
155
164
  ret << ("&#{point}." + r_ask.to_s)
156
165
  end
157
166
  else
158
- ret << ask.to_s
167
+ ret << header + ask.to_s
159
168
  end
160
169
  end
161
170
  ret.join(split)
@@ -163,11 +172,15 @@ module Tes
163
172
 
164
173
  private
165
174
  def compare_when_keys_same(hash_self, hash_other)
166
- size_compare_results = hash_self.keys.map { |k| hash_self[k].size <=> hash_other[k].size }
167
- if size_compare_results.all? { |v| v && v <= 0 }
168
- size_compare_results.any? { |v| v == -1 } ? -1 : 0
169
- elsif size_compare_results.all? { |v| v && v >= 0 }
170
- size_compare_results.any? { |v| v == 1 } ? 1 : 0
175
+ size_compare_results = hash_self.keys.map {|k| hash_self[k].size <=> hash_other[k].size}
176
+ lock_compare_result = hash_self.keys.map do |k|
177
+ hash_self[k].select {|a| a.lock_type == :lock}.size <=>
178
+ hash_other[k].select {|a| a.lock_type == :lock}.size
179
+ end
180
+ if size_compare_results.all? {|v| v && v <= 0} and lock_compare_result.all? {|v| v && v <= 0}
181
+ (size_compare_results.any? {|v| v == -1} or lock_compare_result.any? {|v| v == -1}) ? -1 : 0
182
+ elsif size_compare_results.all? {|v| v && v >= 0} and lock_compare_result.all? {|v| v && v >= 0}
183
+ (size_compare_results.any? {|v| v == 1} or lock_compare_result.any? {|v| v == 1}) ? 1 : 0
171
184
  else
172
185
  nil
173
186
  end
@@ -175,7 +188,7 @@ module Tes
175
188
 
176
189
  def compare_when_keys_subset(hash_self, hash_other)
177
190
  subset_keys = hash_self.keys
178
- hash_other_subset = subset_keys.inject({}) { |t, k| t.merge(k => hash_other[k]) }
191
+ hash_other_subset = subset_keys.inject({}) {|t, k| t.merge(k => hash_other[k])}
179
192
  ret = compare_when_keys_same(hash_self, hash_other_subset)
180
193
  ret && (ret <= 0 ? -1 : nil)
181
194
  end
@@ -184,11 +197,11 @@ module Tes
184
197
  def merge_when_keys_diff!(hash_self, hash_other)
185
198
  merge_able_lab = ->(to, from) do
186
199
  from.keys.all? do |f_ask|
187
- if to.any? { |k, _| f_ask <=> k }
200
+ if to.any? {|k, _| f_ask <=> k}
188
201
  true
189
202
  else
190
203
  if f_ask.data['type']
191
- to.keys.none? { |e| e.data['type'] && e.data['type'] and e.data['type'] == f_ask.data['type'] }
204
+ to.keys.none? {|e| e.data['type'] && e.data['type'] and e.data['type'] == f_ask.data['type']}
192
205
  else
193
206
  true
194
207
  end
@@ -198,30 +211,53 @@ module Tes
198
211
  merge_lab = ->(to, from) do
199
212
  # 现将内容全部拼起来,然后合并资源
200
213
  ret_hash = {}
201
- to.each { |ask, ask_dup_list| ret_hash[ask] = ask_dup_list }
214
+ to.each do |ask, ask_dup_list|
215
+ lock_list = ask_dup_list.select {|a| a.lock_type == :lock}
216
+ share_list = ask_dup_list.select {|a| a.lock_type == :share}
217
+ ret_hash[ask] = lock_list + share_list
218
+ end
202
219
  from.each do |ask, ask_dup_list|
203
- # 是否有相同要求的资源要求
220
+ ask_dup_lock_type_size = ask_dup_list.select {|a| a.lock_type == :lock}.size
221
+
222
+ # 是否有相同要求的资源要求,有则合并(包括锁定方式)
204
223
  if ret_hash[ask]
205
- unless ret_hash[ask].size >= ask_dup_list
224
+ if ret_hash[ask].size < ask_dup_list
206
225
  ret_hash[ask] += ask_dup_list[ret_hash[ask].size..-1]
207
226
  end
227
+
228
+ if ask_dup_lock_type_size > ret_hash[ask].select {|a| a.lock_type == :lock}.size
229
+ ret_hash[ask][0...ask_dup_lock_type_size].each {|a| a.lock_type = :lock}
230
+ end
208
231
  else
209
232
  # 没有
210
233
 
211
234
  # 是否总结果中有可合并的资源请求
212
- merge_able_ask = ret_hash.keys.find { |a| a <=> ask }
235
+ merge_able_ask = ret_hash.keys.find {|a| a <=> ask}
213
236
  if merge_able_ask
214
237
  if merge_able_ask >= ask
215
238
  if ret_hash[merge_able_ask].size < ask_dup_list.size
216
239
  ret_hash[merge_able_ask] += ask_dup_list[ret_hash[merge_able_ask].size..-1]
217
240
  end
241
+ if ask_dup_lock_type_size > ret_hash[merge_able_ask].select {|a| a.lock_type == :lock}.size
242
+ ret_hash[merge_able_ask][0...ask_dup_lock_type_size].each {|a| a.lock_type = :lock}
243
+ end
218
244
  else
219
245
  if ret_hash[merge_able_ask].size <= ask_dup_list.size
246
+ merge_able_lock_size = ret_hash[merge_able_ask].select {|a| a.lock_type == :lock}.size
220
247
  ret_hash.delete(merge_able_ask)
248
+ if ask_dup_lock_type_size < merge_able_lock_size
249
+ ask_dup_list[0...merge_able_lock_size].each {|a| a.lock_type = :lock}
250
+ end
221
251
  ret_hash[ask] = ask_dup_list
222
252
  else
253
+ merge_able_lock_size = ret_hash[merge_able_ask].select {|a| a.lock_type == :lock}.size
254
+ sum_lock_size = [merge_able_lock_size, ask_dup_lock_type_size].max
223
255
  ret_hash[ask] = ask_dup_list
224
256
  ret_hash[merge_able_ask].pop(ask_dup_list.size)
257
+
258
+ (0...(sum_lock_size - ret_hash[merge_able_ask].select {|a| a.lock_type == :lock}.size)).each do |i|
259
+ ret_hash[ask][i].lock_type = :lock
260
+ end
225
261
  end
226
262
  end
227
263
  else
@@ -243,10 +279,10 @@ module Tes
243
279
  end
244
280
 
245
281
  def merge(other)
246
- all_self_hash = self.data.group_by { |e| e.to_s }
247
- all_self_hash = Hash[all_self_hash.map { |k, v| [Ask.new(k), v] }]
248
- all_other_hash = other.data.group_by { |e| e.to_s }
249
- all_other_hash = Hash[all_other_hash.map { |k, v| [Ask.new(k), v] }]
282
+ all_self_hash = self.data.group_by {|e| e.to_s}
283
+ all_other_hash = other.data.group_by {|e| e.to_s}
284
+ all_self_hash = Hash[all_self_hash.map {|k, v| [Ask.new(k), v]}]
285
+ all_other_hash = Hash[all_other_hash.map {|k, v| [Ask.new(k), v]}]
250
286
  all_self_hash_keys = Set.new all_self_hash.keys
251
287
  all_other_hash_keys = Set.new all_other_hash.keys
252
288
 
@@ -274,7 +310,7 @@ module Tes
274
310
  new_instance = self.class.new([])
275
311
 
276
312
 
277
- result.values.flatten.each { |v| new_instance.data.push v }
313
+ result.values.flatten.each {|v| new_instance.data.push v}
278
314
  new_instance
279
315
  end
280
316
  end
@@ -1,5 +1,5 @@
1
1
  module Tes
2
2
  module Request
3
- VERSION = '0.5'
3
+ VERSION = '0.6'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tes-request
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.5'
4
+ version: '0.6'
5
5
  platform: ruby
6
6
  authors:
7
7
  - wuhuizuo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-29 00:00:00.000000000 Z
11
+ date: 2017-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: java-properties
@@ -105,7 +105,6 @@ files:
105
105
  - lib/tes/request/client.rb
106
106
  - lib/tes/request/expression.rb
107
107
  - lib/tes/request/profile.rb
108
- - lib/tes/request/rake_task.rb
109
108
  - lib/tes/request/rspec/ci_slicer.rb
110
109
  - lib/tes/request/rspec/distribute.rb
111
110
  - lib/tes/request/rspec/function.rb
@@ -133,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
132
  version: '0'
134
133
  requirements: []
135
134
  rubyforge_project:
136
- rubygems_version: 2.4.5
135
+ rubygems_version: 2.6.11
137
136
  signing_key:
138
137
  specification_version: 4
139
138
  summary: Request libs and bins for TES(Test Env Service)
@@ -1,90 +0,0 @@
1
- require 'rake'
2
- require 'rake/tasklib'
3
- require 'yaml'
4
- require 'java-properties'
5
- require_relative 'rspec/distribute'
6
-
7
- class Tes::Request::RakeTask < ::Rake::TaskLib
8
- SUPPORT_FILE_TYPES = [:yaml, :yml, :json, :properties]
9
-
10
- def initialize(name, type)
11
- desc "Generate RSpec distribute jobs #{type} file for CI"
12
- task name, [:project_dir, :type, :count, :version, :lang] do |_, task_args|
13
- rspec_distribute = ::Tes::Request::RSpec::Distribute.new(task_args[:project_dir])
14
- jobs = rspec_distribute.distribute_jobs(task_args[:type],
15
- task_args[:count].to_i,
16
- task_args[:version],
17
- task_args[:lang])
18
- target_dir = File.join(task_args[:project_dir], '.ci_jobs')
19
- save_job_files(jobs, target_dir, type)
20
- end
21
- end
22
-
23
- def spec_tag_param_str(tags)
24
- case tags
25
- when Array
26
- tags.map { |t| "--tag #{t}" }.join(' ')
27
- when String
28
- "--tag #{tags}"
29
- when nil
30
- nil
31
- else
32
- raise("不支持的类型:#{tags.class}")
33
- end
34
- end
35
-
36
- def save_job_files(jobs, target_dir, file_type)
37
- unless SUPPORT_FILE_TYPES.include?(file_type)
38
- raise(ArgumentError, "Not supported file type:#{file_type}!")
39
- end
40
-
41
- job_configs_for_ci = jobs.map { |j| gen_job_ci_params(j) }
42
- FileUtils.rm_rf(target_dir)
43
- FileUtils.mkdir(target_dir)
44
- case file_type
45
- when :json
46
- save_file = File.join(target_dir, 'ci_tasks.json')
47
- File.open(save_file, 'w') { |f| f.write job_configs_for_ci.to_json }
48
- puts "Generated #{jobs.size} jobs, Stored in:#{save_file} ."
49
- when :yml, :yaml
50
- save_file = File.join(target_dir, 'ci_tasks.yml')
51
- File.open(save_file, 'w') { |f| f.write job_configs_for_ci.to_yaml }
52
- puts "Generated #{jobs.size} jobs, Stored in:#{save_file} ."
53
- when :properties
54
- job_configs_for_ci.each_with_index do |params, i|
55
- file = File.join(target_dir, "#{i}.properties")
56
- save_job_properties(params, file)
57
- end
58
- puts "Generated #{jobs.size} jobs, Stored in:#{target_dir}/*.properties ."
59
- end
60
- end
61
-
62
- def save_job_properties(job_cfg, save_file)
63
- # context = ["# gen at #{Time.now}"]
64
- JavaProperties.write(job_cfg, save_file)
65
- #
66
- # context = ["# gen at #{Time.now}"]
67
- # tag_opt_cli_args = spec_tag_param_str(job_cfg[:tag])
68
- # rspec_param = if tag_opt_cli_args
69
- # "RSPEC_PARAM = #{tag_opt_cli_args} \\\n\t#{piece[:files].join(" \\\n\t")}"
70
- # else
71
- # "RSPEC_PARAM = #{piece[:files].join(" \\\n\t")}"
72
- # end
73
- # context << "REQUEST_ASKS = #{piece[:profile].to_s(";\\\n\t")}"
74
- # File.open(file, 'w') { |f| f.write context.join("\n") }
75
- end
76
-
77
- def get_job_rspec_run_args_str(job, split=' ')
78
- tags_str = spec_tag_param_str(job[:tag])
79
- paths_str = job[:specs].join(split)
80
- tags_str ? (tags_str + split + paths_str) : paths_str
81
- end
82
-
83
- def get_job_env_profile_str(job, split=';')
84
- job[:profile].to_s(split)
85
- end
86
-
87
- def gen_job_ci_params(job)
88
- {'RSPEC_PARAM' => get_job_rspec_run_args_str(job), 'REQUEST_ASKS' => get_job_env_profile_str(job)}
89
- end
90
- end