blockscore 4.0.0 → 4.1.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 +4 -4
- data/.gitignore +58 -0
- data/.hound.yml +217 -0
- data/Gemfile +19 -7
- data/LICENSE +21 -0
- data/README.md +37 -33
- data/Rakefile +1 -15
- data/blockscore.gemspec +30 -81
- data/circle.yml +13 -0
- data/lib/blockscore.rb +43 -4
- data/lib/blockscore/actions/all.rb +27 -0
- data/lib/blockscore/actions/create.rb +34 -0
- data/lib/blockscore/actions/delete.rb +31 -0
- data/lib/blockscore/actions/retrieve.rb +24 -0
- data/lib/blockscore/actions/update.rb +46 -0
- data/lib/blockscore/base.rb +117 -0
- data/lib/blockscore/candidate.rb +32 -0
- data/lib/blockscore/collection.rb +12 -0
- data/lib/blockscore/company.rb +7 -0
- data/lib/blockscore/connection.rb +65 -0
- data/lib/blockscore/dispatch.rb +26 -0
- data/lib/blockscore/errors/api_connection_error.rb +6 -0
- data/lib/blockscore/errors/api_error.rb +33 -0
- data/lib/blockscore/errors/authentication_error.rb +4 -0
- data/lib/blockscore/errors/error.rb +4 -0
- data/lib/blockscore/errors/invalid_request_error.rb +29 -0
- data/lib/blockscore/errors/no_api_key_error.rb +4 -0
- data/lib/blockscore/errors/not_found_error.rb +4 -0
- data/lib/blockscore/fingerprint.rb +46 -0
- data/lib/blockscore/person.rb +14 -0
- data/lib/blockscore/question_set.rb +26 -0
- data/lib/blockscore/response.rb +29 -0
- data/lib/blockscore/util.rb +80 -0
- data/lib/blockscore/version.rb +3 -0
- data/lib/blockscore/watchlist_hit.rb +4 -0
- metadata +82 -48
- data/LICENSE.txt +0 -20
- data/VERSION +0 -1
- data/blockscore-ruby.sublime-project +0 -21
- data/lib/blockscore/candidates.rb +0 -49
- data/lib/blockscore/client.rb +0 -81
- data/lib/blockscore/companies.rb +0 -36
- data/lib/blockscore/error/authorization_error.rb +0 -13
- data/lib/blockscore/error/blockscore_error.rb +0 -26
- data/lib/blockscore/error/error_handler.rb +0 -141
- data/lib/blockscore/error/internal_server_error.rb +0 -19
- data/lib/blockscore/error/not_found_error.rb +0 -12
- data/lib/blockscore/error/parameter_error.rb +0 -12
- data/lib/blockscore/error/validation_error.rb +0 -28
- data/lib/blockscore/errors.rb +0 -3
- data/lib/blockscore/people.rb +0 -37
- data/lib/blockscore/question_sets.rb +0 -49
- data/lib/blockscore/watchlists.rb +0 -18
- data/test/helper.rb +0 -37
- data/test/test_blockscore.rb +0 -226
data/blockscore.gemspec
CHANGED
|
@@ -1,86 +1,35 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
# -*- encoding: utf-8 -*-
|
|
5
|
-
# stub: blockscore 4.0.0 ruby lib
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
s.name = "blockscore"
|
|
9
|
-
s.version = "4.0.0"
|
|
5
|
+
require 'blockscore/version'
|
|
10
6
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
s.email = "alain@blockscore.com"
|
|
17
|
-
s.extra_rdoc_files = [
|
|
18
|
-
"LICENSE.txt",
|
|
19
|
-
"README.md"
|
|
20
|
-
]
|
|
21
|
-
s.files = [
|
|
22
|
-
".document",
|
|
23
|
-
"Gemfile",
|
|
24
|
-
"LICENSE.txt",
|
|
25
|
-
"README.md",
|
|
26
|
-
"Rakefile",
|
|
27
|
-
"VERSION",
|
|
28
|
-
"blockscore-ruby.sublime-project",
|
|
29
|
-
"blockscore.gemspec",
|
|
30
|
-
"lib/blockscore.rb",
|
|
31
|
-
"lib/blockscore/candidates.rb",
|
|
32
|
-
"lib/blockscore/client.rb",
|
|
33
|
-
"lib/blockscore/companies.rb",
|
|
34
|
-
"lib/blockscore/error/authorization_error.rb",
|
|
35
|
-
"lib/blockscore/error/blockscore_error.rb",
|
|
36
|
-
"lib/blockscore/error/error_handler.rb",
|
|
37
|
-
"lib/blockscore/error/internal_server_error.rb",
|
|
38
|
-
"lib/blockscore/error/not_found_error.rb",
|
|
39
|
-
"lib/blockscore/error/parameter_error.rb",
|
|
40
|
-
"lib/blockscore/error/validation_error.rb",
|
|
41
|
-
"lib/blockscore/errors.rb",
|
|
42
|
-
"lib/blockscore/people.rb",
|
|
43
|
-
"lib/blockscore/question_sets.rb",
|
|
44
|
-
"lib/blockscore/watchlists.rb",
|
|
45
|
-
"test/helper.rb",
|
|
46
|
-
"test/test_blockscore.rb"
|
|
47
|
-
]
|
|
48
|
-
s.homepage = "http://github.com/blockscore/blockscore-ruby"
|
|
49
|
-
s.licenses = ["MIT"]
|
|
50
|
-
s.rubygems_version = "2.2.2"
|
|
51
|
-
s.summary = "A ruby client library for the BlockScore API."
|
|
7
|
+
Gem::Specification.new do |spec|
|
|
8
|
+
spec.name = 'blockscore'
|
|
9
|
+
spec.version = BlockScore::VERSION
|
|
10
|
+
spec.authors = ['Alain Meier', 'John Backus', 'Connor Jacobsen']
|
|
11
|
+
spec.email = ['alain@blockscore.com', 'john@blockscore.com']
|
|
52
12
|
|
|
53
|
-
|
|
54
|
-
|
|
13
|
+
spec.summary = 'A ruby client library for the BlockScore API.'
|
|
14
|
+
spec.description = 'BlockScore makes ID verification easier and faster. See https://blockscore.com for more.'
|
|
15
|
+
spec.homepage = 'https://blockscore.com'
|
|
16
|
+
spec.license = 'MIT'
|
|
55
17
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
|
63
|
-
s.add_development_dependency(%q<minitest>, ["~> 4.0"])
|
|
64
|
-
s.add_development_dependency(%q<shoulda-context>, ["~> 1.2"])
|
|
65
|
-
else
|
|
66
|
-
s.add_dependency(%q<httparty>, ["~> 0.11"])
|
|
67
|
-
s.add_dependency(%q<shoulda>, ["~> 3.5.0"])
|
|
68
|
-
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
|
69
|
-
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
|
70
|
-
s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
|
|
71
|
-
s.add_dependency(%q<simplecov>, [">= 0"])
|
|
72
|
-
s.add_dependency(%q<minitest>, ["~> 4.0"])
|
|
73
|
-
s.add_dependency(%q<shoulda-context>, ["~> 1.2"])
|
|
74
|
-
end
|
|
75
|
-
else
|
|
76
|
-
s.add_dependency(%q<httparty>, ["~> 0.11"])
|
|
77
|
-
s.add_dependency(%q<shoulda>, ["~> 3.5.0"])
|
|
78
|
-
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
|
79
|
-
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
|
80
|
-
s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
|
|
81
|
-
s.add_dependency(%q<simplecov>, [">= 0"])
|
|
82
|
-
s.add_dependency(%q<minitest>, ["~> 4.0"])
|
|
83
|
-
s.add_dependency(%q<shoulda-context>, ["~> 1.2"])
|
|
84
|
-
end
|
|
85
|
-
end
|
|
18
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
19
|
+
spec.bindir = 'exe'
|
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
21
|
+
spec.require_paths = ['lib']
|
|
22
|
+
|
|
23
|
+
spec.required_ruby_version = '>= 1.9.3'
|
|
86
24
|
|
|
25
|
+
spec.add_dependency('httparty', '~> 0.11')
|
|
26
|
+
|
|
27
|
+
spec.add_development_dependency('shoulda', '~> 3.5', '>= 3.5.0')
|
|
28
|
+
spec.add_development_dependency('rdoc', '~> 3.12')
|
|
29
|
+
spec.add_development_dependency('bundler', '~> 1.0')
|
|
30
|
+
spec.add_development_dependency('simplecov', '~> 0')
|
|
31
|
+
spec.add_development_dependency('minitest', '~> 5.5')
|
|
32
|
+
spec.add_development_dependency('webmock', '1.21')
|
|
33
|
+
spec.add_development_dependency('faker', '1.4.3')
|
|
34
|
+
spec.add_development_dependency('factory_girl', '4.1.0')
|
|
35
|
+
end
|
data/circle.yml
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
dependencies:
|
|
2
|
+
override:
|
|
3
|
+
- "rvm-exec 1.9.3-p551 bundle install"
|
|
4
|
+
- "rvm-exec 2.0.0-p598 bundle install"
|
|
5
|
+
- "rvm-exec 2.1.5 bundle install"
|
|
6
|
+
- "rvm-exec 2.2.0 bundle install"
|
|
7
|
+
|
|
8
|
+
test:
|
|
9
|
+
override:
|
|
10
|
+
- "rvm-exec 1.9.3-p551 bundle exec rake"
|
|
11
|
+
- "rvm-exec 2.0.0-p598 bundle exec rake"
|
|
12
|
+
- "rvm-exec 2.1.5 bundle exec rake"
|
|
13
|
+
- "rvm-exec 2.2.0 bundle exec rake"
|
data/lib/blockscore.rb
CHANGED
|
@@ -1,5 +1,44 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
require 'httparty'
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'ostruct'
|
|
5
|
+
require 'uri'
|
|
2
6
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
7
|
+
require 'blockscore/actions/all'
|
|
8
|
+
require 'blockscore/actions/create'
|
|
9
|
+
require 'blockscore/actions/delete'
|
|
10
|
+
require 'blockscore/actions/retrieve'
|
|
11
|
+
require 'blockscore/actions/update'
|
|
12
|
+
|
|
13
|
+
require 'blockscore/errors/api_connection_error'
|
|
14
|
+
require 'blockscore/errors/api_error'
|
|
15
|
+
require 'blockscore/errors/authentication_error'
|
|
16
|
+
require 'blockscore/errors/error'
|
|
17
|
+
require 'blockscore/errors/invalid_request_error'
|
|
18
|
+
require 'blockscore/errors/no_api_key_error'
|
|
19
|
+
require 'blockscore/errors/not_found_error'
|
|
20
|
+
|
|
21
|
+
require 'blockscore/base'
|
|
22
|
+
require 'blockscore/candidate'
|
|
23
|
+
require 'blockscore/company'
|
|
24
|
+
require 'blockscore/person'
|
|
25
|
+
require 'blockscore/question_set'
|
|
26
|
+
require 'blockscore/watchlist_hit'
|
|
27
|
+
|
|
28
|
+
require 'blockscore/collection'
|
|
29
|
+
require 'blockscore/connection'
|
|
30
|
+
require 'blockscore/dispatch'
|
|
31
|
+
require 'blockscore/fingerprint'
|
|
32
|
+
require 'blockscore/response'
|
|
33
|
+
require 'blockscore/util'
|
|
34
|
+
require 'blockscore/version'
|
|
35
|
+
|
|
36
|
+
module BlockScore
|
|
37
|
+
def self.api_key=(api_key)
|
|
38
|
+
@api_key = api_key
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.api_key
|
|
42
|
+
@api_key
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module BlockScore
|
|
2
|
+
module Actions
|
|
3
|
+
# Public: Provides an :all action to including Classes.
|
|
4
|
+
#
|
|
5
|
+
# The :all method returns up to 25 items from the BlockScore API for
|
|
6
|
+
# the given class.
|
|
7
|
+
#
|
|
8
|
+
# :all accepts an options hash, which responds to the following options:
|
|
9
|
+
#
|
|
10
|
+
# count - Fixnum number of items to return per page.
|
|
11
|
+
# offset - Fixnum number of items to skip before returning @count items.
|
|
12
|
+
#
|
|
13
|
+
# If no count is provided, 25 items are returned, or all items if the total
|
|
14
|
+
# number of items is 25 of fewer.
|
|
15
|
+
module All
|
|
16
|
+
module ClassMethods
|
|
17
|
+
def all(options = {})
|
|
18
|
+
get(endpoint, options)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.included(base)
|
|
23
|
+
base.extend(ClassMethods)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module BlockScore
|
|
2
|
+
module Actions
|
|
3
|
+
# Public: Provides a :create class method which creates a new instance
|
|
4
|
+
# of the desired class using the BlockScore API.
|
|
5
|
+
#
|
|
6
|
+
# Examples
|
|
7
|
+
#
|
|
8
|
+
# candidate = BlockScore::Candidate.create(
|
|
9
|
+
# note: "12341234",
|
|
10
|
+
# ssn: "0001",
|
|
11
|
+
# date_of_birth: "1940-08-11",
|
|
12
|
+
# name_first: "John",
|
|
13
|
+
# name_middle: "",
|
|
14
|
+
# name_last: "Bredenkamp",
|
|
15
|
+
# address_street1: "1 Infinite Loop",
|
|
16
|
+
# address_city: "Cupertino",
|
|
17
|
+
# address_country_code: "US"
|
|
18
|
+
# )
|
|
19
|
+
# => <BlockScore::Candidate:0x007fe39c424410>
|
|
20
|
+
#
|
|
21
|
+
# Returns an instance of the desired class.
|
|
22
|
+
module Create
|
|
23
|
+
module ClassMethods
|
|
24
|
+
def create(params = {})
|
|
25
|
+
post(endpoint, params)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.included(base)
|
|
30
|
+
base.extend(ClassMethods)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
3
|
+
module BlockScore
|
|
4
|
+
module Actions
|
|
5
|
+
# Provides a :delete instance method to including classes.
|
|
6
|
+
#
|
|
7
|
+
# Returns the updated object with deleted == true.
|
|
8
|
+
#
|
|
9
|
+
# Examples
|
|
10
|
+
#
|
|
11
|
+
# candidate.delete
|
|
12
|
+
# => #<BlockScore::Candidate:0x007fe39c424410>
|
|
13
|
+
module Delete
|
|
14
|
+
extend Forwardable
|
|
15
|
+
|
|
16
|
+
def_delegators 'self.class', :endpoint
|
|
17
|
+
|
|
18
|
+
def delete
|
|
19
|
+
delete!
|
|
20
|
+
rescue Error
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def delete!
|
|
25
|
+
self.class.delete("#{endpoint}/#{id}", {})
|
|
26
|
+
attributes[:deleted] = true
|
|
27
|
+
true
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module BlockScore
|
|
2
|
+
module Actions
|
|
3
|
+
# Public: Provides a :retrieve class method to including classes.
|
|
4
|
+
#
|
|
5
|
+
# Returns a instance of the desired class on success, raises an
|
|
6
|
+
# appropriate error otherwise.
|
|
7
|
+
#
|
|
8
|
+
# Examples
|
|
9
|
+
#
|
|
10
|
+
# person = BlockScore::Person.retrieve('abc123def456')
|
|
11
|
+
# => #<BlockScore::Person:0x007fe39c424410>
|
|
12
|
+
module Retrieve
|
|
13
|
+
module ClassMethods
|
|
14
|
+
def retrieve(id)
|
|
15
|
+
get("#{endpoint}/#{id}", {})
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.included(base)
|
|
20
|
+
base.extend(ClassMethods)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module BlockScore
|
|
2
|
+
module Actions
|
|
3
|
+
# Public: Contains the :save instance method, which updates the
|
|
4
|
+
# object with the BlockScore API to persist the changes.
|
|
5
|
+
#
|
|
6
|
+
# Examples
|
|
7
|
+
#
|
|
8
|
+
# class Foo
|
|
9
|
+
# include BlockScore::Actions::Update
|
|
10
|
+
# end
|
|
11
|
+
#
|
|
12
|
+
# foo = Foo.new
|
|
13
|
+
# foo.name_first = 'John'
|
|
14
|
+
# foo.save
|
|
15
|
+
# # => true
|
|
16
|
+
module Update
|
|
17
|
+
extend Forwardable
|
|
18
|
+
|
|
19
|
+
# Attributes which will not change once the object is created.
|
|
20
|
+
PERSISTENT_ATTRIBUTES = [
|
|
21
|
+
:id,
|
|
22
|
+
:object,
|
|
23
|
+
:created_at,
|
|
24
|
+
:updated_at,
|
|
25
|
+
:livemode
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
def_delegators 'self.class', :endpoint, :patch
|
|
29
|
+
|
|
30
|
+
def save!
|
|
31
|
+
if respond_to? :id
|
|
32
|
+
patch("#{endpoint}/#{id}", filter_params)
|
|
33
|
+
true
|
|
34
|
+
else
|
|
35
|
+
super
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Filters out the non-updateable params.
|
|
40
|
+
def filter_params
|
|
41
|
+
# Cannot %i syntax, not introduced until Ruby 2.0.0
|
|
42
|
+
attributes.reject { |key, _| PERSISTENT_ATTRIBUTES.include?(key) }
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
require 'blockscore/connection'
|
|
2
|
+
|
|
3
|
+
module BlockScore
|
|
4
|
+
class Base
|
|
5
|
+
extend Connection
|
|
6
|
+
|
|
7
|
+
attr_reader :attributes
|
|
8
|
+
|
|
9
|
+
def initialize(options = {})
|
|
10
|
+
@attributes = options
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def inspect
|
|
14
|
+
"#<#{self.class}:0x#{object_id.to_s(16)} JSON: " + JSON.pretty_generate(attributes)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def refresh
|
|
18
|
+
r = self.class.retrieve(id)
|
|
19
|
+
@attributes = r.attributes
|
|
20
|
+
|
|
21
|
+
true
|
|
22
|
+
rescue Error
|
|
23
|
+
false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def save
|
|
27
|
+
save!
|
|
28
|
+
rescue
|
|
29
|
+
false
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def save!
|
|
33
|
+
response = self.class.post(self.class.endpoint, attributes)
|
|
34
|
+
@attributes[:id] = response.id
|
|
35
|
+
|
|
36
|
+
refresh
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.resource
|
|
40
|
+
@resource ||= Util.to_underscore(to_s.split('::').last)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.api_url
|
|
44
|
+
'https://api.blockscore.com/'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.endpoint
|
|
48
|
+
if self == Base
|
|
49
|
+
fail NotImplementedError, 'Base is an abstract class, not an API resource'
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
"#{api_url}#{Util.to_plural(resource)}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
protected
|
|
56
|
+
|
|
57
|
+
def add_accessor(symbol, *args)
|
|
58
|
+
singleton_class.instance_eval do
|
|
59
|
+
define_method(symbol) do
|
|
60
|
+
wrap_attribute(attributes[symbol])
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def add_setter(symbol, *_args)
|
|
66
|
+
singleton_class.instance_eval do
|
|
67
|
+
define_method(symbol) do |value|
|
|
68
|
+
attributes[symbol.to_s.chop.to_sym] = value
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def method_missing(method, *args, &block)
|
|
76
|
+
if respond_to_missing?(method)
|
|
77
|
+
if setter?(method)
|
|
78
|
+
add_setter(method, args)
|
|
79
|
+
else
|
|
80
|
+
add_accessor(method, args)
|
|
81
|
+
end
|
|
82
|
+
send(method, *args)
|
|
83
|
+
else
|
|
84
|
+
super
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def respond_to_missing?(symbol, include_private = false)
|
|
89
|
+
setter?(symbol) || attributes && attributes.key?(symbol) || super
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def setter?(symbol)
|
|
93
|
+
symbol.to_s.end_with?('=')
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def wrap_attribute(attribute)
|
|
97
|
+
case attribute
|
|
98
|
+
when Array
|
|
99
|
+
wrap_array(attribute)
|
|
100
|
+
when Hash
|
|
101
|
+
wrap_hash(attribute)
|
|
102
|
+
else
|
|
103
|
+
attribute
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def wrap_array(arr)
|
|
108
|
+
arr.map { |item| wrap_attribute(item) }
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def wrap_hash(hsh)
|
|
112
|
+
hsh.each { |key, value| hsh[key] = wrap_attribute(value) }
|
|
113
|
+
|
|
114
|
+
OpenStruct.new(hsh)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|