test_ids 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/shared_commands.rb +8 -1
- data/config/version.rb +2 -2
- data/lib/test_ids.rb +49 -12
- data/lib/test_ids/allocator.rb +59 -6
- data/lib/test_ids/commands/clear.rb +52 -0
- data/lib/test_ids/configuration.rb +3 -0
- data/lib/test_ids/git.rb +36 -29
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3187c134f83d0e5a9c3513027fb2c1bad26a1b12
|
4
|
+
data.tar.gz: 8d265c7f97de0eb22d62efff091a0974fc5e0482
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f30d12207607a2eac1335af1f9e4e4e37854dbd36aea7647c79e74cb68e3c1810d7cdbe5d4174f2c52ac8e7081ad3b96119cb8f3386d314d4966672fac29b9ce
|
7
|
+
data.tar.gz: 2d0347b9c85d6edec9f36be9994639916f1a6eb0447a9ab5bbc5f98b48b0f9d54d565e7aca366fa1edbea7f13f3a1ea41a530d717586b1e8bc1d911e143cf659
|
data/config/shared_commands.rb
CHANGED
@@ -3,14 +3,21 @@ case @command
|
|
3
3
|
|
4
4
|
when "test_ids:rollback"
|
5
5
|
if ARGV[0]
|
6
|
-
TestIds::Git.
|
6
|
+
local = TestIds::Git.path_to_local
|
7
|
+
TestIds::Git.new(local: local).rollback(ARGV[0])
|
7
8
|
else
|
8
9
|
puts "You must supply a commit ID to rollback to, e.g. origen test_ids:rollback 456ac3f53"
|
9
10
|
end
|
10
11
|
exit 0
|
12
|
+
|
13
|
+
when "test_ids:clear"
|
14
|
+
require "test_ids/commands/#{@command.split(':').last}"
|
15
|
+
exit 0
|
16
|
+
|
11
17
|
else
|
12
18
|
@plugin_commands << <<-EOT
|
13
19
|
test_ids:rollback Rollback the TestIds store to the given commit ID
|
20
|
+
test_ids:clear Clear the assignment database for bins, softbins, numbers or all
|
14
21
|
EOT
|
15
22
|
|
16
23
|
end
|
data/config/version.rb
CHANGED
data/lib/test_ids.rb
CHANGED
@@ -6,17 +6,13 @@ module TestIds
|
|
6
6
|
# THIS FILE SHOULD ONLY BE USED TO LOAD RUNTIME DEPENDENCIES
|
7
7
|
# If this plugin has any development dependencies (e.g. dummy DUT or other models that are only used
|
8
8
|
# for testing), then these should be loaded from config/boot.rb
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# explicitly require it up above and then let this take care of the rest.
|
17
|
-
Dir.glob("#{File.dirname(__FILE__)}/test_ids/**/*.rb").sort.each do |file|
|
18
|
-
require file
|
19
|
-
end
|
9
|
+
require 'test_ids/allocator'
|
10
|
+
require 'test_ids/bin_array'
|
11
|
+
require 'test_ids/configuration'
|
12
|
+
require 'test_ids/git'
|
13
|
+
require 'test_ids/shutdown_handler'
|
14
|
+
require 'test_ids/origen/origen'
|
15
|
+
require 'test_ids/origen_testers/flow'
|
20
16
|
|
21
17
|
class <<self
|
22
18
|
# Allocates a number to the given test and returns a new hash containing
|
@@ -34,6 +30,12 @@ module TestIds
|
|
34
30
|
}
|
35
31
|
end
|
36
32
|
|
33
|
+
# Load an existing allocator, which will be loaded with an empty configuration
|
34
|
+
# @api internal
|
35
|
+
def load_allocator(id = nil)
|
36
|
+
Configuration.new(id).allocator
|
37
|
+
end
|
38
|
+
|
37
39
|
def current_configuration
|
38
40
|
configuration(@configuration_id)
|
39
41
|
end
|
@@ -64,6 +66,27 @@ module TestIds
|
|
64
66
|
initialize_git
|
65
67
|
end
|
66
68
|
|
69
|
+
## Can be called in place of TestIDs.configure to change the configuration from
|
70
|
+
## the one that was originally supplied.
|
71
|
+
## It is expected that this is mainly useful for testing purposes only.
|
72
|
+
# def reconfigure(id = nil, options = {}, &block)
|
73
|
+
# id, options = nil, id if id.is_a?(Hash)
|
74
|
+
|
75
|
+
# @configuration_id = id || options[:id] || :not_specified
|
76
|
+
|
77
|
+
# @configuration ||= {}
|
78
|
+
|
79
|
+
# old = @configuration[@configuration_id]
|
80
|
+
# new = Configuration.new(@configuration_id)
|
81
|
+
# new.instance_variable_set('@allocator', old.allocator)
|
82
|
+
# new.allocator.instance_variable_set('@config', new)
|
83
|
+
# @configuration[@configuration_id] = new
|
84
|
+
|
85
|
+
# yield new
|
86
|
+
|
87
|
+
# new.validate!
|
88
|
+
# end
|
89
|
+
|
67
90
|
def configured?
|
68
91
|
!!@configuration_id
|
69
92
|
end
|
@@ -82,7 +105,7 @@ module TestIds
|
|
82
105
|
# git storage has not been enabled
|
83
106
|
def database_file(id)
|
84
107
|
if repo
|
85
|
-
if id == :not_specified
|
108
|
+
if id == :not_specified || !id || id == ''
|
86
109
|
f = 'store.json'
|
87
110
|
else
|
88
111
|
f = "store_#{id.to_s.downcase}.json"
|
@@ -136,6 +159,20 @@ module TestIds
|
|
136
159
|
@publish = val ? :save : :dont_save
|
137
160
|
end
|
138
161
|
|
162
|
+
## When set to true, all numbers generated will be checked to see if they comply
|
163
|
+
## with the current configuration, and if not they will be re-assigned based on the
|
164
|
+
## current configuration
|
165
|
+
# def reallocate_non_compliant
|
166
|
+
# @reallocate_non_compliant
|
167
|
+
# end
|
168
|
+
|
169
|
+
## When set to true, all numbers generated will be checked to see if they comply
|
170
|
+
## with the current configuration, and if not they will be re-assigned based on the
|
171
|
+
## current configuration
|
172
|
+
# def reallocate_non_compliant=(val)
|
173
|
+
# @reallocate_non_compliant = val
|
174
|
+
# end
|
175
|
+
|
139
176
|
private
|
140
177
|
|
141
178
|
def on_origen_shutdown
|
data/lib/test_ids/allocator.rb
CHANGED
@@ -16,6 +16,7 @@ module TestIds
|
|
16
16
|
# Main method to inject generated bin and test numbers, the given
|
17
17
|
# options instance is modified accordingly
|
18
18
|
def allocate(instance, options)
|
19
|
+
orig_options = options.dup
|
19
20
|
clean(options)
|
20
21
|
@callbacks = []
|
21
22
|
name = extract_test_name(instance, options)
|
@@ -93,10 +94,19 @@ module TestIds
|
|
93
94
|
# Otherwise generate the missing ones
|
94
95
|
bin['number'] ||= allocate_bin(size: bin_size)
|
95
96
|
bin['size'] ||= bin_size
|
96
|
-
softbin
|
97
|
-
|
98
|
-
|
99
|
-
|
97
|
+
# If the softbin is based on the test number, then need to calculate the
|
98
|
+
# test number first
|
99
|
+
if config.softbins.algorithm && config.softbins.algorithm.to_s =~ /n/
|
100
|
+
number['number'] ||= allocate_number(bin: bin['number'], size: number_size)
|
101
|
+
number['size'] ||= number_size
|
102
|
+
softbin['number'] ||= allocate_softbin(bin: bin['number'], number: number['number'], size: softbin_size)
|
103
|
+
softbin['size'] ||= softbin_size
|
104
|
+
else
|
105
|
+
softbin['number'] ||= allocate_softbin(bin: bin['number'], size: softbin_size)
|
106
|
+
softbin['size'] ||= softbin_size
|
107
|
+
number['number'] ||= allocate_number(bin: bin['number'], softbin: softbin['number'], size: number_size)
|
108
|
+
number['size'] ||= number_size
|
109
|
+
end
|
100
110
|
|
101
111
|
# Record that there has been a reference to the final numbers
|
102
112
|
time = Time.now.to_f
|
@@ -123,6 +133,18 @@ module TestIds
|
|
123
133
|
options[:number] = number['number']
|
124
134
|
options[:number_size] = number['size']
|
125
135
|
end
|
136
|
+
|
137
|
+
## If reallocation is on, then check if the generated numbers are compliant, if not
|
138
|
+
## clear them and go back around again to generate a new set
|
139
|
+
# if TestIds.reallocate_non_compliant
|
140
|
+
# if !config.bins.function?
|
141
|
+
# if !config.bins.compliant?(options[:bin])
|
142
|
+
# store["assigned"]["bin"].delete(bin_id)
|
143
|
+
# return allocate(instance, orig_options)
|
144
|
+
# end
|
145
|
+
# end
|
146
|
+
# end
|
147
|
+
|
126
148
|
options
|
127
149
|
end
|
128
150
|
|
@@ -162,6 +184,28 @@ module TestIds
|
|
162
184
|
end
|
163
185
|
end
|
164
186
|
|
187
|
+
# Clear the :bins, :softbins and/or :numbers by setting the options for each item to true
|
188
|
+
def clear(options)
|
189
|
+
if options[:softbin] || options[:softbins]
|
190
|
+
store['assigned']['softbin'] = {}
|
191
|
+
store['manually_assigned']['softbin'] = {}
|
192
|
+
store['pointers']['softbin'] = nil
|
193
|
+
store['references']['softbin'] = {}
|
194
|
+
end
|
195
|
+
if options[:bin] || options[:bins]
|
196
|
+
store['assigned']['bin'] = {}
|
197
|
+
store['manually_assigned']['bin'] = {}
|
198
|
+
store['pointers']['bin'] = nil
|
199
|
+
store['references']['bin'] = {}
|
200
|
+
end
|
201
|
+
if options[:number] || options[:numbers]
|
202
|
+
store['assigned']['number'] = {}
|
203
|
+
store['manually_assigned']['number'] = {}
|
204
|
+
store['pointers']['number'] = nil
|
205
|
+
store['references']['number'] = {}
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
165
209
|
# Saves the current allocator state to the repository
|
166
210
|
def save
|
167
211
|
if file
|
@@ -220,19 +264,28 @@ module TestIds
|
|
220
264
|
|
221
265
|
def allocate_softbin(options)
|
222
266
|
bin = options[:bin]
|
267
|
+
num = options[:number]
|
223
268
|
return nil if config.softbins.empty?
|
224
269
|
if config.softbins.algorithm
|
225
270
|
algo = config.softbins.algorithm.to_s.downcase
|
226
|
-
if algo.to_s =~ /^[b\
|
271
|
+
if algo.to_s =~ /^[b\dxn]+$/
|
227
272
|
number = algo.to_s
|
228
273
|
bin = bin.to_s
|
229
274
|
if number =~ /(b+)/
|
230
275
|
max_bin_size = Regexp.last_match(1).size
|
231
276
|
if bin.size > max_bin_size
|
232
|
-
fail "Bin number (#{bin}) overflows the
|
277
|
+
fail "Bin number (#{bin}) overflows the softbin number algorithm (#{algo})"
|
233
278
|
end
|
234
279
|
number = number.sub(/b+/, bin.rjust(max_bin_size, '0'))
|
235
280
|
end
|
281
|
+
if number =~ /(n+)/
|
282
|
+
num = num.to_s
|
283
|
+
max_num_size = Regexp.last_match(1).size
|
284
|
+
if num.size > max_num_size
|
285
|
+
fail "Test number (#{num}) overflows the softbin number algorithm (#{algo})"
|
286
|
+
end
|
287
|
+
number = number.sub(/n+/, num.rjust(max_num_size, '0'))
|
288
|
+
end
|
236
289
|
if number =~ /(x+)/
|
237
290
|
max_counter_size = Regexp.last_match(1).size
|
238
291
|
refs = store['references']['softbin']
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
options = {}
|
4
|
+
|
5
|
+
# App options are options that the application can supply to extend this command
|
6
|
+
app_options = @application_options || []
|
7
|
+
opt_parser = OptionParser.new do |opts|
|
8
|
+
opts.banner = <<-EOT
|
9
|
+
Clear all existing bin, softbin or test number allocations in the given TestId database.
|
10
|
+
|
11
|
+
Usage: origen test_ids:clear [ID] [options]
|
12
|
+
|
13
|
+
Examples: origen test_ids:clear --bins # Clear the bins in the default database
|
14
|
+
origen test_ids:clear wafer_test --numbers # Clear the test numbers in the wafer_test database
|
15
|
+
origen test_ids:clear --bins --softbin --numbers # Clear everything in the default database
|
16
|
+
|
17
|
+
EOT
|
18
|
+
opts.on('--bins', 'Clear the bin database') { options[:bins] = true }
|
19
|
+
opts.on('--softbins', 'Clear the softbin database') { options[:softbins] = true }
|
20
|
+
opts.on('--numbers', 'Clear the test number database') { options[:numbers] = true }
|
21
|
+
# opts.on('-pl', '--plugin PLUGIN_NAME', String, 'Set current plugin') { |pl_n| options[:current_plugin] = pl_n }
|
22
|
+
opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true }
|
23
|
+
app_options.each do |app_option|
|
24
|
+
opts.on(*app_option) {}
|
25
|
+
end
|
26
|
+
opts.separator ''
|
27
|
+
opts.on('-h', '--help', 'Show this message') { puts opts; exit 0 }
|
28
|
+
end
|
29
|
+
|
30
|
+
opt_parser.parse! ARGV
|
31
|
+
|
32
|
+
local = TestIds::Git.path_to_local
|
33
|
+
git = TestIds::Git.new(local: local)
|
34
|
+
TestIds.repo = git.repo.remote.url
|
35
|
+
git.get_lock
|
36
|
+
rollback_id = nil
|
37
|
+
begin
|
38
|
+
# Get the commit before the lock to give the user later
|
39
|
+
rollback_id = git.repo.object('HEAD^').sha[0, 11]
|
40
|
+
a = TestIds.load_allocator(ARGV.first)
|
41
|
+
a.clear(options)
|
42
|
+
a.save
|
43
|
+
ensure
|
44
|
+
git.publish
|
45
|
+
end
|
46
|
+
if rollback_id
|
47
|
+
puts
|
48
|
+
puts 'TestIDs database cleared as requested, you can rollback this change by running:'
|
49
|
+
puts
|
50
|
+
puts " origen test_ids:rollback #{rollback_id}"
|
51
|
+
puts
|
52
|
+
end
|
data/lib/test_ids/git.rb
CHANGED
@@ -14,10 +14,11 @@ module TestIds
|
|
14
14
|
|
15
15
|
attr_reader :repo, :local
|
16
16
|
|
17
|
-
|
17
|
+
# @api private
|
18
|
+
class PathToLocal
|
18
19
|
include Origen::Utility::InputCapture
|
19
20
|
|
20
|
-
def
|
21
|
+
def find
|
21
22
|
repos = Dir.glob("#{Origen.app.imports_dir}/test_ids/*.git")
|
22
23
|
if repos.size == 0
|
23
24
|
puts 'No TestIds repositories were found in this application'
|
@@ -37,37 +38,15 @@ module TestIds
|
|
37
38
|
else
|
38
39
|
selection = 0
|
39
40
|
end
|
40
|
-
|
41
|
-
repo = ::Git.open(repos[selection])
|
42
|
-
begin
|
43
|
-
commit = repo.object(id)
|
44
|
-
rescue ::Git::GitExecuteError
|
45
|
-
puts 'The given commit ID cannot be found in that repository'
|
46
|
-
exit
|
47
|
-
end
|
48
|
-
day = 24 * 60 * 60
|
49
|
-
if commit.date < Time.now - (7 * day)
|
50
|
-
puts "Sorry, that commit is more than a week old and I'm too scared to rollback that far."
|
51
|
-
puts 'You will need to do that manually if you must.'
|
52
|
-
exit
|
53
|
-
end
|
54
|
-
puts
|
55
|
-
puts "About to rollback the TestIds repository #{name} to commit #{id}."
|
56
|
-
puts
|
57
|
-
puts 'This will permanently delete any IDs assigned by anyone, anywhere, since that commit.'
|
58
|
-
puts
|
59
|
-
puts 'ARE YOU SURE YOU KNOW WHAT YOU ARE DOING?'
|
60
|
-
puts
|
61
|
-
get_text(confirm: true, default: 'no')
|
62
|
-
repo.reset_hard(id)
|
63
|
-
repo.push('origin', 'master', force: true)
|
64
|
-
puts 'As you wish, rolled back successfully!'
|
41
|
+
repos[selection]
|
65
42
|
end
|
66
43
|
end
|
67
44
|
|
68
|
-
|
45
|
+
# Returns a path to the local test IDs repo, if multiple are found the user will be
|
46
|
+
# prompted to choose one
|
47
|
+
def self.path_to_local
|
69
48
|
# Implemented as a class as a hack to get access to InputCapture
|
70
|
-
|
49
|
+
PathToLocal.new.find
|
71
50
|
end
|
72
51
|
|
73
52
|
def initialize(options)
|
@@ -93,6 +72,34 @@ module TestIds
|
|
93
72
|
@repo.reset_hard
|
94
73
|
end
|
95
74
|
|
75
|
+
# Roll the repo back to the given commit ID
|
76
|
+
def rollback(id)
|
77
|
+
name = Pathname.new(local).basename.to_s
|
78
|
+
begin
|
79
|
+
commit = repo.object(id)
|
80
|
+
rescue ::Git::GitExecuteError
|
81
|
+
puts 'The given commit ID cannot be found in that repository'
|
82
|
+
exit
|
83
|
+
end
|
84
|
+
# day = 24 * 60 * 60
|
85
|
+
# if commit.date < Time.now - (7 * day)
|
86
|
+
# puts "Sorry, that commit is more than a week old and I'm too scared to rollback that far."
|
87
|
+
# puts 'You will need to do that manually if you must.'
|
88
|
+
# exit
|
89
|
+
# end
|
90
|
+
puts
|
91
|
+
puts "About to rollback the TestIds repository #{name} to commit #{id}."
|
92
|
+
puts
|
93
|
+
puts 'This will permanently delete any IDs assigned by anyone, anywhere, since that commit.'
|
94
|
+
puts
|
95
|
+
puts 'ARE YOU SURE YOU KNOW WHAT YOU ARE DOING?'
|
96
|
+
puts
|
97
|
+
get_text(confirm: true, default: 'no')
|
98
|
+
repo.reset_hard(id)
|
99
|
+
repo.push('origin', 'master', force: true)
|
100
|
+
puts 'As you wish, rolled back successfully!'
|
101
|
+
end
|
102
|
+
|
96
103
|
def exec(cmd)
|
97
104
|
r = system(cmd)
|
98
105
|
unless r
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test_ids
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: origen
|
@@ -68,6 +68,7 @@ files:
|
|
68
68
|
- lib/test_ids.rb
|
69
69
|
- lib/test_ids/allocator.rb
|
70
70
|
- lib/test_ids/bin_array.rb
|
71
|
+
- lib/test_ids/commands/clear.rb
|
71
72
|
- lib/test_ids/configuration.rb
|
72
73
|
- lib/test_ids/git.rb
|
73
74
|
- lib/test_ids/origen/origen.rb
|