cartograph 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cartograph::RootKey do
4
+ describe '#initialize' do
5
+ it 'initializes with options' do
6
+ options = { singular: 'hello', plural: 'hellos', scopes: [:read] }
7
+
8
+ instance = Cartograph::RootKey.new(options)
9
+ expect(instance.options).to eq(options)
10
+ end
11
+ end
12
+
13
+ describe '#scopes' do
14
+ it 'reads the scopes' do
15
+ instance = Cartograph::RootKey.new(scopes: [:read])
16
+ expect(instance.scopes).to eq([:read])
17
+ end
18
+
19
+ it 'reads the scopes as an array always' do
20
+ instance = Cartograph::RootKey.new(scopes: :read)
21
+ expect(instance.scopes).to eq([:read])
22
+ end
23
+ end
24
+
25
+ describe '#singular' do
26
+ it 'reads the singular key' do
27
+ instance = Cartograph::RootKey.new(singular: 'user')
28
+ expect(instance.singular).to eq('user')
29
+ end
30
+ end
31
+
32
+ describe '#plural' do
33
+ it 'reads the plural key' do
34
+ instance = Cartograph::RootKey.new(plural: 'user')
35
+ expect(instance.plural).to eq('user')
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cartograph::Sculptor do
4
+ describe '#initialize' do
5
+ it 'initializes with a hash and map' do
6
+ hash = {}
7
+ map = double('im a map')
8
+
9
+ sculptor = Cartograph::Sculptor.new(hash, map)
10
+
11
+ expect(sculptor.object).to be(hash)
12
+ expect(sculptor.map).to be(map)
13
+ end
14
+ end
15
+
16
+ describe '#sculpted_object=' do
17
+ context 'objects that are not the mapping class' do
18
+ it 'raises an error' do
19
+ hash = {}
20
+ map = double(Cartograph::Map, mapping: Hash)
21
+
22
+ sculptor = Cartograph::Sculptor.new(hash, map)
23
+
24
+ expect {
25
+ sculptor.sculpted_object = ""
26
+ }.to raise_error(ArgumentError)
27
+ end
28
+ end
29
+ end
30
+
31
+ describe '#sculpt' do
32
+ let(:map) { Cartograph::Map.new }
33
+ let(:object) { { 'id' => 343, 'name' => 'Guilty Spark', 'email_address' => 'guilty@bungie.net' } }
34
+
35
+ it 'returns nil if the object in nil' do
36
+ sculptor = Cartograph::Sculptor.new(nil, map)
37
+ expect(sculptor.sculpt).to be_nil
38
+ end
39
+
40
+ context 'without a scope' do
41
+ before do
42
+ map.mapping DummyUser
43
+ map.property :id, scopes: [:read]
44
+ map.property :name, scopes: [:read, :create]
45
+ map.property :email, scopes: [:read, :create], key: 'email_address'
46
+ end
47
+
48
+ it 'returns a coerced user' do
49
+ sculptor = Cartograph::Sculptor.new(object, map)
50
+ sculpted = sculptor.sculpt
51
+
52
+ expect(sculpted).to be_kind_of(DummyUser)
53
+ expect(sculpted.id).to eq(object['id'])
54
+ expect(sculpted.name).to eq(object['name'])
55
+ expect(sculpted.email).to eq(object['email_address'])
56
+ end
57
+
58
+ it 'sculpts into a provided object' do
59
+ sculptor = Cartograph::Sculptor.new(object, map)
60
+ dummy = DummyUser.new
61
+ sculptor.sculpted_object = dummy
62
+ sculpted = sculptor.sculpt
63
+
64
+ expect(sculpted).to eq(dummy)
65
+ end
66
+ end
67
+
68
+ context 'with a scope' do
69
+ before do
70
+ map.mapping DummyUser
71
+ map.property :id, scopes: [:read]
72
+ map.property :name, scopes: [:create]
73
+ end
74
+
75
+ it 'returns a coerced user' do
76
+ sculptor = Cartograph::Sculptor.new(object, map)
77
+ sculpted = sculptor.sculpt(:read)
78
+
79
+ expect(sculpted).to be_kind_of(DummyUser)
80
+ expect(sculpted.id).to eq(object['id'])
81
+ expect(sculpted.name).to be_nil
82
+ end
83
+
84
+ context 'for nested properties' do
85
+ let(:object) { super().merge('comment' => { 'id' => 123, 'text' => 'hello' }) }
86
+
87
+ before do
88
+ map.property :comment, scopes: [:read] do
89
+ mapping DummyComment
90
+
91
+ property :id, scopes: [:read]
92
+ property :text, scopes: [:create]
93
+ end
94
+ end
95
+
96
+ it 'returns the nested objects with scoped properties set' do
97
+ sculptor = Cartograph::Sculptor.new(object, map)
98
+ sculpted = sculptor.sculpt(:read)
99
+
100
+ expect(sculpted.comment).to be_kind_of(DummyComment)
101
+ expect(sculpted.comment.id).to eq(123)
102
+ expect(sculpted.comment.text).to be_nil
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,77 @@
1
+ require 'cartograph'
2
+
3
+ require 'pry'
4
+
5
+ Dir['./spec/support/**/*.rb'].each {|f| load f }
6
+
7
+ RSpec.configure do |config|
8
+ # The settings below are suggested to provide a good initial experience
9
+ # with RSpec, but feel free to customize to your heart's content.
10
+
11
+ # These two settings work together to allow you to limit a spec run
12
+ # to individual examples or groups you care about by tagging them with
13
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
14
+ # get run.
15
+ config.filter_run :focus
16
+ config.run_all_when_everything_filtered = true
17
+
18
+ config.after(:each) do
19
+ Cartograph.default_dumper = JSON
20
+ Cartograph.default_loader = JSON
21
+ Cartograph.default_cache = nil
22
+ Cartograph.default_cache_key = nil
23
+ end
24
+
25
+ =begin
26
+
27
+ # Many RSpec users commonly either run the entire suite or an individual
28
+ # file, and it's useful to allow more verbose output when running an
29
+ # individual spec file.
30
+ if config.files_to_run.one?
31
+ # Use the documentation formatter for detailed output,
32
+ # unless a formatter has already been configured
33
+ # (e.g. via a command-line flag).
34
+ config.default_formatter = 'doc'
35
+ end
36
+
37
+ # Print the 10 slowest examples and example groups at the
38
+ # end of the spec run, to help surface which specs are running
39
+ # particularly slow.
40
+ config.profile_examples = 10
41
+
42
+ # Run specs in random order to surface order dependencies. If you find an
43
+ # order dependency and want to debug it, you can fix the order by providing
44
+ # the seed, which is printed after each run.
45
+ # --seed 1234
46
+ config.order = :random
47
+
48
+ # Seed global randomization in this process using the `--seed` CLI option.
49
+ # Setting this allows you to use `--seed` to deterministically reproduce
50
+ # test failures related to randomization by passing the same `--seed` value
51
+ # as the one that triggered the failure.
52
+ Kernel.srand config.seed
53
+
54
+ # rspec-expectations config goes here. You can use an alternate
55
+ # assertion/expectation library such as wrong or the stdlib/minitest
56
+ # assertions if you prefer.
57
+ config.expect_with :rspec do |expectations|
58
+ # Enable only the newer, non-monkey-patching expect syntax.
59
+ # For more details, see:
60
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
61
+ expectations.syntax = :expect
62
+ end
63
+
64
+ # rspec-mocks config goes here. You can use an alternate test double
65
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
66
+ config.mock_with :rspec do |mocks|
67
+ # Enable only the newer, non-monkey-patching expect syntax.
68
+ # For more details, see:
69
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
70
+ mocks.syntax = :expect
71
+
72
+ # Prevents you from mocking or stubbing a method that does not exist on
73
+ # a real object. This is generally recommended.
74
+ mocks.verify_partial_doubles = true
75
+ end
76
+ =end
77
+ end
@@ -0,0 +1,22 @@
1
+ shared_context "DSL Objects" do
2
+ let(:object) { double('object', id: 1066, name: 'Bruce (the dude from Finding Nemo)') }
3
+ let(:mapped) do
4
+ Class.new do
5
+ include Cartograph::DSL
6
+
7
+ cartograph do
8
+ mapping DummyUser
9
+
10
+ property :id, scopes: [:read]
11
+ property :name, scopes: [:read, :create]
12
+
13
+ property :comments, plural: true do
14
+ mapping DummyComment
15
+
16
+ property :id, scopes: [:read]
17
+ property :text, scopes: [:read, :create]
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,2 @@
1
+ class DummyComment < OpenStruct
2
+ end
@@ -0,0 +1,2 @@
1
+ class DummyUser < OpenStruct
2
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cartograph
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Robert Ross
8
+ - Kyrylo Silin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2017-09-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '12.0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '12.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rspec
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '3.6'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '3.6'
42
+ - !ruby/object:Gem::Dependency
43
+ name: pry
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ description: Cartograph makes it easy to generate and convert JSON. It's intention
57
+ is to be used for API clients.
58
+ email:
59
+ - silin@kyrylo.org
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".gitignore"
65
+ - ".rspec"
66
+ - ".travis.yml"
67
+ - CHANGELOG.md
68
+ - Gemfile
69
+ - LICENSE.txt
70
+ - README.md
71
+ - Rakefile
72
+ - cartograph.gemspec
73
+ - examples/collection_representation.rb
74
+ - examples/domains.rb
75
+ - examples/representation_for.rb
76
+ - lib/cartograph.rb
77
+ - lib/cartograph/artist.rb
78
+ - lib/cartograph/dsl.rb
79
+ - lib/cartograph/map.rb
80
+ - lib/cartograph/property.rb
81
+ - lib/cartograph/property_collection.rb
82
+ - lib/cartograph/root_key.rb
83
+ - lib/cartograph/sculptor.rb
84
+ - lib/cartograph/version.rb
85
+ - spec/lib/cartograph/artist_spec.rb
86
+ - spec/lib/cartograph/dsl_spec.rb
87
+ - spec/lib/cartograph/map_spec.rb
88
+ - spec/lib/cartograph/property_collection_spec.rb
89
+ - spec/lib/cartograph/property_spec.rb
90
+ - spec/lib/cartograph/root_key_spec.rb
91
+ - spec/lib/cartograph/sculptor_spec.rb
92
+ - spec/spec_helper.rb
93
+ - spec/support/dsl_contexts.rb
94
+ - spec/support/dummy_comment.rb
95
+ - spec/support/dummy_user.rb
96
+ homepage: https://github.com/kyrylo/cartograph
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.5.2
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: Cartograph makes it easy to generate and convert JSON. It's intention is
120
+ to be used for API clients.
121
+ test_files:
122
+ - spec/lib/cartograph/artist_spec.rb
123
+ - spec/lib/cartograph/dsl_spec.rb
124
+ - spec/lib/cartograph/map_spec.rb
125
+ - spec/lib/cartograph/property_collection_spec.rb
126
+ - spec/lib/cartograph/property_spec.rb
127
+ - spec/lib/cartograph/root_key_spec.rb
128
+ - spec/lib/cartograph/sculptor_spec.rb
129
+ - spec/spec_helper.rb
130
+ - spec/support/dsl_contexts.rb
131
+ - spec/support/dummy_comment.rb
132
+ - spec/support/dummy_user.rb