disposable 0.1.12 → 0.1.13
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 +4 -4
- data/CHANGES.md +4 -0
- data/Gemfile +1 -2
- data/disposable.gemspec +1 -1
- data/lib/disposable/version.rb +1 -1
- data/test/api_semantics_test.rb +229 -229
- data/test/test_helper.rb +18 -20
- data/test/twin/process_inline_test.rb +1 -3
- metadata +6 -8
- data/database.sqlite3 +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da82ae628d302989838d30e7ee1f493f4ea4ed74
|
4
|
+
data.tar.gz: d96903d216a97508a08052ca5d33ec17bad2b3d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9b1cc05facbe532e3c46900cc5afc1bc54c17607ee43ff4b87e8270d3a2d4c1f393261acc54a8c1a52adf556cf9f18aa617b1d7f5194ba699284007c78c44fb
|
7
|
+
data.tar.gz: fa527244dab259db4be2632d17fce579ac4a696dc656400778c272902b61a18973c83bc4673a54b757a58d549ad6aeef552e0b1d31d40ec78e91bfe66626ce58
|
data/CHANGES.md
CHANGED
data/Gemfile
CHANGED
data/disposable.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency "uber"
|
22
|
-
spec.add_dependency "representable", ">= 2.2.3", "
|
22
|
+
spec.add_dependency "representable", ">= 2.2.3", "< 3.0.0"
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
25
25
|
spec.add_development_dependency "rake"
|
data/lib/disposable/version.rb
CHANGED
data/test/api_semantics_test.rb
CHANGED
@@ -1,263 +1,263 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
require "disposable/twin"
|
3
|
-
require "ostruct"
|
4
|
-
|
5
|
-
module Model
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
# thoughts:
|
11
|
-
# a twin should be a proxy between the incoming API instructions (form hash) and the models to write to.
|
12
|
-
# e.g. when deleting certain items in a collection, this could be held in memory before written to DB.
|
13
|
-
# reason: a twin can be validated (e.g. is current user allowed to remove item 1 from collection abc?)
|
14
|
-
# before the application state is actually altered in the DB.
|
15
|
-
# that would open a clean workflow: API calls --> twin state change --> validation --> "rollback" / save
|
16
|
-
|
17
|
-
module Representable
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
1
|
+
# require "test_helper"
|
2
|
+
# require "disposable/twin"
|
3
|
+
# require "ostruct"
|
4
|
+
|
5
|
+
# module Model
|
6
|
+
# Song = Struct.new(:id, :title)
|
7
|
+
# Album = Struct.new(:id, :name, :songs)
|
8
|
+
# end
|
9
|
+
|
10
|
+
# # thoughts:
|
11
|
+
# # a twin should be a proxy between the incoming API instructions (form hash) and the models to write to.
|
12
|
+
# # e.g. when deleting certain items in a collection, this could be held in memory before written to DB.
|
13
|
+
# # reason: a twin can be validated (e.g. is current user allowed to remove item 1 from collection abc?)
|
14
|
+
# # before the application state is actually altered in the DB.
|
15
|
+
# # that would open a clean workflow: API calls --> twin state change --> validation --> "rollback" / save
|
16
|
+
|
17
|
+
# module Representable
|
18
|
+
# class Semantics
|
19
|
+
# class Semantic
|
20
|
+
# def self.existing_item_for(fragment, options)
|
21
|
+
# # return unless model.songs.collect { |s| s.id.to_s }.include?(fragment["id"].to_s)
|
22
|
+
# options.binding.get.find { |s| s.id.to_s == fragment["id"].to_s }
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
|
26
|
+
# class SkipExisting < Semantic
|
27
|
+
# def self.call(model, fragment, index, options)
|
28
|
+
# return unless existing_item_for(fragment, options)
|
29
|
+
|
30
|
+
# Skip.new(fragment)
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
|
34
|
+
# class Add < Semantic # old representable behavior.
|
35
|
+
# def self.call(model, fragment, index, options)
|
36
|
+
# binding = options.binding.clone
|
37
|
+
# binding.instance_variable_get(:@definition).delete!(:instance) # FIXME: sucks!
|
38
|
+
# Representable::Deserializer.new(binding).(fragment, options.user_options) # Song.new
|
39
|
+
# end
|
40
|
+
# end
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
# class UpdateExisting < Semantic
|
43
|
+
# def self.call(model, fragment, index, options)
|
44
|
+
# return unless res = existing_item_for(fragment, options)
|
45
|
+
|
46
|
+
# Update.new(res)
|
47
|
+
# end
|
48
|
+
# end
|
49
49
|
|
50
50
|
|
51
|
-
|
52
|
-
|
51
|
+
# class Skip < OpenStruct
|
52
|
+
# end
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
# class Remove < Skip
|
55
|
+
# def self.call(model, fragment, index, options)
|
56
|
+
# return unless fragment["_action"] == "remove" # TODO: check if feature enabled.
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
# Remove.new(fragment)
|
59
|
+
# end
|
60
|
+
# end
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
# require 'delegate'
|
63
|
+
# class Update < SimpleDelegator
|
64
|
+
# end
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
end
|
116
|
-
|
117
|
-
class AlbumDecorator < Representable::Decorator
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
66
|
+
# # Per parsed collection item, mark the to-be-populated model for removal, skipping or adding.
|
67
|
+
# # This code is called right before #from_format is called on the model.
|
68
|
+
# # Semantical behavior is inferred from the fragment making this code document- and format-specific.
|
69
|
+
|
70
|
+
# # remove: unlink from association
|
71
|
+
# # skip_existing
|
72
|
+
# # update_existing
|
73
|
+
# # add
|
74
|
+
# # [destroy]
|
75
|
+
# # callable
|
76
|
+
|
77
|
+
# # default behavior: - add_new
|
78
|
+
|
79
|
+
# class Instance
|
80
|
+
# include Uber::Callable
|
81
|
+
|
82
|
+
# def call(model, fragment, index, options)
|
83
|
+
# semantics = options.binding[:semantics]
|
84
|
+
|
85
|
+
# # loop through semantics, the first that returns something wins.
|
86
|
+
# semantics.each do |semantic|
|
87
|
+
# res = semantic.(model, fragment, index, options) and return res
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
# end
|
91
|
+
|
92
|
+
# class Setter
|
93
|
+
# include Uber::Callable
|
94
|
+
|
95
|
+
# def call(model, values, options)
|
96
|
+
# remove_items = values.find_all { |i| i.instance_of?(Representable::Semantics::Remove) }
|
97
|
+
# # add_items = values.find_all { |i| i.instance_of?(Add) }.collect(&:model)
|
98
|
+
# add_items = values - remove_items
|
99
|
+
|
100
|
+
# skip_items = values.find_all { |i| i.instance_of?(Representable::Semantics::Skip) }
|
101
|
+
# skip_items += values.find_all { |i| i.instance_of?(Representable::Semantics::Update) } # TODO: merge with above!
|
102
|
+
|
103
|
+
# # add_items = values.find_all { |i| i.instance_of?(Add) }.collect(&:model)
|
104
|
+
# add_items = add_items - skip_items
|
105
|
+
|
106
|
+
# # DISCUSS: collection#[]= will call save
|
107
|
+
# # what does #+= and #-= do?
|
108
|
+
# # how do we prevent adding already existing items twice?
|
109
|
+
|
110
|
+
# model.songs += add_items
|
111
|
+
# model.songs -= remove_items.collect { |i| model.songs.find { |s| s.id.to_s == i.id.to_s } }
|
112
|
+
# end
|
113
|
+
# end
|
114
|
+
# end
|
115
|
+
# end
|
116
|
+
|
117
|
+
# class AlbumDecorator < Representable::Decorator
|
118
|
+
# include Representable::Hash
|
119
|
+
|
120
|
+
# collection :songs,
|
121
|
+
|
122
|
+
# # semantics: [:skip_existing, :add, :remove],
|
123
|
+
# semantics: [Representable::Semantics::Remove, Representable::Semantics::SkipExisting, Representable::Semantics::Add],
|
124
124
|
|
125
|
-
|
126
|
-
|
127
|
-
|
125
|
+
# instance: Representable::Semantics::Instance.new,
|
126
|
+
# pass_options: true,
|
127
|
+
# setter: Representable::Semantics::Setter.new,
|
128
128
|
|
129
129
|
|
130
|
-
|
130
|
+
# class: Model::Song do # add new to existing collection.
|
131
131
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
132
|
+
# # only add new songs
|
133
|
+
# property :title
|
134
|
+
# end
|
135
|
+
# end
|
136
136
|
|
137
137
|
|
138
138
|
|
139
|
-
class ApiSemanticsTest < MiniTest::Spec
|
140
|
-
|
141
|
-
|
139
|
+
# class ApiSemanticsTest < MiniTest::Spec
|
140
|
+
# it "xxx" do
|
141
|
+
# album = Model::Album.new(1, "And So I Watch You From Afar", [Model::Song.new(2, "Solidarity"), Model::Song.new(0, "Tale That Wasn't Right")])
|
142
142
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
143
|
+
# decorator = AlbumDecorator.new(album)
|
144
|
+
# decorator.from_hash({"songs" => [
|
145
|
+
# {"id" => 2, "title" => "Solidarity, but wrong title"}, # skip
|
146
|
+
# {"id" => 0, "title" => "Tale That Wasn't Right, but wrong title", "_action" => "remove"}, # delete
|
147
|
+
# {"id" => 4, "title" => "Capture Castles"} # add, default.
|
148
|
+
# ]})
|
149
|
+
# # missing: allow updating specific/all items in collection.
|
150
150
|
|
151
|
-
|
152
|
-
|
151
|
+
# decorator.represented.songs.inspect.must_equal %{[#<struct Model::Song id=2, title="Solidarity">, #<struct Model::Song id=nil, title="Capture Castles">]}
|
152
|
+
# end
|
153
153
|
|
154
|
-
end
|
154
|
+
# end
|
155
155
|
|
156
|
-
class RemoveFlagSetButNotEnabled < MiniTest::Spec
|
157
|
-
|
158
|
-
|
156
|
+
# class RemoveFlagSetButNotEnabled < MiniTest::Spec
|
157
|
+
# class AlbumDecorator < Representable::Decorator
|
158
|
+
# include Representable::Hash
|
159
159
|
|
160
|
-
|
161
|
-
|
162
|
-
|
160
|
+
# collection :songs,
|
161
|
+
# # semantics: [:skip_existing, :add, :remove],
|
162
|
+
# semantics: [Representable::Semantics::SkipExisting, Representable::Semantics::Add],
|
163
163
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
164
|
+
# instance: Representable::Semantics::Instance.new,
|
165
|
+
# pass_options: true,
|
166
|
+
# setter: Representable::Semantics::Setter.new,
|
167
|
+
# class: Model::Song do
|
168
|
+
# property :title
|
169
|
+
# end
|
170
|
+
# end
|
171
171
|
|
172
|
-
|
173
|
-
|
172
|
+
# it "doesn't remove when semantic is not enabled" do
|
173
|
+
# album = Model::Album.new(1, "And So I Watch You From Afar", [Model::Song.new(2, "Solidarity"), Model::Song.new(0, "Tale That Wasn't Right")])
|
174
174
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
175
|
+
# decorator = AlbumDecorator.new(album)
|
176
|
+
# decorator.from_hash({"songs" => [
|
177
|
+
# {"id" => 2, "title" => "Solidarity, updated!"}, # update
|
178
|
+
# {"id" => 0, "title" => "Tale That Wasn't Right, but wrong title", "_action" => "remove"}, # delete, but don't!
|
179
|
+
# {"title" => "Rise And Fall"}
|
180
|
+
# ]})
|
181
181
|
|
182
|
-
|
183
|
-
|
184
|
-
end
|
182
|
+
# decorator.represented.songs.inspect.must_equal %{[#<struct Model::Song id=2, title=\"Solidarity\">, #<struct Model::Song id=0, title=\"Tale That Wasn't Right\">, #<struct Model::Song id=nil, title=\"Rise And Fall\">]}
|
183
|
+
# end
|
184
|
+
# end
|
185
185
|
|
186
|
-
class UserCallableTest < MiniTest::Spec
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
186
|
+
# class UserCallableTest < MiniTest::Spec
|
187
|
+
# class MyOwnSemantic < Representable::Semantics::Semantic
|
188
|
+
# def self.call(model, fragment, index, options)
|
189
|
+
# if fragment["title"] =~ /Solidarity/
|
190
|
+
# return Representable::Semantics::Skip.new(fragment)
|
191
|
+
# end
|
192
|
+
# end
|
193
|
+
# end
|
194
194
|
|
195
|
-
|
196
|
-
|
195
|
+
# class AlbumDecorator < Representable::Decorator
|
196
|
+
# include Representable::Hash
|
197
197
|
|
198
|
-
|
199
|
-
|
198
|
+
# collection :songs,
|
199
|
+
# semantics: [MyOwnSemantic, Representable::Semantics::Add],
|
200
200
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
201
|
+
# instance: Representable::Semantics::Instance.new,
|
202
|
+
# pass_options: true,
|
203
|
+
# setter: Representable::Semantics::Setter.new,
|
204
|
+
# class: Model::Song do
|
205
|
+
# property :title
|
206
|
+
# end
|
207
|
+
# end
|
208
208
|
|
209
|
-
|
210
|
-
|
209
|
+
# it do
|
210
|
+
# album = Model::Album.new(1, "And So I Watch You From Afar", [Model::Song.new(2, "Solidarity"), Model::Song.new(0, "Tale That Wasn't Right")])
|
211
211
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
212
|
+
# decorator = AlbumDecorator.new(album)
|
213
|
+
# decorator.from_hash({"songs" => [
|
214
|
+
# {"id" => 2, "title" => "Solidarity, updated!"}, # update
|
215
|
+
# {"title" => "Rise And Fall"}
|
216
|
+
# ]})
|
217
217
|
|
218
|
-
|
219
|
-
|
220
|
-
end
|
218
|
+
# decorator.represented.songs.inspect.must_equal %{[#<struct Model::Song id=2, title=\"Solidarity\">, #<struct Model::Song id=0, title=\"Tale That Wasn't Right\">, #<struct Model::Song id=nil, title=\"Rise And Fall\">]}
|
219
|
+
# end
|
220
|
+
# end
|
221
221
|
|
222
222
|
|
223
|
-
class ApiSemanticsWithUpdate < MiniTest::Spec
|
224
|
-
|
225
|
-
|
223
|
+
# class ApiSemanticsWithUpdate < MiniTest::Spec
|
224
|
+
# class AlbumDecorator < Representable::Decorator
|
225
|
+
# include Representable::Hash
|
226
226
|
|
227
|
-
|
227
|
+
# collection :songs,
|
228
228
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
end
|
260
|
-
# [
|
261
|
-
# {"_action": "add"},
|
262
|
-
# {"id": 2, "_action": "remove"}
|
263
|
-
# ]
|
229
|
+
# semantics: [Representable::Semantics::Remove, Representable::Semantics::UpdateExisting, Representable::Semantics::Add],
|
230
|
+
|
231
|
+
# instance: Representable::Semantics::Instance.new,
|
232
|
+
# pass_options: true,
|
233
|
+
# class: Model::Song,
|
234
|
+
|
235
|
+
# setter: Representable::Semantics::Setter.new do # add new to existing collection.
|
236
|
+
|
237
|
+
# # only add new songs
|
238
|
+
# property :title
|
239
|
+
# end
|
240
|
+
# end
|
241
|
+
|
242
|
+
# it do
|
243
|
+
# album = Model::Album.new(1, "And So I Watch You From Afar", [Model::Song.new(2, "Solidarity"), Model::Song.new(0, "Tale That Wasn't Right")])
|
244
|
+
|
245
|
+
# decorator = AlbumDecorator.new(album)
|
246
|
+
# decorator.from_hash({"songs" => [
|
247
|
+
# {"id" => 2, "title" => "Solidarity, updated!"}, # update
|
248
|
+
# {"id" => 0, "title" => "Tale That Wasn't Right, but wrong title", "_action" => "remove"}, # delete
|
249
|
+
# {"id" => 4, "title" => "Capture Castles"}, # add, default. # FIXME: this tests adding with id, keep this.
|
250
|
+
# {"title" => "Rise And Fall"}
|
251
|
+
# ]})
|
252
|
+
# # missing: allow updating specific/all items in collection.
|
253
|
+
|
254
|
+
# puts decorator.represented.songs.inspect
|
255
|
+
|
256
|
+
|
257
|
+
# decorator.represented.songs.inspect.must_equal %{[#<struct Model::Song id=2, title="Solidarity, updated!">, #<struct Model::Song id=nil, title="Capture Castles">, #<struct Model::Song id=nil, title=\"Rise And Fall\">]}
|
258
|
+
# end
|
259
|
+
# end
|
260
|
+
# # [
|
261
|
+
# # {"_action": "add"},
|
262
|
+
# # {"id": 2, "_action": "remove"}
|
263
|
+
# # ]
|
data/test/test_helper.rb
CHANGED
@@ -32,28 +32,26 @@ end
|
|
32
32
|
|
33
33
|
ActiveRecord::Base.establish_connection(
|
34
34
|
:adapter => "sqlite3",
|
35
|
-
:database => "
|
35
|
+
:database => ":memory:"
|
36
36
|
)
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# end
|
56
|
-
# end
|
38
|
+
ActiveRecord::Schema.define do
|
39
|
+
create_table :artists do |table|
|
40
|
+
table.column :name, :string
|
41
|
+
table.timestamps
|
42
|
+
end
|
43
|
+
create_table :songs do |table|
|
44
|
+
table.column :title, :string
|
45
|
+
table.column :artist_id, :integer
|
46
|
+
table.column :album_id, :integer
|
47
|
+
table.timestamps
|
48
|
+
end
|
49
|
+
create_table :albums do |table|
|
50
|
+
table.column :name, :string
|
51
|
+
table.column :artist_id, :integer
|
52
|
+
table.timestamps
|
53
|
+
end
|
54
|
+
end
|
57
55
|
|
58
56
|
module Disposable
|
59
57
|
module Comparable
|
@@ -27,11 +27,9 @@ class ProcessInlineTest < MiniTest::Spec
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it do
|
30
|
-
twin = AlbumTwin.new(Album.new(Object, Object
|
30
|
+
twin = AlbumTwin.new(Album.new(Object, Object))
|
31
31
|
assert ! (twin.class < InlineTwin)
|
32
32
|
assert (twin.artist.class < InlineTwin)
|
33
33
|
assert ! (twin.composer.class < InlineTwin)
|
34
|
-
|
35
|
-
twin.recursive_composer.composer.composer.must_equal nil
|
36
34
|
end
|
37
35
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: disposable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: uber
|
@@ -31,9 +31,9 @@ dependencies:
|
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 2.2.3
|
34
|
-
- - "
|
34
|
+
- - "<"
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
36
|
+
version: 3.0.0
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -41,9 +41,9 @@ dependencies:
|
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 2.2.3
|
44
|
-
- - "
|
44
|
+
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 3.0.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,7 +142,6 @@ files:
|
|
142
142
|
- LICENSE.txt
|
143
143
|
- README.md
|
144
144
|
- Rakefile
|
145
|
-
- database.sqlite3
|
146
145
|
- disposable.gemspec
|
147
146
|
- gemfiles/Gemfile.rails-2.3
|
148
147
|
- gemfiles/Gemfile.rails-3.0
|
@@ -262,4 +261,3 @@ test_files:
|
|
262
261
|
- test/twin/twin_test.rb
|
263
262
|
- test/twin/virtual_test.rb
|
264
263
|
- test/twin/writeable_test.rb
|
265
|
-
has_rdoc:
|
data/database.sqlite3
DELETED
Binary file
|