supa 0.1.4 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +8 -11
- data/.reek +128 -0
- data/.rspec +2 -0
- data/.rubocop.yml +1197 -1011
- data/.travis.yml +12 -4
- data/Gemfile +0 -1
- data/README.md +54 -10
- data/Rakefile +3 -11
- data/bin/console +4 -4
- data/lib/supa/builder.rb +13 -18
- data/lib/supa/command.rb +38 -8
- data/lib/supa/commands/attribute.rb +1 -3
- data/lib/supa/commands/collection.rb +6 -6
- data/lib/supa/commands/namespace.rb +2 -6
- data/lib/supa/commands/object.rb +2 -4
- data/lib/supa/commands/traits/collectionable.rb +12 -0
- data/lib/supa/representable.rb +1 -4
- data/lib/supa/version.rb +1 -1
- data/lib/supa.rb +7 -1
- data/supa.gemspec +22 -15
- metadata +71 -9
- data/lib/supa/commands/polymorphic.rb +0 -17
data/.travis.yml
CHANGED
@@ -2,11 +2,19 @@ sudo: false
|
|
2
2
|
language: ruby
|
3
3
|
rvm:
|
4
4
|
- 2.3.1
|
5
|
-
|
5
|
+
|
6
|
+
notifications:
|
7
|
+
email: false
|
8
|
+
|
6
9
|
addons:
|
7
10
|
code_climate:
|
8
|
-
repo_token:
|
11
|
+
repo_token: ad743cd1c267d4a84bfa620869f906a68efba51baa3aadc0638b88330ce3ab3a
|
12
|
+
|
13
|
+
cache:
|
14
|
+
- bundler
|
15
|
+
|
16
|
+
before_install: gem install bundler -v 1.13.7
|
17
|
+
script:
|
18
|
+
- bundle exec rake
|
9
19
|
after_success:
|
10
20
|
- bundle exec codeclimate-test-reporter
|
11
|
-
notifications:
|
12
|
-
email: false
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
Ruby object → JSON serialization.
|
4
4
|
|
5
|
-
[![Build Status](https://travis-ci.org/
|
6
|
-
[![Code Climate](https://codeclimate.com/
|
7
|
-
[![Test Coverage](https://codeclimate.com/
|
8
|
-
[![Issue Count](https://codeclimate.com/
|
5
|
+
[![Build Status](https://travis-ci.org/distribusion/supa.svg?branch=master)](https://travis-ci.org/distribusion/supa)
|
6
|
+
[![Code Climate](https://codeclimate.com/repos/587387071c36ea7203000e0d/badges/19b714c64bf6f028a58c/gpa.svg)](https://codeclimate.com/repos/587387071c36ea7203000e0d/feed)
|
7
|
+
[![Test Coverage](https://codeclimate.com/repos/587387071c36ea7203000e0d/badges/19b714c64bf6f028a58c/coverage.svg)](https://codeclimate.com/repos/587387071c36ea7203000e0d/coverage)
|
8
|
+
[![Issue Count](https://codeclimate.com/repos/587387071c36ea7203000e0d/badges/19b714c64bf6f028a58c/issue_count.svg)](https://codeclimate.com/repos/587387071c36ea7203000e0d/feed)
|
9
9
|
|
10
10
|
## Introduction
|
11
11
|
|
@@ -83,7 +83,7 @@ class ArticleRepresenter
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
|
86
|
+
collection :included, getter: proc { [self.author] } do
|
87
87
|
attribute :id
|
88
88
|
attribute :type, getter: proc { 'authors' }
|
89
89
|
|
@@ -93,7 +93,7 @@ class ArticleRepresenter
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
|
96
|
+
collection :included, getter: proc { self.comments }, squash: true do
|
97
97
|
attribute :id
|
98
98
|
attribute :type, getter: proc { 'comments' }
|
99
99
|
|
@@ -177,7 +177,52 @@ ArticleRepresenter.new(Article.new).to_json
|
|
177
177
|
|
178
178
|
### `collection`
|
179
179
|
|
180
|
-
|
180
|
+
#### `:squash` option
|
181
|
+
|
182
|
+
Passing `true` to `:squash` option results in merging collection with the previous one
|
183
|
+
|
184
|
+
```ruby
|
185
|
+
class AnimalsRepresenter
|
186
|
+
include Supa::Representable
|
187
|
+
|
188
|
+
define do
|
189
|
+
collection :animals, getter: -> { [{name: 'Rex', type: 'dogs'}] } do
|
190
|
+
attribute :name
|
191
|
+
attribute :type
|
192
|
+
end
|
193
|
+
|
194
|
+
collection :animals, getter: -> { [{name: 'Tom', type: 'cats'}] }, squash: true do
|
195
|
+
attribute :name
|
196
|
+
attribute :type
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
```
|
201
|
+
|
202
|
+
```ruby
|
203
|
+
AnimalsRepresenter.new(nil).to_hash
|
204
|
+
```
|
205
|
+
|
206
|
+
```ruby
|
207
|
+
{
|
208
|
+
animals: [
|
209
|
+
{name: 'Rex', type: 'dogs'},
|
210
|
+
{name: 'Tom', type: 'cats'}
|
211
|
+
]
|
212
|
+
}
|
213
|
+
```
|
214
|
+
|
215
|
+
### `:getter` option
|
216
|
+
|
217
|
+
Avoid passing Proc objects to `:getter` option because this is little slower than method name passing
|
218
|
+
|
219
|
+
```ruby
|
220
|
+
# Bad
|
221
|
+
attribute :name, getter: -> { fetch_name }
|
222
|
+
|
223
|
+
# Good
|
224
|
+
attribute :name, getter: :fetch_name
|
225
|
+
```
|
181
226
|
|
182
227
|
## Development
|
183
228
|
|
@@ -203,10 +248,9 @@ bin/console
|
|
203
248
|
|
204
249
|
## Contributing
|
205
250
|
|
206
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
207
|
-
|
251
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/distribusion/supa.
|
252
|
+
This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
208
253
|
|
209
254
|
## License
|
210
255
|
|
211
256
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
212
|
-
|
data/Rakefile
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
|
-
require '
|
2
|
+
require 'rspec/core/rake_task'
|
3
3
|
|
4
|
-
|
5
|
-
t.libs << %w(spec lib)
|
6
|
-
t.test_files = FileList['spec/**/*_spec.rb']
|
7
|
-
end
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
8
5
|
|
9
|
-
|
10
|
-
t.libs << %w(spec lib)
|
11
|
-
t.test_files = FileList['spec/benchmarks/**/*_bench.rb']
|
12
|
-
end
|
13
|
-
|
14
|
-
task :default => :test
|
6
|
+
task default: :spec
|
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'supa'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "supa"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
14
|
-
|
13
|
+
require 'pry-byebug'
|
14
|
+
Pry.start
|
data/lib/supa/builder.rb
CHANGED
@@ -1,39 +1,34 @@
|
|
1
|
-
require 'supa/commands/attribute'
|
2
|
-
require 'supa/commands/object'
|
3
|
-
require 'supa/commands/namespace'
|
4
|
-
require 'supa/commands/collection'
|
5
|
-
require 'supa/commands/polymorphic'
|
6
|
-
|
7
1
|
module Supa
|
8
2
|
class Builder
|
9
|
-
COMMANDS = %w(attribute object namespace collection
|
3
|
+
COMMANDS = %w(attribute object namespace collection).freeze
|
10
4
|
|
11
5
|
COMMANDS.each do |command|
|
12
6
|
klass = Supa::Commands.const_get(command.capitalize)
|
13
7
|
|
14
8
|
define_method command do |name, options = {}, &block|
|
15
|
-
klass.new(
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
9
|
+
klass.new(
|
10
|
+
@object,
|
11
|
+
tree: @tree,
|
12
|
+
representer: @representer,
|
13
|
+
name: name,
|
14
|
+
options: options,
|
15
|
+
&block
|
16
|
+
).represent
|
20
17
|
end
|
21
18
|
end
|
22
19
|
|
23
|
-
def initialize(
|
24
|
-
@
|
20
|
+
def initialize(object, tree:, representer:)
|
21
|
+
@object = object
|
25
22
|
@tree = tree
|
23
|
+
@representer = representer
|
26
24
|
end
|
27
25
|
|
28
26
|
def to_hash
|
29
|
-
tree.to_hash
|
27
|
+
@tree.to_hash
|
30
28
|
end
|
31
29
|
|
32
30
|
def to_json
|
33
31
|
to_hash.to_json
|
34
32
|
end
|
35
|
-
|
36
|
-
private
|
37
|
-
attr_reader :context, :tree
|
38
33
|
end
|
39
34
|
end
|
data/lib/supa/command.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Supa
|
2
2
|
class Command
|
3
|
-
def initialize(
|
4
|
-
@
|
3
|
+
def initialize(object, tree:, representer:, name:, options: {}, &block)
|
4
|
+
@object = object
|
5
5
|
@tree = tree
|
6
|
+
@representer = representer
|
6
7
|
@name = name
|
7
8
|
@options = options
|
8
9
|
@block = block
|
@@ -13,14 +14,43 @@ module Supa
|
|
13
14
|
end
|
14
15
|
|
15
16
|
private
|
16
|
-
attr_reader :context, :tree, :name, :options, :block
|
17
17
|
|
18
|
-
def
|
19
|
-
if
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
def value
|
19
|
+
return instance_exec(&value_accessor) if value_accessor.respond_to?(:call)
|
20
|
+
|
21
|
+
extracted_value = derived_value_from_object(@object) || derived_value_from_object(@representer)
|
22
|
+
extracted_value ||= literal_value
|
23
|
+
|
24
|
+
raise_no_method_error(value_accessor) if extracted_value.nil?
|
25
|
+
extracted_value
|
26
|
+
end
|
27
|
+
|
28
|
+
def value_accessor
|
29
|
+
@value_accessor ||= @options.fetch(:getter, @name)
|
30
|
+
end
|
31
|
+
|
32
|
+
def derived_value_from_object(object)
|
33
|
+
if value_accessor.respond_to?(:to_sym) && object.respond_to?(value_accessor)
|
34
|
+
object.send(value_accessor.to_sym)
|
35
|
+
elsif object.is_a?(Hash)
|
36
|
+
object.dig(value_accessor)
|
23
37
|
end
|
24
38
|
end
|
39
|
+
|
40
|
+
def literal_value
|
41
|
+
return if value_accessor.respond_to?(:call)
|
42
|
+
value_accessor unless value_accessor.is_a?(Symbol) || value_accessor.is_a?(Enumerable)
|
43
|
+
end
|
44
|
+
|
45
|
+
def raise_no_method_error(method_sym)
|
46
|
+
raise NoMethodError, "undefined method `#{method_sym}' for #{@object} or #{@representer}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def method_missing(method_sym, *args, &block)
|
50
|
+
return @representer.send(method_sym, *args, &block) if @representer.respond_to?(method_sym)
|
51
|
+
return @object.send(method_sym, *args, &block) if @object.respond_to?(method_sym)
|
52
|
+
|
53
|
+
raise_no_method_error(method_sym)
|
54
|
+
end
|
25
55
|
end
|
26
56
|
end
|
@@ -1,15 +1,15 @@
|
|
1
|
-
require 'supa/command'
|
2
|
-
|
3
1
|
module Supa
|
4
2
|
module Commands
|
5
3
|
class Collection < Supa::Command
|
4
|
+
include Supa::Commands::Collectionable
|
5
|
+
|
6
6
|
def represent
|
7
|
-
tree[name] = []
|
7
|
+
@tree[@name] = [] unless @options[:squash]
|
8
8
|
|
9
|
-
|
10
|
-
tree[name] << {}
|
9
|
+
collection.each do |element|
|
10
|
+
@tree[@name] << {}
|
11
11
|
|
12
|
-
Supa::Builder.new(
|
12
|
+
Supa::Builder.new(element, tree: @tree[@name][-1], representer: @representer).instance_exec(&@block)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -1,15 +1,11 @@
|
|
1
|
-
require 'supa/command'
|
2
|
-
|
3
1
|
module Supa
|
4
2
|
module Commands
|
5
3
|
class Namespace < Supa::Command
|
6
4
|
def represent
|
7
|
-
tree[name] = {}
|
5
|
+
@tree[@name] = {}
|
8
6
|
|
9
|
-
Supa::Builder.new(
|
7
|
+
Supa::Builder.new(@object, tree: @tree[@name], representer: @representer).instance_exec(&@block)
|
10
8
|
end
|
11
9
|
end
|
12
10
|
end
|
13
11
|
end
|
14
|
-
|
15
|
-
|
data/lib/supa/commands/object.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
require 'supa/command'
|
2
|
-
|
3
1
|
module Supa
|
4
2
|
module Commands
|
5
3
|
class Object < Supa::Command
|
6
4
|
def represent
|
7
|
-
tree[name] = {}
|
5
|
+
@tree[@name] = {}
|
8
6
|
|
9
|
-
Supa::Builder.new(
|
7
|
+
Supa::Builder.new(value, tree: @tree[@name], representer: @representer).instance_exec(&@block)
|
10
8
|
end
|
11
9
|
end
|
12
10
|
end
|
data/lib/supa/representable.rb
CHANGED
@@ -11,7 +11,7 @@ module Supa
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def to_hash
|
14
|
-
Supa::Builder.new(
|
14
|
+
Supa::Builder.new(@object, tree: {}, representer: self).tap do |builder|
|
15
15
|
builder.instance_exec(&self.class.definition)
|
16
16
|
end.to_hash
|
17
17
|
end
|
@@ -19,9 +19,6 @@ module Supa
|
|
19
19
|
def to_json
|
20
20
|
to_hash.to_json
|
21
21
|
end
|
22
|
-
|
23
|
-
private
|
24
|
-
attr_reader :object
|
25
22
|
end
|
26
23
|
|
27
24
|
module ClassMethods
|
data/lib/supa/version.rb
CHANGED
data/lib/supa.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
require 'supa/version'
|
2
|
-
require 'supa/builder'
|
3
2
|
require 'supa/representable'
|
3
|
+
require 'supa/command'
|
4
|
+
require 'supa/commands/traits/collectionable'
|
5
|
+
require 'supa/commands/attribute'
|
6
|
+
require 'supa/commands/object'
|
7
|
+
require 'supa/commands/namespace'
|
8
|
+
require 'supa/commands/collection'
|
9
|
+
require 'supa/builder'
|
4
10
|
|
5
11
|
module Supa
|
6
12
|
end
|
data/supa.gemspec
CHANGED
@@ -1,30 +1,37 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
lib = File.expand_path('../lib', __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'supa/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
6
|
+
spec.name = 'supa'
|
8
7
|
spec.version = Supa::VERSION
|
9
8
|
spec.platform = Gem::Platform::RUBY
|
10
|
-
spec.authors = [
|
11
|
-
spec.email =
|
9
|
+
spec.authors = ['Andrey Duplichev', 'Jan Rietema', 'Jakub Gorzelak']
|
10
|
+
spec.email = %w(
|
11
|
+
andrey.duplichev@distribusion.com
|
12
|
+
jan.rietema@distribusion.com
|
13
|
+
jakub.gorzelak@distribusion.com
|
14
|
+
)
|
12
15
|
|
13
|
-
spec.summary =
|
14
|
-
spec.description =
|
15
|
-
spec.homepage =
|
16
|
-
spec.license =
|
16
|
+
spec.summary = 'Ruby object → JSON serialization.'
|
17
|
+
spec.description = 'Ruby object → JSON serialization.'
|
18
|
+
spec.homepage = 'https://github.com/distribusion/supa'
|
19
|
+
spec.license = 'MIT'
|
17
20
|
|
18
21
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
19
22
|
f.match(%r{^(test|spec|features)/})
|
20
23
|
end
|
21
|
-
spec.bindir =
|
24
|
+
spec.bindir = 'exe'
|
22
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
-
spec.require_paths = [
|
26
|
+
spec.require_paths = ['lib']
|
24
27
|
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
28
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
29
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
30
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
31
|
+
spec.add_development_dependency 'rspec-benchmark', '~> 0.2.0'
|
32
|
+
spec.add_development_dependency 'rubocop', '~> 0.45.0'
|
33
|
+
spec.add_development_dependency 'reek', '~> 4.5.0'
|
34
|
+
spec.add_development_dependency 'simplecov', '~> 0.12'
|
35
|
+
spec.add_development_dependency 'codeclimate-test-reporter', '~> 1.0.0'
|
36
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.4.0'
|
30
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: supa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Andrey Duplichev
|
8
|
+
- Jan Rietema
|
9
|
+
- Jakub Gorzelak
|
8
10
|
autorequire:
|
9
11
|
bindir: exe
|
10
12
|
cert_chain: []
|
11
|
-
date:
|
13
|
+
date: 2017-01-09 00:00:00.000000000 Z
|
12
14
|
dependencies:
|
13
15
|
- !ruby/object:Gem::Dependency
|
14
16
|
name: bundler
|
@@ -39,19 +41,61 @@ dependencies:
|
|
39
41
|
- !ruby/object:Gem::Version
|
40
42
|
version: '10.0'
|
41
43
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
44
|
+
name: rspec
|
43
45
|
requirement: !ruby/object:Gem::Requirement
|
44
46
|
requirements:
|
45
47
|
- - "~>"
|
46
48
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
49
|
+
version: '3.0'
|
48
50
|
type: :development
|
49
51
|
prerelease: false
|
50
52
|
version_requirements: !ruby/object:Gem::Requirement
|
51
53
|
requirements:
|
52
54
|
- - "~>"
|
53
55
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
56
|
+
version: '3.0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: rspec-benchmark
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.2.0
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 0.2.0
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rubocop
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.45.0
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - "~>"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 0.45.0
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: reek
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 4.5.0
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - "~>"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 4.5.0
|
55
99
|
- !ruby/object:Gem::Dependency
|
56
100
|
name: simplecov
|
57
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,15 +124,33 @@ dependencies:
|
|
80
124
|
- - "~>"
|
81
125
|
- !ruby/object:Gem::Version
|
82
126
|
version: 1.0.0
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: pry-byebug
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - "~>"
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 3.4.0
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - "~>"
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: 3.4.0
|
83
141
|
description: Ruby object → JSON serialization.
|
84
142
|
email:
|
85
|
-
-
|
143
|
+
- andrey.duplichev@distribusion.com
|
144
|
+
- jan.rietema@distribusion.com
|
145
|
+
- jakub.gorzelak@distribusion.com
|
86
146
|
executables: []
|
87
147
|
extensions: []
|
88
148
|
extra_rdoc_files: []
|
89
149
|
files:
|
90
150
|
- ".codeclimate.yml"
|
91
151
|
- ".gitignore"
|
152
|
+
- ".reek"
|
153
|
+
- ".rspec"
|
92
154
|
- ".rubocop.yml"
|
93
155
|
- ".travis.yml"
|
94
156
|
- CODE_OF_CONDUCT.md
|
@@ -105,11 +167,11 @@ files:
|
|
105
167
|
- lib/supa/commands/collection.rb
|
106
168
|
- lib/supa/commands/namespace.rb
|
107
169
|
- lib/supa/commands/object.rb
|
108
|
-
- lib/supa/commands/
|
170
|
+
- lib/supa/commands/traits/collectionable.rb
|
109
171
|
- lib/supa/representable.rb
|
110
172
|
- lib/supa/version.rb
|
111
173
|
- supa.gemspec
|
112
|
-
homepage: https://github.com/
|
174
|
+
homepage: https://github.com/distribusion/supa
|
113
175
|
licenses:
|
114
176
|
- MIT
|
115
177
|
metadata: {}
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'supa/command'
|
2
|
-
|
3
|
-
module Supa
|
4
|
-
module Commands
|
5
|
-
class Polymorphic < Supa::Command
|
6
|
-
def represent
|
7
|
-
tree[name] ||= []
|
8
|
-
|
9
|
-
Array(get_value).each do |element|
|
10
|
-
tree[name] << {}
|
11
|
-
|
12
|
-
Supa::Builder.new(context: element, tree: tree[name][-1]).instance_exec(&block)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|