circuitdata 0.3.5 → 0.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d1e7837cb1b7ed5d04e2e1dd4ec57ef6b178700
4
- data.tar.gz: 03dd4e52e6f4643e0e26b276e5364a1db5383020
3
+ metadata.gz: aa1f26f00a6e37eddbd191f4c07e20cd6549403d
4
+ data.tar.gz: 22e2442da385848cb8836ede71d6f747bf8f8cf9
5
5
  SHA512:
6
- metadata.gz: 4b20ef9d1b10bce4404316914c84fd5e64876d46f40990e57c4cc3fda3af50d99fceb8d2c2b627adafd94aa034b1b24e049cf81afa2cd437944d750f46763f3d
7
- data.tar.gz: 0c6656397a1c0b102fddfe341e679fce18c79788ed250112ffdc0325cb8487c7832bdd46f4a845f25294823e65f49e6b935dc84ff1c434cb3db97766771314fd
6
+ metadata.gz: 2c98b789d6a3299aa7494eefcf0b291be7aa7769015006d9984748f1c8ba39a282fe0ad997913dcb89e89a1f75fa231eac27d242a15ca7e07f8af619e65d16d0
7
+ data.tar.gz: 8996afcb18cd0c8cd8d26c08dd53f637f12f0dd3932b37a414a1ccfae9915ae2e2d00545cf0598317e4411c371e0f8ff4562887ee17e65f6a9d6586906223870
data/README.md CHANGED
@@ -40,6 +40,17 @@ require 'circuitdata'
40
40
  2.3.0 :009 > # Turn off validation against the schema
41
41
  2.3.0 :008 > Circuitdata.compatibility_checker( 'testfile-product.json', 'testfile-profile-restricted.json', false )
42
42
  => {:error=>true, :errormessage=>"The product to check did not meet the requirements", :validationserrors=>{}, :restrictederrors=>{"#/open_trade_transfer_package/products/testproduct/printed_circuits_fabrication_data/board/thickness"=>["of type number matched the disallowed schema"]}, :enforcederrors=>{}, :capabilitieserrors=>{}}
43
+ 2.3.0 :005 > # Run a test with several files against each other and get a complete list of values and conflicts, and a summary
44
+ 2.3.0 :006 > product1 = File.join(File.dirname(__FILE__), 'test/test_data/test_product1.json')
45
+ => "./test/test_data/test_product1.json"
46
+ 2.3.0 :007 > profile_restricted = File.join(File.dirname(__FILE__), 'test/test_data/testfile-profile-restricted.json')
47
+ => "./test/test_data/testfile-profile-restricted.json"
48
+ 2.3.0 :008 > profile_default = File.join(File.dirname(__FILE__), 'test/test_data/testfile-profile-default.json')
49
+ => "./test/test_data/testfile-profile-default.json"
50
+ 2.3.0 :009 > file_hash = {product1: product1, restricted: profile_restricted, default: profile_default}
51
+ => {:product1=>"./test/test_data/test_product1.json", :restricted=>"./test/test_data/testfile-profile-restricted.json", :default=>"./test/test_data/testfile-profile-default.json"}
52
+ 2.3.0 :010 > Circuitdata.compare_files(file_hash, true)
53
+ => {:error=>false, :message=>nil, :conflict=>false, :product_name=>"testproduct", :columns=>[:summary, :product1, :restricted, :default], :master_column=>nil, :rows=>{:rigid_conductive_layer=>{:count=>{:product1=>{:value=>11, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :restricted=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :default=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :summary=>{:value=>11, :conflict=>false, :conflicts_with=>[:product1], :conflict_message=>[]}}, :minimum_external_track_width=>{:product1=>{:value=>0.14, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :restricted=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :default=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :summary=>{:value=>0.14, :conflict=>false, :conflicts_with=>[:product1], :conflict_message=>[]}}, :minimum_external_spacing_width=>{:product1=>{:value=>0.14, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :restricted=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :default=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :summary=>{:value=>0.14, :conflict=>false, :conflicts_with=>[:product1], :conflict_message=>[]}}, :copper_foil_roughness=>{:product1=>{:value=>"L", :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :restricted=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :default=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :summary=>{:value=>"L", :conflict=>false, :conflicts_with=>[:product1], :conflict_message=>[]}}}, :legend=>{:color=>{:product1=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :restricted=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :default=>{:value=>"white", :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :summary=>{:value=>"white", :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}}}, :array=>{:fiducials_number=>{:product1=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :restricted=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :default=>{:value=>3, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :summary=>{:value=>3, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}}, :fiducials_shape=>{:product1=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :restricted=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :default=>{:value=>"circle", :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :summary=>{:value=>"circle", :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}}, :breakaway_method=>{:product1=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :restricted=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :default=>{:value=>"routing", :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :summary=>{:value=>"routing", :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}}, :mouse_bites=>{:product1=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :restricted=>{:value=>nil, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :default=>{:value=>true, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}, :summary=>{:value=>true, :conflict=>false, :conflicts_with=>[], :conflict_message=>[]}}}}}
43
54
  ```
44
55
 
45
56
  ## License
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc "Run tests"
8
+ task :default => :test
data/lib/circuitdata.rb CHANGED
@@ -1,432 +1,120 @@
1
1
  module Circuitdata
2
-
3
-
4
- def self.content(checksjson)
5
- number_of_products = 0
6
- stackup = false
7
- profile_defaults = false
8
- profile_enforced = false
9
- profile_restricted = false
10
- capabilities = false
11
- if checksjson.has_key? "open_trade_transfer_package"
12
- if checksjson["open_trade_transfer_package"].has_key? "products"
13
- if checksjson["open_trade_transfer_package"]["products"].length > 0
14
- number_of_products = checksjson["open_trade_transfer_package"]["products"].length
15
- checksjson["open_trade_transfer_package"]["products"].each do |key, value|
16
- if checksjson["open_trade_transfer_package"]["products"][key].has_key? "stackup"
17
- if checksjson["open_trade_transfer_package"]["products"][key]["stackup"].has_key? "specification_level"
18
- if checksjson["open_trade_transfer_package"]["products"][key]["stackup"]["specification_level"] == "specified"
19
- if checksjson["open_trade_transfer_package"]["products"][key]["stackup"].has_key? "specified"
20
- if checksjson["open_trade_transfer_package"]["products"][key]["stackup"]["specified"].length > 0
21
- stackup = true
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
30
- if checksjson["open_trade_transfer_package"].has_key? "profiles"
31
- if checksjson["open_trade_transfer_package"]["profiles"].has_key? "enforced"
32
- if checksjson["open_trade_transfer_package"]["profiles"]["enforced"].length > 0
33
- profile_enforced = true
34
- end
35
- end
36
- if checksjson["open_trade_transfer_package"]["profiles"].has_key? "restricted"
37
- if checksjson["open_trade_transfer_package"]["profiles"]["restricted"].length > 0
38
- profile_restricted = true
39
- end
40
- end
41
- if checksjson["open_trade_transfer_package"]["profiles"].has_key? "defaults"
42
- if checksjson["open_trade_transfer_package"]["profiles"]["defaults"].length > 0
43
- profile_defaults = true
44
- end
45
- end
2
+ # SHOULD ONLY HOUSE COMMON FUNCTIONS ONLY
3
+ require 'active_support/all'
4
+ require 'circuitdata/file_comparer'
5
+ require 'circuitdata/compatibility_checker'
6
+
7
+ def self.get_data_summary(data)
8
+ types = []
9
+ wrapper = data&.dig(:open_trade_transfer_package)
10
+ types << 'profile_restricted' unless wrapper&.dig(:profiles, :restricted).nil?
11
+ types << 'profile_enforced' unless wrapper&.dig(:profiles, :enforced).nil?
12
+ types << 'profile_defaults' unless wrapper&.dig(:profiles, :defaults).nil?
13
+ types << 'capabilities' unless wrapper&.dig(:capabilities).nil?
14
+
15
+ products = wrapper&.dig(:products)
16
+ product_names = products.nil? ? [] : products.keys# this will return all the product names
17
+ types << 'product' if product_names.any?
18
+ # loop through the products
19
+ products.each do |k, v|
20
+ if v&.dig(:stackup, :specification_level) == 'specified' && !v&.dig(:stackup, :specification_level, :specified).nil?
21
+ types << 'stackup'
46
22
  end
47
- if checksjson["open_trade_transfer_package"].has_key? "capabilities"
48
- if checksjson["open_trade_transfer_package"]["capabilities"].length > 0
49
- capabilities = true
50
- end
51
- end
52
- end
53
- return number_of_products, stackup, profile_defaults, profile_restricted, profile_enforced, capabilities
54
- end
23
+ end unless products.nil?
55
24
 
56
- def self.read_json(content)
25
+ return product_names, types
26
+ end
57
27
 
58
- require 'open-uri'
28
+ def self.read_json(file)
59
29
  require 'json'
30
+ error, message, data = false, nil, nil
60
31
 
61
- error = false
62
- message = ""
63
- returncontent = nil
64
- if content.is_a? Hash
32
+ if file.is_a? Hash
65
33
  begin
66
- returncontent = content
34
+ data = file
35
+ data.deep_symbolize_keys!
67
36
  rescue
68
37
  error = true
69
38
  message = "Could not convert the Hash into JSON"
70
39
  end
71
40
  else
72
41
  begin
73
- open(content) do |f|
74
- returncontent = JSON.parse(f.read)
42
+ open(file) do |f|
43
+ data = JSON.parse(f.read, symbolize_names: true)
75
44
  end
76
45
  rescue
77
46
  error = true
78
47
  message = "Could not read the file"
79
48
  end
80
49
  end
81
- return error, message, returncontent
50
+ return error, message, data
82
51
  end
83
52
 
84
53
  def self.validate(content)
85
54
  require 'json-schema'
86
- $jsonschema_v1 = 'http://schema.circuitdata.org/v1/ottp_circuitdata_schema.json'
87
-
88
- error = false
89
- message = ""
90
- validationserrors = {}
55
+ error, message, validations_errors = false, nil, {}
56
+ schema = File.join(File.dirname(__FILE__), 'circuitdata/schema_files/v1/ottp_circuitdata_schema.json')
57
+ # schema = 'http://schema.circuitdata.org/v1/ottp_circuitdata_schema.json'
91
58
 
92
59
  begin
93
- validated = JSON::Validator.fully_validate($jsonschema_v1, content, :errors_as_objects => true)
60
+ validated = JSON::Validator.fully_validate(schema, content, :errors_as_objects => true)
94
61
  rescue JSON::Schema::ReadFailed
95
- errors = true
96
- message = "Could not read the schema #{$jsonschema_v1}"
62
+ error = true
63
+ message = "Could not read the validating schema"
97
64
  rescue JSON::Schema::SchemaError
98
- errors = true
99
- message = "Something was wrong with the schema #{$jsonschema_v1}"
65
+ error = true
66
+ message = "There is something was wrong with the validating schema"
100
67
  end
101
- unless errors
68
+ unless error
102
69
  if validated.count > 0
103
70
  error = true
104
71
  message = "Could not validate the file against the CircuitData json schema"
105
- validated.each do |valerror|
106
- validationserrors[valerror[:fragment]] = [] unless validationserrors.has_key? valerror[:fragment]
72
+ validated.each do |val_error|
73
+ validations_errors[val_error[:fragment]] = [] unless validations_errors.has_key? val_error[:fragment]
107
74
  begin
108
- scrap, keep, scrap2 = valerror[:message].match("^(The\\sproperty\\s\\'[\\s\\S]*\\'\\s)([\\s\\S]*)(\\sin\\sschema\\sfile[\\s\\S]*)$").captures
75
+ keep = val_error[:message].match("^(The\\sproperty\\s\\'[\\s\\S]*\\'\\s)([\\s\\S]*)(\\sin\\sschema\\sfile[\\s\\S]*)$").captures[1]
109
76
  rescue
110
- keep = valerror[:message]
77
+ keep = val_error[:message]
111
78
  end
112
- validationserrors[valerror[:fragment]] << keep
79
+ validations_errors[val_error[:fragment]] << keep
113
80
  end
114
81
  end
115
82
  end
116
- return error, message, validationserrors
83
+ return error, message, validations_errors
117
84
  end
118
85
 
119
- def self.compare_files(list)
120
- # Will presume that the files are validated
121
- # Prepare the return
122
- ra = {
123
- error: false,
124
- errormessage: "",
125
- summary: {},
126
- conflicts: {},
127
- files: []
128
- }
129
- if not list.is_a? Array
130
- ra[:error] = true
131
- ra[:errormessage] = "You have to feed this function with a list of files or hashes"
132
- return ra
133
- end
134
- list.each do |totest|
135
- error, message, returncontent = self.read_json(totest)
136
- #puts returncontent
137
- ra[:summary] = ra[:summary].merge(returncontent)
138
- ra[:files] << totest
139
- end
140
- return ra
86
+ def self.compare_files(file_hash, validate_origins=false)
87
+ comparer = FileComparer.new(file_hash, validate_origins)
88
+ comparer.compare
141
89
  end
142
90
 
143
- def self.compatibility_checker( productfile, checksfile=nil, validate_origins=true )
144
-
145
- require 'open-uri'
146
- require 'json'
147
- require 'json-schema'
148
-
149
- $jsonschema_v1 = 'http://schema.circuitdata.org/v1/ottp_circuitdata_schema.json'
150
-
151
- # prepare the return
152
- returnarray = {
153
- error: false,
154
- errormessage: "",
155
- validationserrors: {},
156
- restrictederrors: {},
157
- enforcederrors: {},
158
- capabilitieserrors: {},
159
- contains: {
160
- file1: {
161
- products: 0,
162
- stackup: false,
163
- profile_defaults: false,
164
- profile_enforced: false,
165
- profile_restricted: false,
166
- capabilities: false
167
- },
168
- file2: {
169
- products: 0,
170
- stackup: false,
171
- profile_defaults: false,
172
- profile_enforced: false,
173
- profile_restricted: false,
174
- capabilities: false
175
- }
176
- }
177
- }
178
-
179
- # Check the files or hashes
180
- #
181
- returnarray[:error], returnarray[:errormessage], json_productfile = self.read_json(productfile)
182
- return returnarray if returnarray[:error]
183
- if not checksfile.nil?
184
- returnarray[:error], returnarray[:errormessage], json_checksfile = self.read_json(checksfile)
185
- return returnarray if returnarray[:error]
186
- end
187
-
188
- # Validate the original files against the CircuitData schema
189
- if validate_origins
190
- returnarray[:error], returnarray[:errormessage], returnarray[:validationserrors] = self.validate(json_productfile)
191
- return returnarray if returnarray[:error]
192
- if not checksfile.nil?
193
- returnarray[:error], returnarray[:errormessage], returnarray[:validationserrors] = self.validate(json_checksfile)
194
- return returnarray if returnarray[:error]
195
- end
196
- end
197
-
198
- # Check against the content
199
- returnarray[:contains][:file1][:products], returnarray[:contains][:file1][:stackup], returnarray[:contains][:file1][:profile_defaults], returnarray[:contains][:file1][:profile_restricted], returnarray[:contains][:file1][:profile_enforced], returnarray[:contains][:file1][:capabilities] = self.content(json_productfile)
200
- if not checksfile.nil?
201
- returnarray[:contains][:file2][:products], returnarray[:contains][:file2][:stackup], returnarray[:contains][:file2][:profile_defaults], returnarray[:contains][:file2][:profile_restricted], returnarray[:contains][:file2][:profile_enforced], returnarray[:contains][:file2][:capabilities] = self.content(json_checksfile)
202
- end
203
-
204
- if not checksfile.nil?
205
-
206
- # Create the JSON
207
- restrictedschema = enforcedschema = capabilityschema = {
208
- "$schema": "http://json-schema.org/draft-04/schema#",
209
- "type": "object",
210
- "additionalProperties": false,
211
- "required": ["open_trade_transfer_package"],
212
- "properties": {
213
- "open_trade_transfer_package": {
214
- "type": "object",
215
- "properties": {
216
- "version": {
217
- "type": "string",
218
- "pattern": "^1.0$"
219
- },
220
- "information": {
221
- "$ref": "https://raw.githubusercontent.com/elmatica/Open-Trade-Transfer-Package/master/v1/ottp_schema_definitions.json#/definitions/information"
222
- },
223
- "products": {
224
- "type": "object",
225
- "properties": {
226
- "generic": {
227
- "type": "object",
228
- "properties": {},
229
- "id": "generic",
230
- "description": "this should validate any element under generic to be valid"
231
- }
232
- },
233
- "patternProperties": {
234
- "^(?!generic$).*": {
235
- "type": "object",
236
- "required": ["printed_circuits_fabrication_data"],
237
- "properties": {
238
- "printed_circuits_fabrication_data": {
239
- "type": "object",
240
- "required": ["version"],
241
- "properties": {
242
- "stackup": {
243
- "type": "object",
244
- "properties": {
245
- "specified": {
246
- "type": "object",
247
- "properties": {
248
- }
249
- }
250
- }
251
- }
252
- }
253
- }
254
- }
255
- }
256
- }
257
- }
258
- }
259
- }
260
- }
261
- }
262
-
263
- if returnarray[:contains][:file1][:product] or returnarray[:contains][:file1][:stackup]
264
- # RUN THROUGH THE ENFORCED
265
- if returnarray[:contains][:file2][:profile_enforced]
266
- json_checksfile["open_trade_transfer_package"]["profiles"]["enforced"]["printed_circuits_fabrication_data"].each do |key, value|
267
- if json_checksfile["open_trade_transfer_package"]["profiles"]["enforced"]["printed_circuits_fabrication_data"][key].is_a? Hash
268
- json_checksfile["open_trade_transfer_package"]["profiles"]["enforced"]["printed_circuits_fabrication_data"][key].each do |subkey, subvalue|
269
- enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym] = {:type => "object", :properties => {} } unless enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties].has_key? key.to_sym
270
- enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym] = {:type => "object", :properties => {} } unless enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties].has_key? key.to_sym
271
- if subvalue.is_a? String
272
- if subvalue.match("^(\\d*|\\d*.\\d*)\\.\\.\\.(\\d*|\\d*.\\d*)$") #This is a value range
273
- from, too = subvalue.match("^(\\d*|\\d*.\\d*)\\.\\.\\.(\\d*|\\d*.\\d*)$").captures
274
- newhash = eval("{:minimum => #{from}, :maximum => #{too}}")
275
- enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
276
- enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
277
- else # This is a normal string - check for commas
278
- enum = []
279
- subvalue.split(',').each { |enumvalue| enum << enumvalue.strip }
280
- enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym][:properties][subkey.to_sym] = eval("{:enum => #{enum}}")
281
- enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym][:properties][subkey.to_sym] = eval("{:enum => #{enum}}")
282
- end
283
- elsif subvalue.is_a? Numeric # This is a normal string
284
- enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym][:properties][subkey.to_sym] = eval("{:enum => [#{subvalue.to_s}]}")
285
- enforcedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym][:properties][subkey.to_sym] = eval("{:enum => [#{subvalue.to_s}]}")
286
- end
287
- end
288
- end
289
- end
290
- begin
291
- enforcedvalidate = JSON::Validator.fully_validate(enforcedschema.to_json, json_productfile, :errors_as_objects => true)
292
- rescue JSON::Schema::ReadFailed
293
- $errors = true
294
- returnarray[:error] = true
295
- returnarray[:errormessage] = "Could not read the schema #{$jsonschema_v1}"
296
- rescue JSON::Schema::SchemaError
297
- $errors = true
298
- returnarray[:error] = true
299
- returnarray[:errormessage] = "Something was wrong with the schema #{$jsonschema_v1}"
300
- end
301
- unless $errors
302
- if enforcedvalidate.count > 0
303
- returnarray[:error] = true
304
- returnarray[:errormessage] = "The product to check did not meet the requirements"
305
- enforcedvalidate.each do |valerror|
306
- returnarray[:enforcederrors][valerror[:fragment]] = [] unless returnarray[:enforcederrors].has_key? valerror[:fragment]
307
- begin
308
- scrap, keep, scrap2 = valerror[:message].match("^(The\\sproperty\\s\\'[\\s\\S]*\\'\\s)([\\s\\S]*)(\\sin\\sschema[\\s\\S]*)$").captures
309
- rescue
310
- keep = valerror[:message]
311
- end
312
- returnarray[:enforcederrors][valerror[:fragment]] << keep
313
- end
314
- end
315
- end
316
- end
317
- # RUN THROUGH THE RESTRICTED
318
- if returnarray[:contains][:file2][:profile_restricted]
319
- json_checksfile["open_trade_transfer_package"]["profiles"]["restricted"]["printed_circuits_fabrication_data"].each do |key, value|
320
- if json_checksfile["open_trade_transfer_package"]["profiles"]["restricted"]["printed_circuits_fabrication_data"][key].is_a? Hash
321
- json_checksfile["open_trade_transfer_package"]["profiles"]["restricted"]["printed_circuits_fabrication_data"][key].each do |subkey, subvalue|
322
- restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym] = {:type => "object", :properties => {} } unless restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties].has_key? key.to_sym
323
- restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym] = {:type => "object", :properties => {} } unless restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties].has_key? key.to_sym
324
- if subvalue.is_a? String
325
- if subvalue.match("^(\\d*|\\d*.\\d*)\\.\\.\\.(\\d*|\\d*.\\d*)$") #This is a value range
326
- from, too = subvalue.match("^(\\d*|\\d*.\\d*)\\.\\.\\.(\\d*|\\d*.\\d*)$").captures
327
- newhash = {:not => {:allOf => [{:minimum => from.to_f},{:maximum => too.to_f}]}}
328
- restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
329
- restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
330
- else # This is a normal string - check for commas
331
- newhash = {:not => {:anyOf => [{ :enum => ""}]}}
332
- enum = []
333
- subvalue.split(',').each { |enumvalue| enum << enumvalue.strip }
334
- newhash[:not][:anyOf][0][:enum] = enum
335
- restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
336
- restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
337
- end
338
- elsif subvalue.is_a? Numeric # This is a normal string
339
- newhash = {:not => {:allOf => [{:minimum => subvalue.to_f},{:maximum => subvalue.to_f}]}}
340
- restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
341
- restrictedschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
342
- end
343
- end
344
- end
345
- end
346
- begin
347
- restrictedvalidate = JSON::Validator.fully_validate(restrictedschema.to_json, json_productfile, :errors_as_objects => true)
348
- rescue JSON::Schema::ReadFailed
349
- $errors = true
350
- returnarray[:error] = true
351
- returnarray[:errormessage] = "Could not read the schema #{$jsonschema_v1}"
352
- rescue JSON::Schema::SchemaError
353
- $errors = true
354
- returnarray[:error] = true
355
- returnarray[:errormessage] = "Something was wrong with the schema #{$jsonschema_v1}"
356
- end
357
- unless $errors
358
- if restrictedvalidate.count > 0
359
- returnarray[:error] = true
360
- returnarray[:errormessage] = "The product to check did not meet the requirements"
361
- restrictedvalidate.each do |valerror|
362
- returnarray[:restrictederrors][valerror[:fragment]] = [] unless returnarray[:restrictederrors].has_key? valerror[:fragment]
363
- begin
364
- scrap, keep, scrap2 = valerror[:message].match("^(The\\sproperty\\s\\'[\\s\\S]*\\'\\s)([\\s\\S]*)(\\sin\\sschema[\\s\\S]*)$").captures
365
- rescue
366
- keep = valerror[:message]
367
- end
368
- returnarray[:restrictederrors][valerror[:fragment]] << keep
369
- end
370
- end
371
- end
372
- end
373
- # RUN THROUGH THE CAPABILITIES
374
- if returnarray[:contains][:file2][:capabilities]
375
- json_checksfile["open_trade_transfer_package"]["capabilities"]["printed_circuits_fabrication_data"].each do |key, value|
376
- if json_checksfile["open_trade_transfer_package"]["capabilities"]["printed_circuits_fabrication_data"][key].is_a? Hash
377
- json_checksfile["open_trade_transfer_package"]["capabilities"]["printed_circuits_fabrication_data"][key].each do |subkey, subvalue|
378
- capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym] = {:type => "object", :properties => {} } unless capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties].has_key? key.to_sym
379
- capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym] = {:type => "object", :properties => {} } unless capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties].has_key? key.to_sym
380
- if subvalue.is_a? String
381
- if subvalue.match("^(\\d*|\\d*.\\d*)\\.\\.\\.(\\d*|\\d*.\\d*)$") #This is a value range
382
- from, too = subvalue.match("^(\\d*|\\d*.\\d*)\\.\\.\\.(\\d*|\\d*.\\d*)$").captures
383
- newhash = eval("{:minimum => #{from}, :maximum => #{too}}")
384
- capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
385
- capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym][:properties][subkey.to_sym] = newhash
386
- else # This is a normal string - check for commas
387
- enum = []
388
- subvalue.split(',').each { |enumvalue| enum << enumvalue.strip }
389
- capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym][:properties][subkey.to_sym] = eval("{:enum => #{enum}}")
390
- capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym][:properties][subkey.to_sym] = eval("{:enum => #{enum}}")
391
- end
392
- elsif subvalue.is_a? Numeric # This is a normal string
393
- capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][key.to_sym][:properties][subkey.to_sym] = eval("{:enum => [#{subvalue.to_s}]}")
394
- capabilityschema[:properties][:open_trade_transfer_package][:properties][:products][:patternProperties][:"^(?!generic$).*"][:properties][:printed_circuits_fabrication_data][:properties][:stackup][:properties][:specified][:properties][key.to_sym][:properties][subkey.to_sym] = eval("{:enum => [#{subvalue.to_s}]}")
395
- end
396
- end
397
- end
398
- end
399
- begin
400
- capabilitiesvalidate = JSON::Validator.fully_validate(capabilityschema.to_json, json_productfile, :errors_as_objects => true)
401
- rescue JSON::Schema::ReadFailed
402
- $errors = true
403
- returnarray[:error] = true
404
- returnarray[:errormessage] = "Could not read the schema #{$jsonschema_v1}"
405
- rescue JSON::Schema::SchemaError
406
- $errors = true
407
- returnarray[:error] = true
408
- returnarray[:errormessage] = "Something was wrong with the schema #{$jsonschema_v1}"
409
- end
410
- unless $errors
411
- if capabilitiesvalidate.count > 0
412
- returnarray[:error] = true
413
- returnarray[:errormessage] = "The product to check did not meet the requirements"
414
- capabilitiesvalidate.each do |valerror|
415
- returnarray[:capabilitieserrors][valerror[:fragment]] = [] unless returnarray[:capabilitieserrors].has_key? valerror[:fragment]
416
- begin
417
- scrap, keep, scrap2 = valerror[:message].match("^(The\\sproperty\\s\\'[\\s\\S]*\\'\\s)([\\s\\S]*)(\\sin\\sschema[\\s\\S]*)$").captures
418
- rescue
419
- keep = valerror[:message]
420
- end
421
- returnarray[:capabilitieserrors][valerror[:fragment]] << keep
422
- end
423
- end
424
- end
425
- end
426
- end
427
- end
428
-
429
- return returnarray
91
+ def self.compatibility_checker(product_file, check_file=nil, validate_origins=false)
92
+ checker = CompatibilityChecker.new(product_file, check_file, validate_origins)
93
+ checker.start_check
94
+ end
430
95
 
96
+ def self.test
97
+ product1 = File.join(File.dirname(__FILE__), '../test/test_data/test_product1.json')
98
+ product2 = File.join(File.dirname(__FILE__), '../test/test_data/test_product2.json')
99
+ profile_restricted = File.join(File.dirname(__FILE__), '../test/test_data/testfile-profile-restricted.json')
100
+ profile_enforced = File.join(File.dirname(__FILE__), '../test/test_data/testfile-profile-enforced.json')
101
+ profile_default = File.join(File.dirname(__FILE__), '../test/test_data/testfile-profile-default.json')
102
+ capabilities = File.join(File.dirname(__FILE__), '../test/test_data/testfile-capability.json')
103
+
104
+ # TEST WITH NON SCHEMA COMPATIBLE JSON
105
+ # puts 'testing validation with non schema compatible json'
106
+ # puts Circuitdata.compatibility_checker(fail_product)
107
+ # puts "\n"
108
+
109
+ # TEST THE COMPATIBILITY CHECKER FUNCTION FIRST:
110
+ puts "\nTesting compatibility_checker: - the capabilities"
111
+ puts Circuitdata.compatibility_checker(product1, capabilities)
112
+ puts "\n"
113
+
114
+ # THEN TEST THE COMPARE FILES:
115
+ puts "Testing file comparison"
116
+ # file_hash = {product1: product1, product2: product2, restricted: profile_restricted, enforced: profile_enforced, default: profile_default, capability: capabilities}
117
+ file_hash = {product1: product1, product2: product2, restricted: profile_restricted, enforced: profile_enforced, default: profile_default}
118
+ Circuitdata.compare_files(file_hash, true)
431
119
  end
432
120
  end