disposable 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +5 -0
- data/Gemfile +8 -2
- data/disposable.gemspec +5 -3
- data/lib/disposable/twin/builder.rb +4 -4
- data/lib/disposable/twin/default.rb +3 -1
- data/lib/disposable/twin/struct.rb +1 -1
- data/lib/disposable/version.rb +1 -1
- data/test/twin/coercion_test.rb +74 -0
- data/test/twin/default_test.rb +10 -3
- metadata +41 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a74d3e306a9301f6e9ab4b6aea20395df6eae38
|
4
|
+
data.tar.gz: a24e79ec0ade0a96579b0a25f520deea856e4e02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f83c3a2ae0a3a85a5114afe05dec55ca9ceab8949b5472c3eb5324951f84a6251617b34611ecf185d9153bc954e216f415d48881e72b6ec0a69b8240f906fe09
|
7
|
+
data.tar.gz: 0bba9cf7c8603f36a0c2e005215fbd66a0b2ed833002eba606df4bcd94292c421540e8f7d3c581f92ba08e72dbc0e854d47bf5b8a75cceab62aecd7abca903dc
|
data/CHANGES.md
CHANGED
data/Gemfile
CHANGED
@@ -2,10 +2,16 @@ source "https://rubygems.org"
|
|
2
2
|
gemspec
|
3
3
|
|
4
4
|
# gem "representable", path: "../representable"
|
5
|
-
gem "representable", "3.0.0"
|
5
|
+
# gem "representable", "3.0.0"
|
6
6
|
# gem "representable", github: "apotonick/representable"
|
7
7
|
# gem "declarative", path: "../declarative"
|
8
8
|
# gem "declarative", github: "apotonick/declarative"
|
9
9
|
gem "minitest-line"
|
10
10
|
|
11
|
-
gem "
|
11
|
+
# gem "dry-struct"
|
12
|
+
|
13
|
+
|
14
|
+
# gem "uber", path: "../uber"
|
15
|
+
# gem "declarative-option", path: "../declarative-option"
|
16
|
+
# gem "declarative-builder", path: "../declarative-builder"
|
17
|
+
# gem "representable", path: "../representable"
|
data/disposable.gemspec
CHANGED
@@ -17,14 +17,16 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.add_dependency "uber"
|
21
|
-
spec.add_dependency "declarative",
|
20
|
+
spec.add_dependency "uber", "< 0.2.0"
|
21
|
+
spec.add_dependency "declarative", ">= 0.0.9", "< 1.0.0"
|
22
|
+
spec.add_dependency "declarative-builder", "< 0.2.0"
|
23
|
+
spec.add_dependency "declarative-option", "< 0.2.0"
|
22
24
|
spec.add_dependency "representable", ">= 2.4.0", "<= 3.1.0"
|
23
25
|
|
24
26
|
spec.add_development_dependency "bundler", "~> 1.3"
|
25
27
|
spec.add_development_dependency "rake"
|
26
28
|
spec.add_development_dependency "minitest"
|
27
|
-
spec.add_development_dependency "activerecord"
|
29
|
+
spec.add_development_dependency "activerecord", "4.2.5"
|
28
30
|
spec.add_development_dependency "sqlite3"
|
29
31
|
spec.add_development_dependency "dry-types", "~> 0.6"
|
30
32
|
# spec.add_development_dependency "database_cleaner"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "declarative/builder"
|
2
2
|
|
3
3
|
module Disposable
|
4
4
|
class Twin
|
@@ -16,13 +16,13 @@ module Disposable
|
|
16
16
|
module Builder
|
17
17
|
def self.included(base)
|
18
18
|
base.class_eval do
|
19
|
-
include
|
19
|
+
include Declarative::Builder
|
20
20
|
|
21
21
|
def self.build(model, options={}) # semi-public.
|
22
|
-
|
22
|
+
build!(self, model, options).new(model, options) # Declarative::Builder::build!.
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
|
-
end
|
28
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "declarative/option"
|
2
|
+
|
1
3
|
# TODO: allow default: -> for hashes, etc.
|
2
4
|
module Disposable::Twin::Default
|
3
5
|
def setup_value_for(dfn, options)
|
@@ -16,7 +18,7 @@ module Disposable::Twin::Default
|
|
16
18
|
module ClassMethods
|
17
19
|
private
|
18
20
|
def build_definition(name, options={}, &block)
|
19
|
-
options = options.merge(default:
|
21
|
+
options = options.merge(default: Declarative::Option(options[:default], instance_exec: true)) if options.has_key?(:default)
|
20
22
|
super
|
21
23
|
end
|
22
24
|
end
|
@@ -3,7 +3,7 @@ require "disposable/twin/property/struct"
|
|
3
3
|
class Disposable::Twin
|
4
4
|
module Struct
|
5
5
|
def self.included(includer)
|
6
|
-
warn "[Disposable] The Struct module is deprecated, please use Property::
|
6
|
+
warn "[Disposable] The Struct module is deprecated, please use Property::Struct."
|
7
7
|
includer.send(:include, Property::Struct)
|
8
8
|
end
|
9
9
|
end
|
data/lib/disposable/version.rb
CHANGED
data/test/twin/coercion_test.rb
CHANGED
@@ -116,3 +116,77 @@ class CoercionTest < MiniTest::Spec
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
end
|
119
|
+
|
120
|
+
# this converts "" to nil and then breaks because it's strict.
|
121
|
+
# Types::Strict::String.constructor(Dry::Types::Coercions::Form.method(:to_nil))
|
122
|
+
|
123
|
+
class CoercionTypingTest < MiniTest::Spec
|
124
|
+
class Song < Disposable::Twin
|
125
|
+
include Coercion
|
126
|
+
include Setup::SkipSetter
|
127
|
+
|
128
|
+
# property :title, type: Dry::Types::Strict::String.constructor(Dry::Types::Coercions::Form.method(:to_nil))
|
129
|
+
property :title, type: Types::Strict::String.optional # this is the behavior of the "DB" data twin. this is NOT the form.
|
130
|
+
|
131
|
+
# property :name, type: Types::Form::String
|
132
|
+
end
|
133
|
+
|
134
|
+
it do
|
135
|
+
twin = Song.new(Struct.new(:title, :name).new)
|
136
|
+
|
137
|
+
# with type: Dry::Types::Strict::String
|
138
|
+
# assert_raises(Dry::Types::ConstraintError) { twin.title = nil }
|
139
|
+
twin.title = nil
|
140
|
+
twin.title.must_be_nil
|
141
|
+
|
142
|
+
twin.title = "Yo"
|
143
|
+
twin.title.must_equal "Yo"
|
144
|
+
|
145
|
+
twin.title = ""
|
146
|
+
twin.title.must_equal ""
|
147
|
+
|
148
|
+
assert_raises(Dry::Types::ConstraintError) { twin.title = :bla }
|
149
|
+
assert_raises(Dry::Types::ConstraintError) { twin.title = 1 }
|
150
|
+
end
|
151
|
+
|
152
|
+
# Form
|
153
|
+
class Form < Disposable::Twin
|
154
|
+
include Coercion
|
155
|
+
include Setup::SkipSetter
|
156
|
+
|
157
|
+
|
158
|
+
# property :title, type: Dry::Types::Strict::String.constructor(Dry::Types::Coercions::Form.method(:to_nil))
|
159
|
+
property :title, type: Types::Strict::String.optional.constructor(Dry::Types::Coercions::Form.method(:to_nil)) # this is the behavior of the "DB" data twin. this is NOT the form.
|
160
|
+
|
161
|
+
# property :name, type: Types::Form::String
|
162
|
+
|
163
|
+
property :enabled, type: Types::Form::Bool
|
164
|
+
# property :enabled, Bool.constructor(:trim!)
|
165
|
+
end
|
166
|
+
it do
|
167
|
+
twin =Form.new(Struct.new(:title, :enabled).new)
|
168
|
+
|
169
|
+
# assert_raises(Dry::Types::ConstraintError) { twin.title = nil } # in form, we either have a blank string or the key's not present at all.
|
170
|
+
twin.title = nil
|
171
|
+
twin.title.must_be_nil
|
172
|
+
|
173
|
+
twin.title = "" # nilify blank strings
|
174
|
+
twin.title.must_be_nil
|
175
|
+
|
176
|
+
twin.title = "Yo"
|
177
|
+
twin.title.must_equal "Yo"
|
178
|
+
|
179
|
+
twin.enabled = " TRUE"
|
180
|
+
twin.enabled.must_equal true
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
# def title=(String value) # allow obj.title = "bla"
|
186
|
+
# def title=(Nil) # allow obj.title = nil
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
# active = " TRUE HACK"
|
191
|
+
# how to test/validate if active is boolean?
|
192
|
+
|
data/test/twin/default_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
3
|
class DefaultTest < Minitest::Spec
|
4
|
-
Song = Struct.new(:title, :genre, :composer)
|
4
|
+
Song = Struct.new(:title, :new_album, :published, :genre, :composer)
|
5
5
|
Composer = Struct.new(:name)
|
6
6
|
|
7
7
|
class Twin < Disposable::Twin
|
@@ -12,14 +12,18 @@ class DefaultTest < Minitest::Spec
|
|
12
12
|
property :composer, default: Composer.new do
|
13
13
|
property :name, default: "NOFX"
|
14
14
|
end
|
15
|
+
property :published, default: false
|
16
|
+
property :new_album, default: true
|
15
17
|
end
|
16
18
|
|
17
19
|
# all given.
|
18
20
|
it do
|
19
|
-
twin = Twin.new(Song.new("Anarchy Camp", "Punk", Composer.new("Nofx")))
|
21
|
+
twin = Twin.new(Song.new("Anarchy Camp", false, true, "Punk", Composer.new("Nofx")))
|
20
22
|
twin.title.must_equal "Anarchy Camp"
|
21
23
|
twin.genre.must_equal "Punk"
|
22
24
|
twin.composer.name.must_equal "Nofx"
|
25
|
+
twin.published.must_equal true
|
26
|
+
twin.new_album.must_equal false
|
23
27
|
end
|
24
28
|
|
25
29
|
# defaults, please.
|
@@ -28,12 +32,15 @@ class DefaultTest < Minitest::Spec
|
|
28
32
|
twin.title.must_equal "Medio-Core"
|
29
33
|
twin.composer.name.must_equal "NOFX"
|
30
34
|
twin.genre.must_equal "Punk Rock DefaultTest::Song"
|
35
|
+
twin.published.must_equal false
|
36
|
+
twin.new_album.must_equal true
|
31
37
|
end
|
32
38
|
|
33
39
|
# false value is not defaulted.
|
34
40
|
it do
|
35
|
-
twin = Twin.new(Song.new(false))
|
41
|
+
twin = Twin.new(Song.new(false, false))
|
36
42
|
twin.title.must_equal false
|
43
|
+
twin.new_album.must_equal false
|
37
44
|
end
|
38
45
|
|
39
46
|
describe "inheritance" do
|
metadata
CHANGED
@@ -1,36 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: disposable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: uber
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "<"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.2.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
|
-
version:
|
26
|
+
version: 0.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: declarative
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.0.
|
33
|
+
version: 0.0.9
|
34
34
|
- - "<"
|
35
35
|
- !ruby/object:Gem::Version
|
36
36
|
version: 1.0.0
|
@@ -40,10 +40,38 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.0.
|
43
|
+
version: 0.0.9
|
44
44
|
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 1.0.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: declarative-builder
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "<"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.2.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "<"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 0.2.0
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: declarative-option
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "<"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.2.0
|
68
|
+
type: :runtime
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "<"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.2.0
|
47
75
|
- !ruby/object:Gem::Dependency
|
48
76
|
name: representable
|
49
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,16 +138,16 @@ dependencies:
|
|
110
138
|
name: activerecord
|
111
139
|
requirement: !ruby/object:Gem::Requirement
|
112
140
|
requirements:
|
113
|
-
- -
|
141
|
+
- - '='
|
114
142
|
- !ruby/object:Gem::Version
|
115
|
-
version:
|
143
|
+
version: 4.2.5
|
116
144
|
type: :development
|
117
145
|
prerelease: false
|
118
146
|
version_requirements: !ruby/object:Gem::Requirement
|
119
147
|
requirements:
|
120
|
-
- -
|
148
|
+
- - '='
|
121
149
|
- !ruby/object:Gem::Version
|
122
|
-
version:
|
150
|
+
version: 4.2.5
|
123
151
|
- !ruby/object:Gem::Dependency
|
124
152
|
name: sqlite3
|
125
153
|
requirement: !ruby/object:Gem::Requirement
|
@@ -249,7 +277,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
277
|
version: '0'
|
250
278
|
requirements: []
|
251
279
|
rubyforge_project:
|
252
|
-
rubygems_version: 2.
|
280
|
+
rubygems_version: 2.6.3
|
253
281
|
signing_key:
|
254
282
|
specification_version: 4
|
255
283
|
summary: Decorators on top of your ORM layer with change tracking, collection semantics
|