engineering 0.3 → 0.4
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 +13 -5
- data/README.markdown +8 -5
- data/engineering.gemspec +4 -4
- data/lib/builder/model.rb +10 -8
- data/lib/model.rb +23 -0
- data/lib/model/dsl.rb +11 -0
- data/test/builder/model.rb +41 -0
- data/test/model.rb +27 -0
- metadata +26 -47
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWFiMzc4YTE4YmIxMTc2MmZlYzNiNTcwZDcyMDhmYjkxODE4MDRmYg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YTVhOWE2ODI0MjQ4OTM5N2Q5MjMzZWQ0NzU3NWFhM2MzODJmMmYzNg==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MWVlMmM5M2QzY2YzNzU2MjFhZTNkOTA0NjE4NjgyZmYxMjU1YzY2NDhkZTJh
|
10
|
+
MWIyZWNlNzNlNTY3N2Q0MmNmZDU4NTNlZjA4YjQ0M2UzMTI1M2IwNmZjMDBj
|
11
|
+
YzgxOGFmZDQyNGQ3NTdhYzEyZjMxZTU1ZTBlZWM2ZGExZmY5MjU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NjE1ZDE1ODkyOGVmM2QyZjhhMWIxZWI4ZDMzNjY4NGQ1MDVjMGU3N2NjY2E5
|
14
|
+
NzUyZmI3MTM0NTQ2NTgzOGY3NmI2YzNiOGZhMWIwMzY2ZDg1Y2Q1YjM5MmMw
|
15
|
+
MGU4MzYwYjk3YTE1OWJhM2QwMmRhYTY0ODVlZDlmYjMzOWUwMmE=
|
data/README.markdown
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
Engineering for Ruby
|
2
2
|
====================
|
3
3
|
|
4
|
+
[](https://travis-ci.org/bfoz/engineering)
|
5
|
+
[](http://badge.fury.io/rb/engineering)
|
6
|
+
|
4
7
|
This is a meta-gem for all things related to engineering (particularly CAD stuff). The Engineering module
|
5
8
|
is your one stop shop for all of the tools you need for your latest mad-engineering project.
|
6
9
|
|
@@ -11,11 +14,6 @@ that isn't in Engineering, either let me know, or fork and add it yourself (and
|
|
11
14
|
send me a pull request). Or feel free to create your own gem that reopens
|
12
15
|
the module and adds whatever is missing, if that's more your style.
|
13
16
|
|
14
|
-
License
|
15
|
-
-------
|
16
|
-
|
17
|
-
Copyright 2012-2014 Brandon Fosdick <bfoz@bfoz.net> and released under the BSD license.
|
18
|
-
|
19
17
|
Dependencies
|
20
18
|
------------
|
21
19
|
|
@@ -107,3 +105,8 @@ Once a Model has been defined, it can be instantiated and exported to SketchUp w
|
|
107
105
|
SketchUp.write('MyCube.su', MyCube.new)
|
108
106
|
|
109
107
|
Then, launch SketchUp, open the _Ruby Console_ (it's in the Window menu), and _load 'MyCube.su'_. Your new geometry will replace whatever was already in the SketchUp document (a person if you just opened it), so be careful.
|
108
|
+
|
109
|
+
License
|
110
|
+
-------
|
111
|
+
|
112
|
+
Copyright 2012-2015 by [Brandon Fosdick](bfoz@bfoz.net) and released under the [BSD license](http://opensource.org/licenses/BSD-2-Clause).
|
data/engineering.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "engineering"
|
6
|
-
s.version = '0.
|
6
|
+
s.version = '0.4'
|
7
7
|
s.authors = ["Brandon Fosdick"]
|
8
8
|
s.email = ["bfoz@bfoz.net"]
|
9
9
|
s.homepage = "http://github.com/bfoz/engineering"
|
@@ -18,10 +18,10 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
20
|
s.add_dependency 'dxf', '~> 0.3'
|
21
|
-
s.add_dependency 'geometry', '~> 6.
|
22
|
-
s.add_dependency 'model', '~> 0.
|
21
|
+
s.add_dependency 'geometry', '~> 6.5'
|
22
|
+
s.add_dependency 'model', '~> 0.3'
|
23
23
|
s.add_dependency 'sketch', '~> 0.4'
|
24
|
-
s.add_dependency 'units', '~>
|
24
|
+
s.add_dependency 'units', '~> 3.0'
|
25
25
|
|
26
26
|
s.required_ruby_version = '>= 2.0'
|
27
27
|
end
|
data/lib/builder/model.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require_relative '../model'
|
3
2
|
require_relative '../model/dsl'
|
4
3
|
require_relative 'extrusion'
|
5
4
|
|
@@ -7,7 +6,7 @@ module Engineering
|
|
7
6
|
module Builder
|
8
7
|
# Build a {Model} subclass
|
9
8
|
class Model
|
10
|
-
|
9
|
+
prepend ::Model::DSL
|
11
10
|
|
12
11
|
# Convenience method for creating a new builder and evaluating a block
|
13
12
|
def self.build(&block)
|
@@ -24,9 +23,6 @@ module Engineering
|
|
24
23
|
def build(super_class=::Model, &block)
|
25
24
|
@klass = Class.new(super_class)
|
26
25
|
if block_given?
|
27
|
-
@klass.singleton_class.send :attr_reader, :elements
|
28
|
-
@klass.instance_variable_set(:@elements, [])
|
29
|
-
|
30
26
|
@self_before_instance_eval = block.binding.eval('self')
|
31
27
|
self.instance_eval(&block)
|
32
28
|
|
@@ -81,6 +77,12 @@ private
|
|
81
77
|
[self.class.new.build(::Model::Group, &block), args]
|
82
78
|
end
|
83
79
|
|
80
|
+
|
81
|
+
# Build a new {Layout}
|
82
|
+
def build_layout(*args, &block)
|
83
|
+
[self.class.new.build(::Model::Layout, &block), args]
|
84
|
+
end
|
85
|
+
|
84
86
|
# Define an attribute with the given name and optional default value (or block)
|
85
87
|
# @param name [String] The attribute's name
|
86
88
|
# @param value An optional default value
|
@@ -107,9 +109,9 @@ private
|
|
107
109
|
|
108
110
|
def push(element, *args)
|
109
111
|
if element.is_a? Class
|
110
|
-
@klass.
|
112
|
+
@klass.send :push, [element, args]
|
111
113
|
elsif element.is_a?(Array) and element.first.is_a?(Class)
|
112
|
-
@klass.
|
114
|
+
@klass.send :push, element
|
113
115
|
else
|
114
116
|
raise ArgumentError, "Can't push instances while building a class"
|
115
117
|
end
|
data/lib/model.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'model'
|
2
|
+
|
3
|
+
class Model
|
4
|
+
@elements = Array.new
|
5
|
+
def self.elements
|
6
|
+
super_elements = self.superclass.singleton_class.instance_method(:elements)
|
7
|
+
super_elements.bind(self.superclass).call + @elements
|
8
|
+
rescue
|
9
|
+
@elements
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.inherited(subclass)
|
13
|
+
subclass.instance_variable_set(:@elements, [])
|
14
|
+
end
|
15
|
+
|
16
|
+
class << self
|
17
|
+
private
|
18
|
+
|
19
|
+
def push(*args)
|
20
|
+
@elements.push *args
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/model/dsl.rb
CHANGED
@@ -22,5 +22,16 @@ class Model
|
|
22
22
|
def attr_writer(name)
|
23
23
|
define_attribute_writer(name)
|
24
24
|
end
|
25
|
+
|
26
|
+
# If the missing method happens to be the same as a known subclass of
|
27
|
+
# {Model}, then pass the call to the push method.
|
28
|
+
def method_missing(method, *args, &block)
|
29
|
+
klass = Object.const_get(method)
|
30
|
+
if klass <= Model
|
31
|
+
push klass, *args, &block
|
32
|
+
end
|
33
|
+
rescue
|
34
|
+
super
|
35
|
+
end
|
25
36
|
end
|
26
37
|
end
|
data/test/builder/model.rb
CHANGED
@@ -156,6 +156,21 @@ describe Engineering::Builder::Model do
|
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
|
+
describe 'when creating a subclass with a stack layout' do
|
160
|
+
let :klass do
|
161
|
+
subject.build do
|
162
|
+
stack do
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'must create a Layout subclass' do
|
168
|
+
klass.elements.size.must_equal 1
|
169
|
+
klass.elements.first.first.ancestors.must_include Model::Layout
|
170
|
+
klass.elements.first.last.first[:direction].must_equal :vertical
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
159
174
|
describe 'when creating a subclass that contains another Model subclass' do
|
160
175
|
let :klass do
|
161
176
|
subject.build do
|
@@ -188,4 +203,30 @@ describe Engineering::Builder::Model do
|
|
188
203
|
klass.new.first.transformation.translation.must_equal Geometry::Point[1,2,3]
|
189
204
|
end
|
190
205
|
end
|
206
|
+
|
207
|
+
describe 'shortcuts' do
|
208
|
+
after { Object.send :remove_const, :Foo }
|
209
|
+
|
210
|
+
it 'must have a shortcut for pushing a subclass without arguments' do
|
211
|
+
Foo = Class.new(Model)
|
212
|
+
klass = subject.build do
|
213
|
+
Foo()
|
214
|
+
end
|
215
|
+
|
216
|
+
klass.elements.length.must_equal 1
|
217
|
+
klass.elements.first.first.ancestors.must_include Model
|
218
|
+
klass.elements.first.last.must_equal []
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'must have a shortcut for pushing a subclass with arguments' do
|
222
|
+
Foo = Class.new(Model)
|
223
|
+
klass = subject.build do
|
224
|
+
Foo origin:[1,2,3]
|
225
|
+
end
|
226
|
+
|
227
|
+
klass.elements.length.must_equal 1
|
228
|
+
klass.elements.first.first.ancestors.must_include Model
|
229
|
+
klass.elements.first.last.must_equal [origin:[1,2,3]]
|
230
|
+
end
|
231
|
+
end
|
191
232
|
end
|
data/test/model.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require_relative '../lib/model'
|
3
|
+
|
4
|
+
describe Model do
|
5
|
+
describe 'when subclassing Model' do
|
6
|
+
let(:subclass) { Class.new(Model) }
|
7
|
+
|
8
|
+
it 'must have an elements accessor' do
|
9
|
+
subclass.elements.must_equal []
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'must not be modifiable' do
|
13
|
+
->{ subclass.push }.must_raise NoMethodError
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'when subclassing a subclass of Model' do
|
17
|
+
let(:subsubclass) { Class.new(subclass) }
|
18
|
+
|
19
|
+
it 'must have grandchildren' do
|
20
|
+
subclass.instance_variable_set(:@elements, [:a])
|
21
|
+
subsubclass.instance_variable_set(:@elements, [:b])
|
22
|
+
|
23
|
+
subsubclass.elements.must_equal [:a, :b]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,85 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: engineering
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Fosdick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dxf
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0.3'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: geometry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '6.
|
33
|
+
version: '6.5'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '6.
|
40
|
+
version: '6.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: model
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
47
|
+
version: '0.3'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
54
|
+
version: '0.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: sketch
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0.4'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0.4'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: units
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '3.0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '3.0'
|
83
83
|
description: Tools for Mad Engineers and those who want to be
|
84
84
|
email:
|
85
85
|
- bfoz@bfoz.net
|
@@ -87,8 +87,8 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
-
-
|
91
|
-
-
|
90
|
+
- .gitignore
|
91
|
+
- .travis.yml
|
92
92
|
- Gemfile
|
93
93
|
- README.markdown
|
94
94
|
- Rakefile
|
@@ -97,6 +97,7 @@ files:
|
|
97
97
|
- lib/builder/model.rb
|
98
98
|
- lib/builder/sketch.rb
|
99
99
|
- lib/engineering.rb
|
100
|
+
- lib/model.rb
|
100
101
|
- lib/model/dsl.rb
|
101
102
|
- lib/sketchup.rb
|
102
103
|
- test/builder/extrusion.rb
|
@@ -117,6 +118,7 @@ files:
|
|
117
118
|
- test/geometry/edge.rb
|
118
119
|
- test/geometry/point.rb
|
119
120
|
- test/geometry/size.rb
|
121
|
+
- test/model.rb
|
120
122
|
- test/model/builder.rb
|
121
123
|
- test/model/extrusion.rb
|
122
124
|
- test/sketchup.rb
|
@@ -131,41 +133,18 @@ require_paths:
|
|
131
133
|
- lib
|
132
134
|
required_ruby_version: !ruby/object:Gem::Requirement
|
133
135
|
requirements:
|
134
|
-
- -
|
136
|
+
- - ! '>='
|
135
137
|
- !ruby/object:Gem::Version
|
136
138
|
version: '2.0'
|
137
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
140
|
requirements:
|
139
|
-
- -
|
141
|
+
- - ! '>='
|
140
142
|
- !ruby/object:Gem::Version
|
141
143
|
version: '0'
|
142
144
|
requirements: []
|
143
145
|
rubyforge_project: engineering
|
144
|
-
rubygems_version: 2.
|
146
|
+
rubygems_version: 2.4.5
|
145
147
|
signing_key:
|
146
148
|
specification_version: 4
|
147
149
|
summary: Mad Engineering, Ruby style
|
148
|
-
test_files:
|
149
|
-
- test/builder/extrusion.rb
|
150
|
-
- test/builder/model.rb
|
151
|
-
- test/builder/sketch.rb
|
152
|
-
- test/engineering.rb
|
153
|
-
- test/fixtures/sketchup/empty.su
|
154
|
-
- test/fixtures/sketchup/hexagon_sketch.su
|
155
|
-
- test/fixtures/sketchup/line_sketch.su
|
156
|
-
- test/fixtures/sketchup/rectangle_sketch.su
|
157
|
-
- test/fixtures/sketchup/simple_extrusion.su
|
158
|
-
- test/fixtures/sketchup/simple_extrusion_units.su
|
159
|
-
- test/fixtures/sketchup/sketch_group.su
|
160
|
-
- test/fixtures/sketchup/sketch_group_group.su
|
161
|
-
- test/fixtures/sketchup/sketch_group_group_group.su
|
162
|
-
- test/fixtures/translated_extrusion.su
|
163
|
-
- test/geometry.rb
|
164
|
-
- test/geometry/edge.rb
|
165
|
-
- test/geometry/point.rb
|
166
|
-
- test/geometry/size.rb
|
167
|
-
- test/model/builder.rb
|
168
|
-
- test/model/extrusion.rb
|
169
|
-
- test/sketchup.rb
|
170
|
-
- test/sketchup/builder.rb
|
171
|
-
- test/units/literal.rb
|
150
|
+
test_files: []
|