joseph 0.1.0 → 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.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +97 -2
  3. data/.gitlab-ci.yml +21 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +2 -2
  6. data/{MIT-LICENSE → LICENSE.txt} +3 -1
  7. data/README.md +33 -7
  8. data/Rakefile +4 -21
  9. data/examples/fiducials.rb +31 -0
  10. data/examples/panelize.rb +36 -0
  11. data/joseph.gemspec +25 -18
  12. data/lib/core_extensions/float/conversions.rb +13 -0
  13. data/lib/core_extensions/integer/conversions.rb +9 -0
  14. data/lib/joseph.rb +25 -29
  15. data/lib/joseph/aperture.rb +12 -0
  16. data/lib/joseph/bridge.rb +45 -0
  17. data/lib/joseph/cirseg.rb +11 -0
  18. data/lib/joseph/file_info.rb +17 -0
  19. data/lib/joseph/gdk_color.rb +35 -0
  20. data/lib/joseph/image.rb +143 -0
  21. data/lib/joseph/image_info.rb +25 -0
  22. data/lib/joseph/knockout.rb +13 -0
  23. data/lib/joseph/layer.rb +11 -0
  24. data/lib/joseph/net.rb +38 -0
  25. data/lib/joseph/project.rb +87 -0
  26. data/lib/joseph/render_info.rb +11 -0
  27. data/lib/joseph/render_size.rb +50 -0
  28. data/lib/joseph/step_and_repeat.rb +9 -0
  29. data/lib/joseph/user_transformation.rb +18 -0
  30. data/lib/joseph/version.rb +1 -1
  31. data/spec/assets/3_hat.boardoutline.ger +1628 -0
  32. data/spec/assets/3_hat.bottomlayer.ger +2038 -0
  33. data/spec/assets/3_hat.toplayer.ger +3103 -0
  34. data/spec/assets/test.EXTREP +20 -0
  35. data/spec/assets/test_wrong.GBL +20 -0
  36. data/spec/assets/vesc-capbank.topsilkscreen.ger +520 -0
  37. data/spec/bridge_spec.rb +10 -0
  38. data/spec/image_spec.rb +75 -0
  39. data/spec/project_spec.rb +48 -0
  40. data/spec/render_size_spec.rb +25 -0
  41. data/spec/results/bottomlayer_mirrored.png +0 -0
  42. data/spec/results/toplayer_as_png.png +0 -0
  43. data/spec/spec_helper.rb +16 -0
  44. metadata +172 -79
  45. data/Gemfile.lock +0 -26
  46. data/example.rb +0 -32
  47. data/spec/joseph_spec.rb +0 -32
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ # Most specs are using the bridge class, thus binding spec itself is quite empty
4
+ describe Bridge do
5
+ it 'should create a new gerbv project' do
6
+ project = Bridge.gerbv_create_project
7
+ expect(project).to be_a(Project)
8
+ end
9
+
10
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe Project do
4
+ it 'should draw primitives on a new image' do
5
+ image = Image.create
6
+ expect(image.net_count).to eq(0)
7
+
8
+ Bridge.gerbv_image_create_line_object(image, 0, 0, 10, 10, 0.0, :circle)
9
+ Bridge.gerbv_image_create_line_object(image, 0, 0, 0, 10, 0.1, :circle)
10
+ Bridge.gerbv_image_create_rectangle_object(image, 5, 0, 1, 1)
11
+ Bridge.gerbv_image_create_arc_object(image, 0, 5, 1, 0, 360, 0.0, :circle)
12
+ expect(image.net_count).to eq(7)
13
+
14
+ output = image.to_output
15
+ expect(Digest::SHA1.hexdigest(output.data)).to eq('5151086a6458b7ead0d6e023bbdcd89d6382fcad')
16
+
17
+ image.destroy!
18
+ end
19
+
20
+
21
+ it 'should copy one image into another' do
22
+ project = Project.create
23
+ project.add_file('./spec/assets/3_hat.toplayer.ger', :toplayer)
24
+
25
+ source = project.file(:toplayer).image
26
+ destination = Image.create
27
+
28
+ expect(source.net_count).to eq(2235)
29
+ expect(destination.net_count).to eq(0)
30
+
31
+ destination.add source
32
+ expect(destination.net_count).to eq(2235)
33
+
34
+ t = Benchmark.realtime do
35
+ 100.times { |i| destination.add source }
36
+ end
37
+ expect(t).to be <= 5
38
+ end
39
+
40
+ it 'should combine silkscreen' do
41
+ project = Project.create
42
+ project.add_file './spec/assets/vesc-capbank.topsilkscreen.ger', :topsilkscreen
43
+ project.add_file './spec/assets/vesc-capbank.topsilkscreen.ger', :topsilkscreen
44
+
45
+ image = Image.create
46
+ image.add(project.file(0).image)
47
+
48
+ transform = UserTransformation.new
49
+ transform[:translate_x] = 2
50
+ image.add(project.file(1).image, transform)
51
+
52
+
53
+ output = image.to_output
54
+ expect(Digest::SHA1.hexdigest(output.data)).to eq('6eee0d137fa6c089a1c82a03fcc567cbbe06c1eb')
55
+ end
56
+
57
+ it 'should create a new image an add layers' do
58
+ image = Image.create
59
+ expect(image.layer_count).to eq(1)
60
+ Bridge.gerbv_image_return_new_layer(image.last_layer)
61
+ expect(image.layer_count).to eq(2)
62
+ image.destroy!
63
+ end
64
+
65
+
66
+ it 'should get all nets and layers within an image', focus: true do
67
+ project = Project.create
68
+ project.add_file './spec/assets/3_hat.toplayer.ger', :toplayer
69
+ image = project.file(0).image
70
+ expect(image.net_count).to eq(2235)
71
+ expect(image.layer_count).to eq(2)
72
+ project.destroy!
73
+ end
74
+
75
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Project do
4
+ it 'should create a new project and add a file' do
5
+ project = Project.create
6
+ expect(project).to be_a(Project)
7
+
8
+ project.add_file('./spec/assets/3_hat.toplayer.ger', :toplayer)
9
+ expect(project.index[:toplayer]).to be_truthy
10
+ expect(project.file(:toplayer)).to be_a(FileInfo)
11
+ expect(project.file(:bottomlayer)).to be_falsey
12
+ end
13
+
14
+ it 'should export a project to PNG' do
15
+ project = Project.create
16
+ project.add_file('./spec/assets/3_hat.toplayer.ger', :toplayer)
17
+
18
+ output = project.to_png
19
+ expect(output.data).to be_same_image_as(IO.read('./spec/results/toplayer_as_png.png'))
20
+ end
21
+
22
+ it 'should export a project mirrored with bounding box to PNG' do
23
+ project = Project.create
24
+ project.add_file('./spec/assets/3_hat.bottomlayer.ger', :bottomlayer)
25
+ project.file(0)[:transform][:mirror_around_y] = 1
26
+
27
+ output = project.to_png(mirror: true, bb: RenderSize.from_image(project.file(0).image))
28
+ expect(output.data).to be_same_image_as(IO.read('./spec/results/bottomlayer_mirrored.png'))
29
+ end
30
+
31
+ it 'should detect if file is invalid' do
32
+ project = Project.create
33
+ expect(project[:last_loaded]).to eq(-1)
34
+ project.add_file './spec/assets/test.EXTREP', :dummy # invalid file with invalid extension
35
+ expect(project[:last_loaded]).to eq(-1)
36
+ project.add_file './spec/assets/test_wrong.GBL', :dummy # invalid file with valid extension
37
+ expect(project[:last_loaded]).to eq(-1)
38
+ expect(project.index.length).to eq(0)
39
+ project.add_file './spec/assets/3_hat.toplayer.ger', :dummy # valid file
40
+ expect(project[:last_loaded]).to eq(0)
41
+ project.add_file './spec/assets/test.EXTREP', :dummy # invalid file with invalid extension
42
+ expect(project[:last_loaded]).to eq(0)
43
+ project.add_file './spec/assets/test_wrong.GBL', :dummy # invalid file with valid extension
44
+ expect(project[:last_loaded]).to eq(0)
45
+ expect(project.index.length).to eq(1)
46
+ end
47
+
48
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe RenderSize do
4
+ it 'should get PCB dimensions' do
5
+ rs = RenderSize.new
6
+ rs[:right] = 10
7
+ rs[:left] = -10
8
+ rs[:top] = 20
9
+ rs[:bottom] = -20
10
+ expect(rs.valid?).to be_truthy
11
+ expect(rs.width).to eq(20)
12
+ expect(rs.height).to eq(40)
13
+
14
+
15
+ project = Project.create
16
+ project.add_file('./spec/assets/3_hat.boardoutline.ger', :boardoutline)
17
+
18
+ rs = RenderSize.from_image(project.file(0).image)
19
+ expect(rs.right).to be_within(0.001).of(2.609)
20
+ expect(rs.left).to be_within(0.001).of(0.05)
21
+ expect(rs.top).to be_within(0.001).of(0.05)
22
+ expect(rs.bottom).to be_within(0.001).of(2.254)
23
+ end
24
+
25
+ end
@@ -0,0 +1,16 @@
1
+ require 'digest/md5'
2
+ require 'chunky_png'
3
+ require 'benchmark'
4
+ require 'matrix'
5
+
6
+ require 'joseph'
7
+ include Joseph
8
+
9
+ RSpec::Matchers.define(:be_same_image_as) do |expected_data|
10
+ match do |actual_data|
11
+ actual = ChunkyPNG::Datastream.from_blob actual_data
12
+ expected = ChunkyPNG::Datastream.from_blob expected_data
13
+
14
+ Digest::MD5.hexdigest(actual.imagedata) == Digest::MD5.hexdigest(expected.imagedata)
15
+ end
16
+ end
metadata CHANGED
@@ -1,106 +1,199 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: joseph
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 0
9
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
10
5
  platform: ruby
11
- authors:
12
- - Martin Schuerrer
6
+ authors:
7
+ - Patrick Franken
8
+ - AISLER B.V.
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2010-12-10 00:00:00 +01:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: rspec
22
- requirement: &id001 !ruby/object:Gem::Requirement
23
- none: false
24
- requirements:
25
- - - ~>
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 2
29
- - 1
30
- - 0
31
- version: 2.1.0
12
+ date: 2017-02-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ffi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.9'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.9'
28
+ - !ruby/object:Gem::Dependency
29
+ name: ramdo
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '0.2'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '0.2'
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
32
49
  type: :development
33
50
  prerelease: false
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
36
57
  name: rake
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- none: false
39
- requirements:
40
- - - ~>
41
- - !ruby/object:Gem::Version
42
- segments:
43
- - 0
44
- - 8
45
- - 7
46
- version: 0.8.7
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: geminabox
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: chunky_png
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
47
105
  type: :development
48
106
  prerelease: false
49
- version_requirements: *id002
50
- description: Yet another take on application configuration
51
- email:
52
- - martin@schuerrer.org
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ description: Read, modify and writer Gerber RS274X files with ruby using libgerbv
113
+ bindings and some sugar.
114
+ email:
115
+ - p.franken@aisler.net
53
116
  executables: []
54
-
55
117
  extensions: []
56
-
57
118
  extra_rdoc_files: []
58
-
59
- files:
60
- - .gitignore
119
+ files:
120
+ - ".gitignore"
121
+ - ".gitlab-ci.yml"
122
+ - ".ruby-version"
61
123
  - Gemfile
62
- - Gemfile.lock
63
- - MIT-LICENSE
124
+ - LICENSE.txt
64
125
  - README.md
65
126
  - Rakefile
66
- - example.rb
127
+ - examples/fiducials.rb
128
+ - examples/panelize.rb
67
129
  - joseph.gemspec
130
+ - lib/core_extensions/float/conversions.rb
131
+ - lib/core_extensions/integer/conversions.rb
68
132
  - lib/joseph.rb
133
+ - lib/joseph/aperture.rb
134
+ - lib/joseph/bridge.rb
135
+ - lib/joseph/cirseg.rb
136
+ - lib/joseph/file_info.rb
137
+ - lib/joseph/gdk_color.rb
138
+ - lib/joseph/image.rb
139
+ - lib/joseph/image_info.rb
140
+ - lib/joseph/knockout.rb
141
+ - lib/joseph/layer.rb
142
+ - lib/joseph/net.rb
143
+ - lib/joseph/project.rb
144
+ - lib/joseph/render_info.rb
145
+ - lib/joseph/render_size.rb
146
+ - lib/joseph/step_and_repeat.rb
147
+ - lib/joseph/user_transformation.rb
69
148
  - lib/joseph/version.rb
70
- - spec/joseph_spec.rb
71
- has_rdoc: true
72
- homepage: http://schuerrer.org
73
- licenses: []
74
-
149
+ - spec/assets/3_hat.boardoutline.ger
150
+ - spec/assets/3_hat.bottomlayer.ger
151
+ - spec/assets/3_hat.toplayer.ger
152
+ - spec/assets/test.EXTREP
153
+ - spec/assets/test_wrong.GBL
154
+ - spec/assets/vesc-capbank.topsilkscreen.ger
155
+ - spec/bridge_spec.rb
156
+ - spec/image_spec.rb
157
+ - spec/project_spec.rb
158
+ - spec/render_size_spec.rb
159
+ - spec/results/bottomlayer_mirrored.png
160
+ - spec/results/toplayer_as_png.png
161
+ - spec/spec_helper.rb
162
+ homepage: http://aisler.net
163
+ licenses:
164
+ - MIT
165
+ metadata: {}
75
166
  post_install_message:
76
167
  rdoc_options: []
77
-
78
- require_paths:
168
+ require_paths:
79
169
  - lib
80
- required_ruby_version: !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
83
172
  - - ">="
84
- - !ruby/object:Gem::Version
85
- hash: -4549066023595521108
86
- segments:
87
- - 0
88
- version: "0"
89
- required_rubygems_version: !ruby/object:Gem::Requirement
90
- none: false
91
- requirements:
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
92
177
  - - ">="
93
- - !ruby/object:Gem::Version
94
- hash: -4549066023595521108
95
- segments:
96
- - 0
97
- version: "0"
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
98
180
  requirements: []
99
-
100
181
  rubyforge_project:
101
- rubygems_version: 1.3.7
182
+ rubygems_version: 2.5.2
102
183
  signing_key:
103
- specification_version: 3
104
- summary: Yet another take on application configuration
105
- test_files:
106
- - spec/joseph_spec.rb
184
+ specification_version: 4
185
+ summary: Make working with gerber files great again
186
+ test_files:
187
+ - spec/assets/3_hat.boardoutline.ger
188
+ - spec/assets/3_hat.bottomlayer.ger
189
+ - spec/assets/3_hat.toplayer.ger
190
+ - spec/assets/test.EXTREP
191
+ - spec/assets/test_wrong.GBL
192
+ - spec/assets/vesc-capbank.topsilkscreen.ger
193
+ - spec/bridge_spec.rb
194
+ - spec/image_spec.rb
195
+ - spec/project_spec.rb
196
+ - spec/render_size_spec.rb
197
+ - spec/results/bottomlayer_mirrored.png
198
+ - spec/results/toplayer_as_png.png
199
+ - spec/spec_helper.rb