lazy_doc 0.3.0 → 0.4.0
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 +8 -8
- data/README.md +22 -0
- data/lib/lazy_doc.rb +3 -1
- data/lib/lazy_doc/collection.rb +12 -0
- data/lib/lazy_doc/commands/as_class_command.rb +2 -2
- data/lib/lazy_doc/dsl.rb +6 -6
- data/lib/lazy_doc/parse_if_necessary.rb +15 -0
- data/lib/lazy_doc/version.rb +1 -1
- data/spec/acceptance/collections_spec.rb +38 -0
- data/spec/acceptance/support/lotr_characters.json +14 -0
- data/spec/lib/lazy_doc/collection_spec.rb +34 -0
- data/spec/lib/lazy_doc/commands/as_class_command_spec.rb +2 -2
- data/spec/lib/lazy_doc/dsl_spec.rb +8 -0
- data/spec/lib/lazy_doc/parse_if_necessary_spec.rb +38 -0
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NGFlOWEyOWNhZWExN2I2ZmI4MGEwZTFjZDcxZDdhYjM4ZWRlNzVkMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZDg0OWU4OTNjNDQ3NDk2N2VjNTY2YzkxYjkwMmQ3ZGRiY2MwMGNiMQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
M2ZjZDY4ZGVlNjczOTA4NzU0MDFkZTQwY2M0M2I3OTVkZGZhMTZmNGJiNzVh
|
10
|
+
N2ZiZmI5ZmY0YTViMDcxMjI4YTMzYzIwNTUxNDkzODhkZjA0MGFkNjYyYjdi
|
11
|
+
OTY2YTI2NDdhNmM3MDk0MDdiMTc3YTE2NjhkY2EyODFkZTlmM2I=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MWU3NzkxMzViMTllNmFlM2I1YzM3MDIwMDgyZTU2OTVlNWQxZjMwZmJkZjcx
|
14
|
+
YWEwNTBlMTI5MjVkMTM1OTA2NTVjMTExYWJjMjRkNDFhYmQ1OGE3ZTE2Njc4
|
15
|
+
YWZjZjk4MTYxMWM3M2JmMDRlMWUzZjlkNDNiNzViOWFmMTk0NWE=
|
data/README.md
CHANGED
@@ -55,6 +55,28 @@ puts user.address
|
|
55
55
|
puts user.job
|
56
56
|
```
|
57
57
|
|
58
|
+
## Collections
|
59
|
+
|
60
|
+
When the document has a top-level array, use the `LazyDoc::Collection` class to transform it into an array of LazyDoc objects.
|
61
|
+
|
62
|
+
usage:
|
63
|
+
```ruby
|
64
|
+
class User
|
65
|
+
include LazyDoc::DSL
|
66
|
+
|
67
|
+
access :name
|
68
|
+
|
69
|
+
# more...
|
70
|
+
end
|
71
|
+
|
72
|
+
json = '[{"name": "Brian"}, {"name": "Chris"}]'
|
73
|
+
users = LazyDoc::Collection.build(json, User)
|
74
|
+
|
75
|
+
users.each do |user|
|
76
|
+
puts user.name
|
77
|
+
end
|
78
|
+
```
|
79
|
+
|
58
80
|
## Contributing
|
59
81
|
|
60
82
|
1. Fork it
|
data/lib/lazy_doc.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'lazy_doc/attribute_not_found_error'
|
2
2
|
require 'lazy_doc/camelizable_string'
|
3
|
+
require 'lazy_doc/parse_if_necessary'
|
3
4
|
require 'lazy_doc/commands'
|
4
|
-
require 'lazy_doc/
|
5
|
+
require 'lazy_doc/collection'
|
5
6
|
require 'lazy_doc/memoizer'
|
7
|
+
require 'lazy_doc/dsl'
|
6
8
|
require 'lazy_doc/version'
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module LazyDoc
|
2
|
+
class Collection
|
3
|
+
extend ParseIfNecessary
|
4
|
+
|
5
|
+
def self.build(document, element_class)
|
6
|
+
as_class_command = Commands::AsClassCommand.new(element_class)
|
7
|
+
collection = as_class_command.execute(parse_if_necessary(document))
|
8
|
+
|
9
|
+
[collection].flatten
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/lazy_doc/dsl.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
1
|
module LazyDoc
|
4
2
|
module DSL
|
3
|
+
include ParseIfNecessary
|
4
|
+
|
5
5
|
def self.included(base)
|
6
6
|
base.extend ClassMethods
|
7
7
|
end
|
8
8
|
|
9
|
-
def lazily_embed(
|
10
|
-
@
|
9
|
+
def lazily_embed(document)
|
10
|
+
@embedded_doc_source = document
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
14
14
|
|
15
15
|
def memoizer
|
16
|
-
@
|
16
|
+
@memoizer ||= Memoizer.new
|
17
17
|
end
|
18
18
|
|
19
19
|
def embedded_doc
|
20
|
-
@
|
20
|
+
@embedded_doc ||= parse_if_necessary(@embedded_doc_source)
|
21
21
|
end
|
22
22
|
|
23
23
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module LazyDoc
|
4
|
+
module ParseIfNecessary
|
5
|
+
def parse_if_necessary(document)
|
6
|
+
already_parsed?(document) ? document : JSON.parse(document)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def already_parsed?(document)
|
12
|
+
document.is_a?(Hash) || document.is_a?(Array)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/lazy_doc/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe 'behavior when the JSON is an array' do
|
4
|
+
class LotrCharacter
|
5
|
+
include LazyDoc::DSL
|
6
|
+
|
7
|
+
access :name, :race
|
8
|
+
|
9
|
+
def initialize(json)
|
10
|
+
lazily_embed(json)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:json_file) { File.read(File.join(File.dirname(__FILE__), 'support/lotr_characters.json')) }
|
15
|
+
|
16
|
+
subject(:users) { LazyDoc::Collection.build(json_file, LotrCharacter) }
|
17
|
+
|
18
|
+
context 'frodo' do
|
19
|
+
let(:frodo) { users[0] }
|
20
|
+
|
21
|
+
specify { expect(frodo.name).to eq('Frodo Baggins') }
|
22
|
+
specify { expect(frodo.race).to eq('Hobbit') }
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'sam' do
|
26
|
+
let(:sam) { users[1] }
|
27
|
+
|
28
|
+
specify { expect(sam.name).to eq('Samwise Gamgee') }
|
29
|
+
specify { expect(sam.race).to eq('Hobbit') }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'gandolf' do
|
33
|
+
let(:gandolf) { users[2] }
|
34
|
+
|
35
|
+
specify { expect(gandolf.name).to eq('Gandolf the Grey') }
|
36
|
+
specify { expect(gandolf.race).to eq('Wizard') }
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
|
3
|
+
module LazyDoc
|
4
|
+
describe Collection do
|
5
|
+
class FooBar
|
6
|
+
include LazyDoc::DSL
|
7
|
+
|
8
|
+
access :foo
|
9
|
+
|
10
|
+
def initialize(json)
|
11
|
+
lazily_embed(json)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:json) { '[{"foo": "bar"}, {"foo": "blarg"}, {"foo": "wibble"}]' }
|
16
|
+
|
17
|
+
let(:collection) { LazyDoc::Collection.build(json, FooBar) }
|
18
|
+
|
19
|
+
it 'is an Enumerable' do
|
20
|
+
collection.each do |foo_bar|
|
21
|
+
expect(foo_bar).to be_a FooBar
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when the expected document collection is actually a single element' do
|
26
|
+
let(:json) { '{"foo": "bar"}' }
|
27
|
+
|
28
|
+
specify { expect(collection).to have(1).element }
|
29
|
+
specify { expect(collection.first).to be_a FooBar }
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -30,10 +30,10 @@ module LazyDoc
|
|
30
30
|
expect(as_class_value).to eq(value)
|
31
31
|
end
|
32
32
|
|
33
|
-
it 'passes the value
|
33
|
+
it 'passes the value to the specified class' do
|
34
34
|
as_class_command = Commands::AsClassCommand.new(Foo)
|
35
35
|
|
36
|
-
Foo.should_receive(:new).with(
|
36
|
+
Foo.should_receive(:new).with(value)
|
37
37
|
|
38
38
|
as_class_command.execute(value)
|
39
39
|
end
|
@@ -49,6 +49,14 @@ module LazyDoc
|
|
49
49
|
expect { test_find.singleton_class.access :foo, :blarg, as: Foo}.to raise_error(ArgumentError, 'Options provided for multiple attributes')
|
50
50
|
end
|
51
51
|
|
52
|
+
it 'can access properties when the supplied document is already a hash' do
|
53
|
+
test_find.singleton_class.access :foo, :blarg
|
54
|
+
test_find.lazily_embed(JSON.parse(json))
|
55
|
+
|
56
|
+
expect(test_find.foo).to eq("bar")
|
57
|
+
expect(test_find.blarg).to eq("wibble")
|
58
|
+
end
|
59
|
+
|
52
60
|
context 'via' do
|
53
61
|
it 'defines a method that accesses a named json attribute' do
|
54
62
|
test_find.singleton_class.access :my_foo, via: :foo
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
|
3
|
+
module LazyDoc
|
4
|
+
describe ParseIfNecessary do
|
5
|
+
class TestParseIfNecessary
|
6
|
+
include ParseIfNecessary
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:test_parser) { TestParseIfNecessary.new }
|
10
|
+
|
11
|
+
it 'parses a JSON string' do
|
12
|
+
hash = test_parser.parse_if_necessary('{"foo":"bar"}')
|
13
|
+
|
14
|
+
expect(hash).to be_a Hash
|
15
|
+
expect(hash['foo']).to eq('bar')
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'does not parse a Hash' do
|
19
|
+
JSON.should_not_receive(:parse)
|
20
|
+
|
21
|
+
hash = test_parser.parse_if_necessary({foo: 'bar'})
|
22
|
+
|
23
|
+
expect(hash).to be_a Hash
|
24
|
+
expect(hash[:foo]).to eq('bar')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'does not parse an Array' do
|
28
|
+
JSON.should_not_receive(:parse)
|
29
|
+
|
30
|
+
array = test_parser.parse_if_necessary([{foo: 'bar'}, {foo: 'bang'}])
|
31
|
+
|
32
|
+
expect(array).to be_an Array
|
33
|
+
expect(array[0]).to eq({foo: 'bar'})
|
34
|
+
expect(array[1]).to eq({foo: 'bang'})
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lazy_doc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Oglesby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- lib/lazy_doc.rb
|
60
60
|
- lib/lazy_doc/attribute_not_found_error.rb
|
61
61
|
- lib/lazy_doc/camelizable_string.rb
|
62
|
+
- lib/lazy_doc/collection.rb
|
62
63
|
- lib/lazy_doc/commands.rb
|
63
64
|
- lib/lazy_doc/commands/as_class_command.rb
|
64
65
|
- lib/lazy_doc/commands/default_value_command.rb
|
@@ -67,10 +68,14 @@ files:
|
|
67
68
|
- lib/lazy_doc/commands/via_command.rb
|
68
69
|
- lib/lazy_doc/dsl.rb
|
69
70
|
- lib/lazy_doc/memoizer.rb
|
71
|
+
- lib/lazy_doc/parse_if_necessary.rb
|
70
72
|
- lib/lazy_doc/version.rb
|
71
73
|
- spec/acceptance/basic_behavior_spec.rb
|
74
|
+
- spec/acceptance/collections_spec.rb
|
75
|
+
- spec/acceptance/support/lotr_characters.json
|
72
76
|
- spec/acceptance/support/user.json
|
73
77
|
- spec/lib/lazy_doc/camelizable_string_spec.rb
|
78
|
+
- spec/lib/lazy_doc/collection_spec.rb
|
74
79
|
- spec/lib/lazy_doc/commands/as_class_command_spec.rb
|
75
80
|
- spec/lib/lazy_doc/commands/default_value_command_spec.rb
|
76
81
|
- spec/lib/lazy_doc/commands/extract_command_spec.rb
|
@@ -79,6 +84,7 @@ files:
|
|
79
84
|
- spec/lib/lazy_doc/commands_spec.rb
|
80
85
|
- spec/lib/lazy_doc/dsl_spec.rb
|
81
86
|
- spec/lib/lazy_doc/memoizer_spec.rb
|
87
|
+
- spec/lib/lazy_doc/parse_if_necessary_spec.rb
|
82
88
|
- spec/spec_helper.rb
|
83
89
|
- spec/support/shared_examples.rb
|
84
90
|
homepage: https://github.com/ryanoglesby08/lazy-doc
|
@@ -107,8 +113,11 @@ specification_version: 4
|
|
107
113
|
summary: An implementation of the Embedded Document pattern for POROs
|
108
114
|
test_files:
|
109
115
|
- spec/acceptance/basic_behavior_spec.rb
|
116
|
+
- spec/acceptance/collections_spec.rb
|
117
|
+
- spec/acceptance/support/lotr_characters.json
|
110
118
|
- spec/acceptance/support/user.json
|
111
119
|
- spec/lib/lazy_doc/camelizable_string_spec.rb
|
120
|
+
- spec/lib/lazy_doc/collection_spec.rb
|
112
121
|
- spec/lib/lazy_doc/commands/as_class_command_spec.rb
|
113
122
|
- spec/lib/lazy_doc/commands/default_value_command_spec.rb
|
114
123
|
- spec/lib/lazy_doc/commands/extract_command_spec.rb
|
@@ -117,5 +126,6 @@ test_files:
|
|
117
126
|
- spec/lib/lazy_doc/commands_spec.rb
|
118
127
|
- spec/lib/lazy_doc/dsl_spec.rb
|
119
128
|
- spec/lib/lazy_doc/memoizer_spec.rb
|
129
|
+
- spec/lib/lazy_doc/parse_if_necessary_spec.rb
|
120
130
|
- spec/spec_helper.rb
|
121
131
|
- spec/support/shared_examples.rb
|