disposable 0.1.4 → 0.1.5
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 +6 -0
- data/Gemfile +1 -1
- data/README.md +8 -0
- data/database.sqlite3 +0 -0
- data/lib/disposable/twin.rb +4 -0
- data/lib/disposable/twin/setup.rb +6 -1
- data/lib/disposable/twin/sync.rb +13 -3
- data/lib/disposable/version.rb +1 -1
- data/test/skip_getter_test.rb +7 -0
- data/test/twin/changed_test.rb +31 -2
- data/test/twin/setup_test.rb +16 -0
- data/test/twin/skip_unchanged_test.rb +3 -3
- data/test/twin/virtual_test.rb +25 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0f85e8b618ecd45ecb2a9fcaca32ab1e28d8377
|
4
|
+
data.tar.gz: fb2f9474bd6f8aeca1f2ab5bd808825a62a00ff0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 447222f485c8c0b950f5916ecf6a36f5337fab008e33beaedd3462c761d6c733a41c0c9bb6bfeb1aefd9bc2d74c1fa253a287a824d5234aa4eca486c6f58d2aa
|
7
|
+
data.tar.gz: 3f1daef9a44efbd2946fc4013529d9d272883b7d46ebda0108685e33640a4a3585a6e337b8006663b965fb84d241262e5f8b9403383b3f6fd81a93a7c5d2307f
|
data/CHANGES.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -539,6 +539,14 @@ collection :songs do
|
|
539
539
|
end
|
540
540
|
```
|
541
541
|
|
542
|
+
## Readable, Writeable, Virtual
|
543
|
+
|
544
|
+
Properties can have various access settings.
|
545
|
+
|
546
|
+
* `readable: false` won't read from the model in `Setup`.
|
547
|
+
* `writeable: false` won't write to model in `Sync`.
|
548
|
+
* `virtual: true` is both settings above combined.
|
549
|
+
|
542
550
|
## Builders
|
543
551
|
|
544
552
|
## Used In
|
data/database.sqlite3
CHANGED
Binary file
|
data/lib/disposable/twin.rb
CHANGED
@@ -47,6 +47,10 @@ module Disposable
|
|
47
47
|
options[:private_name] = options.delete(:from) || name
|
48
48
|
options[:pass_options] = true
|
49
49
|
|
50
|
+
if options.delete(:virtual)
|
51
|
+
options[:writeable] = options[:readable] = false
|
52
|
+
end
|
53
|
+
|
50
54
|
representer_class.property(name, options, &block).tap do |definition|
|
51
55
|
mod = Module.new do
|
52
56
|
define_method(name) { @fields[name.to_s] }
|
@@ -30,7 +30,7 @@ module Disposable
|
|
30
30
|
setup_write!(dfn, value)
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
merge_options!(options) # FIXME: call writer!!!!!!!!!!
|
34
34
|
# from_hash(options) # assigns known properties from options.
|
35
35
|
end
|
36
36
|
|
@@ -38,6 +38,11 @@ module Disposable
|
|
38
38
|
send(dfn.setter, value)
|
39
39
|
end
|
40
40
|
|
41
|
+
def merge_options!(options)
|
42
|
+
# TODO: ask charliesome if that is faster with return unless options.size.
|
43
|
+
options.each { |k, v| @fields[k.to_s] = v } # TODO: this merges every option, not only defined ones.
|
44
|
+
end
|
45
|
+
|
41
46
|
|
42
47
|
# Including this will _not_ use the property's setter in Setup and allow you to override it.
|
43
48
|
module SkipSetter
|
data/lib/disposable/twin/sync.rb
CHANGED
@@ -48,7 +48,11 @@ class Disposable::Twin
|
|
48
48
|
|
49
49
|
module ToNestedHash
|
50
50
|
def to_nested_hash(*)
|
51
|
-
self.class.nested_hash_representer.new(
|
51
|
+
self.class.nested_hash_representer.new(nested_hash_source).to_hash
|
52
|
+
end
|
53
|
+
|
54
|
+
def nested_hash_source
|
55
|
+
self
|
52
56
|
end
|
53
57
|
|
54
58
|
module ClassMethods
|
@@ -58,8 +62,10 @@ class Disposable::Twin
|
|
58
62
|
include Representable::Hash
|
59
63
|
|
60
64
|
representable_attrs.each do |dfn|
|
61
|
-
dfn.merge!(
|
62
|
-
|
65
|
+
dfn.merge!(
|
66
|
+
readable: true, # the nested hash contains all fields.
|
67
|
+
as: dfn[:private_name] # nested hash keys by model property names.
|
68
|
+
)
|
63
69
|
|
64
70
|
dfn.merge!(
|
65
71
|
prepare: lambda { |model, *| model }, # TODO: why do we need that here?
|
@@ -122,6 +128,10 @@ class Disposable::Twin
|
|
122
128
|
def sync_read(dfn)
|
123
129
|
@fields[dfn.name]
|
124
130
|
end
|
131
|
+
|
132
|
+
def nested_hash_source
|
133
|
+
OpenStruct.new(@fields)
|
134
|
+
end
|
125
135
|
end
|
126
136
|
end
|
127
137
|
end
|
data/lib/disposable/version.rb
CHANGED
data/test/skip_getter_test.rb
CHANGED
@@ -33,6 +33,13 @@ class SkipGetterTest < MiniTest::Spec
|
|
33
33
|
|
34
34
|
album.title.must_equal "Wild Frontier"
|
35
35
|
album.artist.name.must_equal "Gary Moore"
|
36
|
+
|
37
|
+
# nested hash.
|
38
|
+
nested_hash = nil
|
39
|
+
twin.sync do |hash|
|
40
|
+
nested_hash = hash
|
41
|
+
end
|
42
|
+
nested_hash.must_equal({"title"=>"Wild Frontier", "artist"=>{"name"=>"Gary Moore"}})
|
36
43
|
end
|
37
44
|
end
|
38
45
|
|
data/test/twin/changed_test.rb
CHANGED
@@ -10,7 +10,6 @@ class ChangedWithSetupTest < MiniTest::Spec
|
|
10
10
|
|
11
11
|
module Twin
|
12
12
|
class Album < Disposable::Twin
|
13
|
-
feature Setup
|
14
13
|
feature Changed
|
15
14
|
# include Coercion
|
16
15
|
property :name
|
@@ -25,7 +24,6 @@ class ChangedWithSetupTest < MiniTest::Spec
|
|
25
24
|
end
|
26
25
|
|
27
26
|
property :artist do
|
28
|
-
include Setup
|
29
27
|
property :name
|
30
28
|
end
|
31
29
|
end
|
@@ -105,4 +103,35 @@ class ChangedWithSetupTest < MiniTest::Spec
|
|
105
103
|
twin.name = "The Rest Is Silence"
|
106
104
|
twin.changed?.must_equal false
|
107
105
|
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
require "disposable/twin/coercion"
|
110
|
+
class ChangedWithCoercionTest < MiniTest::Spec
|
111
|
+
Song = Struct.new(:released)
|
112
|
+
|
113
|
+
class SongTwin < Disposable::Twin
|
114
|
+
include Changed
|
115
|
+
include Coercion
|
116
|
+
|
117
|
+
property :released, type: Virtus::Attribute::Boolean
|
118
|
+
end
|
119
|
+
|
120
|
+
it do
|
121
|
+
twin = SongTwin.new(Song.new)
|
122
|
+
twin.changed?(:released).must_equal false
|
123
|
+
twin.released = 1
|
124
|
+
twin.released.must_equal true
|
125
|
+
twin.changed?(:released).must_equal true
|
126
|
+
end
|
127
|
+
|
128
|
+
it do
|
129
|
+
twin = SongTwin.new(Song.new(true))
|
130
|
+
twin.released = true
|
131
|
+
twin.changed?(:released).must_equal false
|
132
|
+
twin.released = 1 # it coerces, then assigns, then compares, which makes this NOT changed.
|
133
|
+
twin.changed?(:released).must_equal false
|
134
|
+
twin.released = false
|
135
|
+
twin.changed?(:released).must_equal true
|
136
|
+
end
|
108
137
|
end
|
data/test/twin/setup_test.rb
CHANGED
@@ -136,4 +136,20 @@ class TwinSetupWithInlineTwinsTest < MiniTest::Spec
|
|
136
136
|
twin.songs[1].composer.must_be_kind_of Disposable::Twin
|
137
137
|
twin.songs[1].composer.id.must_equal 2
|
138
138
|
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# Twin.new(model, is_online: true)
|
142
|
+
class TwinWithVirtualSetupTest < MiniTest::Spec
|
143
|
+
Song = Struct.new(:id)
|
144
|
+
|
145
|
+
class AlbumTwin < Disposable::Twin
|
146
|
+
property :id
|
147
|
+
property :is_online, readable: false, writeable: false
|
148
|
+
end
|
149
|
+
|
150
|
+
it do
|
151
|
+
twin = AlbumTwin.new(Song.new(1), is_online: true)
|
152
|
+
twin.id.must_equal 1
|
153
|
+
twin.is_online.must_equal true
|
154
|
+
end
|
139
155
|
end
|
@@ -46,9 +46,9 @@ class SkipUnchangedTest < MiniTest::Spec
|
|
46
46
|
twin.songs[0].title = "Resist Stance"
|
47
47
|
|
48
48
|
# raises exceptions when setters are called.
|
49
|
-
album.instance_eval { def name=; end }
|
50
|
-
artist.instance_eval { def name=; end }
|
51
|
-
song_with_composer.instance_eval { def title=; end }
|
49
|
+
album.instance_eval { def name=; raise; end }
|
50
|
+
artist.instance_eval { def name=; raise; end }
|
51
|
+
song_with_composer.instance_eval { def title=; raise; end }
|
52
52
|
|
53
53
|
twin.sync
|
54
54
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class VirtualTest < MiniTest::Spec
|
4
|
+
class CreditCardTwin < Disposable::Twin
|
5
|
+
include Sync
|
6
|
+
property :credit_card_number, virtual: true # no read, no write, it's virtual.
|
7
|
+
end
|
8
|
+
|
9
|
+
let (:twin) { CreditCardTwin.new(Object.new) }
|
10
|
+
|
11
|
+
it {
|
12
|
+
twin.credit_card_number = "123"
|
13
|
+
|
14
|
+
twin.credit_card_number.must_equal "123" # this is still readable in the UI.
|
15
|
+
|
16
|
+
twin.sync
|
17
|
+
|
18
|
+
hash = {}
|
19
|
+
twin.sync do |nested|
|
20
|
+
hash = nested
|
21
|
+
end
|
22
|
+
|
23
|
+
hash.must_equal("credit_card_number"=> "123")
|
24
|
+
}
|
25
|
+
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.5
|
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-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: uber
|
@@ -202,6 +202,7 @@ files:
|
|
202
202
|
- test/twin/sync_option_test.rb
|
203
203
|
- test/twin/sync_test.rb
|
204
204
|
- test/twin/twin_test.rb
|
205
|
+
- test/twin/virtual_test.rb
|
205
206
|
- test/twin/writeable_test.rb
|
206
207
|
homepage: https://github.com/apotonick/disposable
|
207
208
|
licenses:
|
@@ -257,4 +258,5 @@ test_files:
|
|
257
258
|
- test/twin/sync_option_test.rb
|
258
259
|
- test/twin/sync_test.rb
|
259
260
|
- test/twin/twin_test.rb
|
261
|
+
- test/twin/virtual_test.rb
|
260
262
|
- test/twin/writeable_test.rb
|