engineering 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 77f2d000480b81c235ca318065fa10b03ae24c53
4
- data.tar.gz: 7079726edaaa3a2c4861f91170a2522b298a0882
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YWFiMzc4YTE4YmIxMTc2MmZlYzNiNTcwZDcyMDhmYjkxODE4MDRmYg==
5
+ data.tar.gz: !binary |-
6
+ YTVhOWE2ODI0MjQ4OTM5N2Q5MjMzZWQ0NzU3NWFhM2MzODJmMmYzNg==
5
7
  SHA512:
6
- metadata.gz: 27e226858c03ed4213db6d169386886f6492aec85c8ca60d9d9ad70d0148391af909741443359ef3481ba816e9cc36c4a1c3dae21030e3e68126fe022b839fe1
7
- data.tar.gz: dd254bd2ede34af0ab21f9635c3e4c92b4e1ac32be27423736f401641df720bad14484e3a4dd4857d20a4a369e23da3876897a77568cbab3ad0e5743e6d8452a
8
+ metadata.gz: !binary |-
9
+ MWVlMmM5M2QzY2YzNzU2MjFhZTNkOTA0NjE4NjgyZmYxMjU1YzY2NDhkZTJh
10
+ MWIyZWNlNzNlNTY3N2Q0MmNmZDU4NTNlZjA4YjQ0M2UzMTI1M2IwNmZjMDBj
11
+ YzgxOGFmZDQyNGQ3NTdhYzEyZjMxZTU1ZTBlZWM2ZGExZmY5MjU=
12
+ data.tar.gz: !binary |-
13
+ NjE1ZDE1ODkyOGVmM2QyZjhhMWIxZWI4ZDMzNjY4NGQ1MDVjMGU3N2NjY2E5
14
+ NzUyZmI3MTM0NTQ2NTgzOGY3NmI2YzNiOGZhMWIwMzY2ZDg1Y2Q1YjM5MmMw
15
+ MGU4MzYwYjk3YTE1OWJhM2QwMmRhYTY0ODVlZDlmYjMzOWUwMmE=
@@ -1,6 +1,9 @@
1
1
  Engineering for Ruby
2
2
  ====================
3
3
 
4
+ [![Build Status](https://travis-ci.org/bfoz/engineering.svg?branch=master)](https://travis-ci.org/bfoz/engineering)
5
+ [![Gem Version](https://badge.fury.io/rb/engineering.svg)](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).
@@ -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.3'
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.4'
22
- s.add_dependency 'model', '~> 0.2'
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', '~> 2.4'
24
+ s.add_dependency 'units', '~> 3.0'
25
25
 
26
26
  s.required_ruby_version = '>= 2.0'
27
27
  end
@@ -1,5 +1,4 @@
1
- require 'model'
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
- include ::Model::DSL
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.instance_variable_get(:@elements).push [element, args]
112
+ @klass.send :push, [element, args]
111
113
  elsif element.is_a?(Array) and element.first.is_a?(Class)
112
- @klass.instance_variable_get(:@elements).push element
114
+ @klass.send :push, element
113
115
  else
114
116
  raise ArgumentError, "Can't push instances while building a class"
115
117
  end
@@ -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
@@ -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
@@ -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
@@ -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.3'
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: 2014-11-19 00:00:00.000000000 Z
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.4'
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.4'
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.2'
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.2'
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: '2.4'
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: '2.4'
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
- - ".gitignore"
91
- - ".travis.yml"
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.2.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: []