magnum-pi 0.1.3 → 0.1.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: cd9a3d3c2d6311e67d66f570204977ef0c8f92f8
4
- data.tar.gz: f37c6513dce427b361a6e444838cbce58788dfec
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZWU5NmI1MjVkYTk4NzA0YzU4OWRmYzU1YzYwNjBiYjBmN2FiNGVmMA==
5
+ data.tar.gz: !binary |-
6
+ MGRiZGM0NGY4YjA3YzhlY2U5Mzg4YTFmNWYwMmIwOGIwYTJmNzA2Zg==
5
7
  SHA512:
6
- metadata.gz: e8a4a9cda2fdc04a4f4bb7fc4b0cf74fbbcdeb6ee480890294ca530fdecdf2c165c5c0a91ff5fd3647d9038ba627feeeb8dc4aa08b11c7d1aa30206189e3c57f
7
- data.tar.gz: 289158b4bddb10283c3be3c8c1ac3e06180be30dfdadcd2f2b0017fa48428d2552f829c6791e84c8936f6be1744cce7b842c6876284caadc065ef67cc617070d
8
+ metadata.gz: !binary |-
9
+ NWU3MGMyMjRkNDljNzNmZDM0ZGZkYzI5ZGIzM2U4NjczMGFhNTk1YTVmNDJj
10
+ YWM3NDQxZDJjYTllMmQ4ZTRkODIwOGRjNzU3YjE4NTFjZDhlNjU3N2IwNWYy
11
+ MjQwOGM2YjYxZTc0ZGFiZTBlNjg3NjAwM2IxYjhlZTkzYTIxYWQ=
12
+ data.tar.gz: !binary |-
13
+ Zjk0YjUxY2NmMjkxODQzOGM0ZTFlYjAwMjIyMTdkNmM4MmUxM2M2YmM3MTYw
14
+ ODI4YzU1ZDU5OTEwMTk2MmFmNDJkZjFiNzA5YzI2ZTQyYzYxMmZiZTQ3MTYy
15
+ ZmMwZWRmZDUwNWUxOWE5ZGU1MmUzNTk2ZjU4ZmM3YmNiNTYyY2U=
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,11 @@
1
1
  = MagnumPI CHANGELOG
2
2
 
3
+ == Version 0.1.4 (June 12, 2014)
4
+
5
+ * Extended Kernel, Class, Array and Hash with #deep_clone
6
+ * Corrected inheritance behavior when inheriting from an API interface by deep cloning
7
+ * Corrected finalizing API schemes by deep cloning
8
+
3
9
  == Version 0.1.3 (March 27, 2014)
4
10
 
5
11
  * Tackling arrays within Mechanize::Util.build_query_string
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.4
@@ -0,0 +1,12 @@
1
+ module MagnumPI
2
+ module API
3
+ module Inheritance
4
+
5
+ def inherited(base)
6
+ base.instance_variable_set :@api, @api.deep_clone
7
+ base.instance_variable_set :@resources, @resources.deep_clone
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -9,17 +9,31 @@ module MagnumPI
9
9
  end
10
10
 
11
11
  def finalize(params = {})
12
- @types = (types = _types).dup
13
- @values = (values = _values).dup
12
+ @types = (types = _types).deep_clone
13
+ @values = (values = _values).deep_clone
14
+
14
15
  params.each do |name, value|
15
16
  process_value name, [value], nil
16
17
  end
18
+
17
19
  to_hash
18
20
  ensure
19
21
  @types = types
20
22
  @values = values
21
23
  end
22
24
 
25
+ def deep_clone
26
+ clone = super
27
+
28
+ types = @types.deep_clone if @types
29
+
30
+ clone.instance_eval do
31
+ @types = types
32
+ end
33
+
34
+ clone
35
+ end
36
+
23
37
  private
24
38
 
25
39
  def _types
@@ -27,9 +41,14 @@ module MagnumPI
27
41
  end
28
42
 
29
43
  def process_value(name, args, block)
30
- is_a_class = (value = args[0]).class == ::Class
31
- set_type name, is_a_class ? value : value.class
32
- set_value name, value unless is_a_class
44
+ value = args[0]
45
+ if name == :resources
46
+ (_values[name] ||= {}).merge! value
47
+ else
48
+ is_a_class = value.class == ::Class
49
+ set_type name, is_a_class ? value : value.class
50
+ set_value name, value unless is_a_class
51
+ end
33
52
  end
34
53
 
35
54
  def set_type(name, type)
data/lib/magnum-pi/api.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require "magnum-pi/api/inheritance"
1
2
  require "magnum-pi/api/scheme"
2
3
  require "magnum-pi/api/resources"
3
4
  require "magnum-pi/api/instance"
@@ -8,6 +9,7 @@ module MagnumPI
8
9
 
9
10
  def self.extended(base)
10
11
  if base.is_a? Class
12
+ base.extend Inheritance
11
13
  base.send :include, Instance
12
14
  base.send :include, Consumer
13
15
  else
@@ -0,0 +1,65 @@
1
+ module Kernel
2
+
3
+ def deep_clone(cache = {})
4
+ return cache[self] if cache.key?(self)
5
+
6
+ begin
7
+ copy = clone
8
+ rescue
9
+ return cache[self] = self
10
+ end
11
+
12
+ cache[self] = copy
13
+
14
+ copy.instance_variables.each do |name|
15
+ begin
16
+ var = instance_variable_get(name).deep_clone(cache)
17
+ copy.instance_variable_set name, var
18
+ rescue TypeError
19
+ end
20
+ end
21
+
22
+ copy
23
+ end
24
+
25
+ end
26
+
27
+ class Class
28
+
29
+ def deep_clone(cache = {})
30
+ self
31
+ end
32
+
33
+ end
34
+
35
+ class Array
36
+
37
+ def deep_clone(cache = {})
38
+ return cache[self] if cache.key?(self)
39
+
40
+ copy = super
41
+
42
+ each_with_index do |value, index|
43
+ copy[index] = value.deep_clone(cache)
44
+ end
45
+
46
+ copy
47
+ end
48
+
49
+ end
50
+
51
+ class Hash
52
+
53
+ def deep_clone(cache = {})
54
+ return cache[self] if cache.key?(self)
55
+
56
+ copy = super
57
+
58
+ each do |key, value|
59
+ copy[key] = value.deep_clone(cache)
60
+ end
61
+
62
+ copy
63
+ end
64
+
65
+ end
@@ -0,0 +1 @@
1
+ require "magnum-pi/core_ext/deep_clone"
data/lib/magnum-pi/dsl.rb CHANGED
@@ -30,6 +30,20 @@ module MagnumPI
30
30
  _values.to_s
31
31
  end
32
32
 
33
+ def deep_clone
34
+ clone = self.class.new
35
+
36
+ valid_keys = @valid_keys.deep_clone if @valid_keys
37
+ values = @values.deep_clone if @values
38
+
39
+ clone.instance_eval do
40
+ @valid_keys = valid_keys
41
+ @values = values
42
+ end
43
+
44
+ clone
45
+ end
46
+
33
47
  private
34
48
 
35
49
  def _values
@@ -1,7 +1,7 @@
1
1
  module MagnumPI
2
2
  MAJOR = 0
3
3
  MINOR = 1
4
- TINY = 3
4
+ TINY = 4
5
5
 
6
6
  VERSION = [MAJOR, MINOR, TINY].join(".")
7
7
  end
data/lib/magnum-pi.rb CHANGED
@@ -3,6 +3,7 @@ require "oj"
3
3
  require "xmlsimple"
4
4
  require "active_support/core_ext/object/to_query"
5
5
 
6
+ require "magnum-pi/core_ext"
6
7
  require "magnum-pi/gem_ext"
7
8
  require "magnum-pi/dsl"
8
9
  require "magnum-pi/api"
@@ -0,0 +1,10 @@
1
+ class MiniTest::Test
2
+ def setup
3
+ $stringio ||= StringIO.new
4
+ $stdout = $stringio
5
+ end
6
+ def teardown
7
+ $stdout = STDOUT
8
+ $stringio.truncate $stringio.rewind
9
+ end
10
+ end
data/test/test_helper.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require_relative "test_helper/coverage"
2
2
 
3
+ require "minitest"
3
4
  require "minitest/autorun"
4
5
  require "mocha/setup"
5
6
 
@@ -8,4 +9,6 @@ def path(path)
8
9
  end
9
10
 
10
11
  require "bundler"
11
- Bundler.require :default, :development, :test
12
+ Bundler.require :default, :development, :test
13
+
14
+ require_relative "test_helper/minitest"
@@ -24,13 +24,19 @@ module Unit
24
24
  describe "#finalize" do
25
25
  it "foo" do
26
26
  @scheme.foo String
27
- @scheme.bar "bar"
27
+ @scheme.bar :baz => "qux"
28
28
  object_id = @scheme.instance_eval("_values").object_id
29
29
 
30
- assert_equal({:bar => "bar"}, @scheme.finalize)
31
- assert_equal({:foo => "foo", :bar => "bar"}, @scheme.finalize(:foo => "foo"))
30
+ assert_equal({:bar => {:baz => "qux"}}, @scheme.finalize)
31
+ assert_equal({:foo => "foo", :bar => {:baz => "qux"}}, @scheme.finalize(:foo => "foo"))
32
32
  assert_equal object_id, @scheme.instance_eval("_values").object_id
33
- assert_equal({:foo => "FOO", :bar => "bar"}, @scheme.finalize(:foo => "FOO"))
33
+ assert_equal({:foo => "FOO", :bar => {:baz => "qux"}}, @scheme.finalize(:foo => "FOO"))
34
+
35
+ finalized = @scheme.finalize :foo => "foo"
36
+ assert_equal({:bar => {:baz => "qux"}}, @scheme.instance_eval("_values"))
37
+
38
+ finalized[:bar][:baz] = "QUX"
39
+ assert_equal({:bar => {:baz => "qux"}}, @scheme.instance_eval("_values"))
34
40
 
35
41
  assert_raises ArgumentError do
36
42
  @scheme.finalize :foo => :foo
@@ -0,0 +1,43 @@
1
+ require_relative "../../test_helper"
2
+
3
+ module Unit
4
+ module CoreExt
5
+ class TestDeepClone < MiniTest::Test
6
+
7
+ describe "#deep_clone" do
8
+ it "returns a deep clone of the instance" do
9
+ array = [1, 2, 3]
10
+ array.instance_variable_set :@array, %w(4 5 6)
11
+
12
+ instance = {
13
+ :a => array,
14
+ :b => "Hello",
15
+ :c => {
16
+ "alpha" => [4, 5],
17
+ "beta" => [5, 6]
18
+ }
19
+ }
20
+
21
+ clone = instance.deep_clone
22
+ assert_equal instance, clone
23
+ assert_equal instance[:a].instance_variable_get(:@array), clone[:a].instance_variable_get(:@array)
24
+
25
+ clone.merge! :d => [1, 2, 3]
26
+ assert_equal [:a, :b, :c], instance.keys
27
+ assert_equal [:a, :b, :c, :d], clone.keys
28
+ assert_equal [1, 2, 3], clone[:d]
29
+ assert_equal instance, clone.reject{|k, v| k == :d}
30
+
31
+ clone[:a].instance_variable_get(:@array) << "7"
32
+ assert_equal %w(4 5 6), instance[:a].instance_variable_get(:@array)
33
+ assert_equal %w(4 5 6 7), clone[:a].instance_variable_get(:@array)
34
+
35
+ clone[:a] << 4
36
+ assert_equal [1, 2, 3], instance[:a]
37
+ assert_equal [1, 2, 3, 4], clone[:a]
38
+ end
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -88,5 +88,53 @@ module Unit
88
88
  end
89
89
  end
90
90
 
91
+ class FooAPI
92
+ extend MagnumPI::API
93
+ api do
94
+ uri String
95
+ format :xml
96
+ api_key String
97
+ resources({
98
+ "foo/Bars" => {
99
+ :params => {
100
+ :start_date => Date,
101
+ :end_date => Date
102
+ }
103
+ }
104
+ })
105
+ end
106
+ resources do
107
+ bars :get, "foo/Bars", {:start_date => Date.today}
108
+ end
109
+ end
110
+
111
+ class BarAPI < FooAPI
112
+ api do
113
+ resources({
114
+ "baz/Quxs" => {}
115
+ })
116
+ end
117
+ resources do
118
+ quxs :get, "baz/Quxs"
119
+ end
120
+ end
121
+
122
+ describe "inheritance" do
123
+ describe ".api" do
124
+ it "inherits the API definition of its parent" do
125
+ assert BarAPI.api != nil
126
+ assert BarAPI.api.__id__ != FooAPI.api.__id__
127
+ assert_equal FooAPI.api.to_hash.tap{|h| h[:resources].merge!("baz/Quxs" => {})}, BarAPI.api.to_hash
128
+ end
129
+ end
130
+ describe ".resources" do
131
+ it "inherits the resources definition of its parent" do
132
+ assert BarAPI.resources != nil
133
+ assert BarAPI.resources.__id__ != FooAPI.resources.__id__
134
+ assert_equal FooAPI.resources.to_hash.merge(:quxs => [:get, "baz/Quxs"]), BarAPI.resources.to_hash
135
+ end
136
+ end
137
+ end
138
+
91
139
  end
92
140
  end
metadata CHANGED
@@ -1,139 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magnum-pi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Engel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-27 00:00:00.000000000 Z
11
+ date: 2014-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mechanize
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ! '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
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'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: oj
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
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
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: xml-simple
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ! '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
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
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: activesupport
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
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'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ! '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ! '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: pry
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ! '>='
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ! '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: simplecov
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ! '>='
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ! '>='
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: minitest
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ! '>='
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ! '>='
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: mocha
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - '>='
129
+ - - ! '>='
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '>='
136
+ - - ! '>='
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  description: Create an easy interface to talk with APIs
@@ -154,9 +154,12 @@ files:
154
154
  - lib/magnum-pi.rb
155
155
  - lib/magnum-pi/api.rb
156
156
  - lib/magnum-pi/api/consumer.rb
157
+ - lib/magnum-pi/api/inheritance.rb
157
158
  - lib/magnum-pi/api/instance.rb
158
159
  - lib/magnum-pi/api/resources.rb
159
160
  - lib/magnum-pi/api/scheme.rb
161
+ - lib/magnum-pi/core_ext.rb
162
+ - lib/magnum-pi/core_ext/deep_clone.rb
160
163
  - lib/magnum-pi/dsl.rb
161
164
  - lib/magnum-pi/gem_ext.rb
162
165
  - lib/magnum-pi/gem_ext/mechanize.rb
@@ -168,10 +171,12 @@ files:
168
171
  - script/console
169
172
  - test/test_helper.rb
170
173
  - test/test_helper/coverage.rb
174
+ - test/test_helper/minitest.rb
171
175
  - test/unit/api/test_consumer.rb
172
176
  - test/unit/api/test_instance.rb
173
177
  - test/unit/api/test_resources.rb
174
178
  - test/unit/api/test_scheme.rb
179
+ - test/unit/core_ext/test_deep_clone.rb
175
180
  - test/unit/test_api.rb
176
181
  - test/unit/test_dsl.rb
177
182
  - test/unit/test_magnum-pi.rb
@@ -184,27 +189,29 @@ require_paths:
184
189
  - lib
185
190
  required_ruby_version: !ruby/object:Gem::Requirement
186
191
  requirements:
187
- - - '>='
192
+ - - ! '>='
188
193
  - !ruby/object:Gem::Version
189
194
  version: '0'
190
195
  required_rubygems_version: !ruby/object:Gem::Requirement
191
196
  requirements:
192
- - - '>='
197
+ - - ! '>='
193
198
  - !ruby/object:Gem::Version
194
199
  version: '0'
195
200
  requirements: []
196
201
  rubyforge_project:
197
- rubygems_version: 2.0.3
202
+ rubygems_version: 2.1.11
198
203
  signing_key:
199
204
  specification_version: 4
200
205
  summary: Create an easy interface to talk with APIs
201
206
  test_files:
202
207
  - test/test_helper.rb
203
208
  - test/test_helper/coverage.rb
209
+ - test/test_helper/minitest.rb
204
210
  - test/unit/api/test_consumer.rb
205
211
  - test/unit/api/test_instance.rb
206
212
  - test/unit/api/test_resources.rb
207
213
  - test/unit/api/test_scheme.rb
214
+ - test/unit/core_ext/test_deep_clone.rb
208
215
  - test/unit/test_api.rb
209
216
  - test/unit/test_dsl.rb
210
217
  - test/unit/test_magnum-pi.rb