ecoportal-api 0.3.8 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +11 -3
- data/.yardopts +10 -0
- data/Gemfile.lock +10 -5
- data/Rakefile +22 -1
- data/ecoportal-api.gemspec +6 -4
- data/lib/ecoportal/api/common.rb +7 -4
- data/lib/ecoportal/api/common/base_class.rb +29 -0
- data/lib/ecoportal/api/common/base_model.rb +89 -20
- data/lib/ecoportal/api/common/batch_operation.rb +0 -1
- data/lib/ecoportal/api/common/batch_response.rb +5 -0
- data/lib/ecoportal/api/common/client.rb +61 -1
- data/lib/ecoportal/api/common/doc_helpers.rb +2 -0
- data/lib/ecoportal/api/common/hash_diff.rb +25 -23
- data/lib/ecoportal/api/common/response.rb +4 -0
- data/lib/ecoportal/api/common/wrapped_response.rb +19 -10
- data/lib/ecoportal/api/internal.rb +17 -20
- data/lib/ecoportal/api/internal/account.rb +23 -16
- data/lib/ecoportal/api/internal/login_provider.rb +1 -1
- data/lib/ecoportal/api/internal/login_providers.rb +10 -0
- data/lib/ecoportal/api/internal/people.rb +3 -8
- data/lib/ecoportal/api/internal/permissions.rb +1 -1
- data/lib/ecoportal/api/internal/person.rb +18 -16
- data/lib/ecoportal/api/internal/person_details.rb +1 -5
- data/lib/ecoportal/api/internal/person_schema.rb +1 -5
- data/lib/ecoportal/api/internal/person_schemas.rb +2 -6
- data/lib/ecoportal/api/internal/policy_group.rb +1 -1
- data/lib/ecoportal/api/internal/policy_groups.rb +10 -1
- data/lib/ecoportal/api/v1.rb +27 -4
- data/lib/ecoportal/api/v1/people.rb +62 -25
- data/lib/ecoportal/api/v1/person.rb +47 -28
- data/lib/ecoportal/api/v1/person_details.rb +27 -13
- data/lib/ecoportal/api/v1/person_schema.rb +3 -6
- data/lib/ecoportal/api/v1/person_schemas.rb +26 -9
- data/lib/ecoportal/api/v1/schema_field.rb +1 -1
- data/lib/ecoportal/api/v1/schema_field_value.rb +2 -1
- data/lib/ecoportal/api/version.rb +1 -1
- metadata +45 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1336e02ab24ebd2ffa1ee734fa8c41ce18bb8afc892e771e38aac15c50c5ba72
|
4
|
+
data.tar.gz: 2e7ec0cb920b9972d666e3645d43ae3a503cd9425d968c24519712257751b14a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a877e517ddb1ee1cd71e6e40806a685a2bcb09ee7a7c73726e4fbd1527175cdb0e84bf24e592cb56b7f3686ab1b6729931346636add41edf5b987156444f1942
|
7
|
+
data.tar.gz: d60a8dc08b2d26b28b4aeaec0bd0cf708f2a05977761554362ab848c640d5cc5f5b74b9054eddcf5f4d62f0952a24719da086bf3572ccea980c0754295d8db01
|
data/.gitignore
CHANGED
@@ -1,11 +1,19 @@
|
|
1
|
+
# it's a gem, ignore the lockfile
|
2
|
+
Gemfile.lock
|
3
|
+
|
4
|
+
# build artifacts
|
5
|
+
*.gem
|
1
6
|
/.bundle/
|
7
|
+
/vendor/bundle
|
8
|
+
/spec/reports/
|
9
|
+
/tmp/
|
10
|
+
/pkg/
|
11
|
+
|
12
|
+
# docs
|
2
13
|
/.yardoc
|
3
14
|
/_yardoc/
|
4
15
|
/coverage/
|
5
16
|
/doc/
|
6
|
-
/pkg/
|
7
|
-
/spec/reports/
|
8
|
-
/tmp/
|
9
17
|
|
10
18
|
# rspec failure tracking
|
11
19
|
.rspec_status
|
data/.yardopts
ADDED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ecoportal-api (0.
|
4
|
+
ecoportal-api (0.4.1)
|
5
5
|
hash-polyfill (~> 0)
|
6
6
|
http (~> 3)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
addressable (2.
|
11
|
+
addressable (2.6.0)
|
12
12
|
public_suffix (>= 2.0.2, < 4.0)
|
13
13
|
diff-lcs (1.3)
|
14
14
|
domain_name (0.5.20180417)
|
@@ -23,8 +23,9 @@ GEM
|
|
23
23
|
domain_name (~> 0.5)
|
24
24
|
http-form_data (2.1.1)
|
25
25
|
http_parser.rb (0.6.0)
|
26
|
-
public_suffix (3.0.
|
26
|
+
public_suffix (3.0.3)
|
27
27
|
rake (10.5.0)
|
28
|
+
redcarpet (3.4.0)
|
28
29
|
rspec (3.7.0)
|
29
30
|
rspec-core (~> 3.7.0)
|
30
31
|
rspec-expectations (~> 3.7.0)
|
@@ -40,16 +41,20 @@ GEM
|
|
40
41
|
rspec-support (3.7.1)
|
41
42
|
unf (0.1.4)
|
42
43
|
unf_ext
|
43
|
-
unf_ext (0.0.7.
|
44
|
+
unf_ext (0.0.7.6)
|
45
|
+
yard (0.9.18)
|
44
46
|
|
45
47
|
PLATFORMS
|
46
48
|
ruby
|
49
|
+
x64-mingw32
|
47
50
|
|
48
51
|
DEPENDENCIES
|
49
52
|
bundler (~> 1.16)
|
50
53
|
ecoportal-api!
|
51
54
|
rake (~> 10.0)
|
55
|
+
redcarpet (~> 3.4, >= 3.4.0)
|
52
56
|
rspec (~> 3.0)
|
57
|
+
yard (~> 0.9, >= 0.9.18)
|
53
58
|
|
54
59
|
BUNDLED WITH
|
55
|
-
1.
|
60
|
+
1.17.3
|
data/Rakefile
CHANGED
@@ -1,6 +1,27 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rspec/core/rake_task"
|
3
|
+
require "yard"
|
4
|
+
require "redcarpet"
|
3
5
|
|
6
|
+
desc "run the specs"
|
4
7
|
RSpec::Core::RakeTask.new(:spec)
|
5
8
|
|
6
|
-
|
9
|
+
desc "run rspec showing backtrace"
|
10
|
+
RSpec::Core::RakeTask.new(:spec_trace) do |task|
|
11
|
+
task.rspec_opts = ['--backtrace']
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "run rspec stopping on first fail, and show backtrace"
|
15
|
+
RSpec::Core::RakeTask.new(:spec_fast) do |task|
|
16
|
+
task.rspec_opts = ['--fail-fast', '--backtrace']
|
17
|
+
end
|
18
|
+
|
19
|
+
# default task name is yard
|
20
|
+
desc "Yard: generate all the documentation"
|
21
|
+
YARD::Rake::YardocTask.new(:doc) do |t|
|
22
|
+
#t.files = ['lib/**/*.rb']
|
23
|
+
end
|
24
|
+
|
25
|
+
task :default => [:spec]
|
26
|
+
task :rspec_trace => :spec_trace
|
27
|
+
task :rspec_fast => :spec_fast
|
data/ecoportal-api.gemspec
CHANGED
@@ -20,10 +20,12 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.add_development_dependency "bundler",
|
24
|
-
spec.add_development_dependency "rake",
|
25
|
-
spec.add_development_dependency "rspec",
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
26
|
+
spec.add_development_dependency "yard", "~> 0.9", ">= 0.9.18"
|
27
|
+
spec.add_development_dependency "redcarpet", "~> 3.4", ">= 3.4.0"
|
26
28
|
|
27
|
-
spec.add_dependency 'http',
|
29
|
+
spec.add_dependency 'http', '~> 3'
|
28
30
|
spec.add_dependency 'hash-polyfill', '~> 0'
|
29
31
|
end
|
data/lib/ecoportal/api/common.rb
CHANGED
@@ -4,11 +4,14 @@ module Ecoportal
|
|
4
4
|
end
|
5
5
|
end
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
|
+
require 'ecoportal/api/common/base_class'
|
9
|
+
require 'ecoportal/api/common/hash_diff'
|
10
|
+
require 'ecoportal/api/common/base_model'
|
11
|
+
require 'ecoportal/api/common/doc_helpers'
|
8
12
|
require 'ecoportal/api/common/logging'
|
13
|
+
require 'ecoportal/api/common/client'
|
9
14
|
require 'ecoportal/api/common/response'
|
10
15
|
require 'ecoportal/api/common/wrapped_response'
|
11
|
-
require 'ecoportal/api/common/base_model'
|
12
|
-
require 'ecoportal/api/common/batch_operation'
|
13
16
|
require 'ecoportal/api/common/batch_response'
|
14
|
-
require 'ecoportal/api/common/
|
17
|
+
require 'ecoportal/api/common/batch_operation'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
module Common
|
4
|
+
module BaseClass
|
5
|
+
|
6
|
+
def class_resolver(name, klass)
|
7
|
+
define_singleton_method(name) { resolve_class(klass) }
|
8
|
+
define_method(name) { self.class.resolve_class(klass) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def resolve_class(klass)
|
12
|
+
@resolved ||= {}
|
13
|
+
@resolved[klass] ||=
|
14
|
+
case klass
|
15
|
+
when Class
|
16
|
+
klass
|
17
|
+
when String
|
18
|
+
Kernel.const_get(klass)
|
19
|
+
when Symbol
|
20
|
+
resolve_class(self.send(klass))
|
21
|
+
else
|
22
|
+
raise "Unknown class: #{klass}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -2,21 +2,65 @@ module Ecoportal
|
|
2
2
|
module API
|
3
3
|
module Common
|
4
4
|
class BaseModel
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
class UnlinkedModel < Exception
|
6
|
+
def initialize (msg = "Something went wrong when linking the document.")
|
7
|
+
super(msg)
|
8
|
+
end
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
extend BaseClass
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def passthrough(*methods, to: :doc)
|
15
|
+
methods.each do |method|
|
16
|
+
method = method.to_s
|
17
|
+
define_method method do
|
18
|
+
send(to)[method]
|
19
|
+
end
|
20
|
+
define_method "#{method}=" do |value|
|
21
|
+
send(to)[method] = value
|
22
|
+
end
|
23
|
+
end
|
14
24
|
end
|
25
|
+
|
26
|
+
def embeds_one(method, key: method, nullable: false, klass:)
|
27
|
+
method = method.to_s.freeze
|
28
|
+
var = "@#{method}".freeze
|
29
|
+
key = key.to_s.freeze
|
30
|
+
define_method(method) do
|
31
|
+
return instance_variable_get(var) if instance_variable_defined?(var)
|
32
|
+
doc[key] ||= {} unless nullable
|
33
|
+
return instance_variable_set(var, nil) unless doc[key]
|
34
|
+
|
35
|
+
self.class.resolve_class(klass).new(
|
36
|
+
doc[key], parent: self, key: key
|
37
|
+
).tap {|obj| instance_variable_set(var, obj)}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
15
41
|
end
|
16
42
|
|
17
|
-
|
18
|
-
|
19
|
-
|
43
|
+
attr_reader :_parent, :_key
|
44
|
+
|
45
|
+
def initialize(doc = {}, parent: self, key: nil)
|
46
|
+
@_parent = parent
|
47
|
+
@_key = key
|
48
|
+
if !_parent || !_key
|
49
|
+
@doc = doc
|
50
|
+
@original_doc = JSON.parse(@doc.to_json)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def doc
|
55
|
+
raise UnlinkedModel.new unless linked?
|
56
|
+
return _parent.doc[_key] unless _parent == self
|
57
|
+
@doc
|
58
|
+
end
|
59
|
+
|
60
|
+
def original_doc
|
61
|
+
raise UnlinkedModel.new unless linked?
|
62
|
+
return _parent.original_doc[_key] unless _parent == self
|
63
|
+
@original_doc
|
20
64
|
end
|
21
65
|
|
22
66
|
def as_json
|
@@ -29,20 +73,45 @@ module Ecoportal
|
|
29
73
|
|
30
74
|
def as_update
|
31
75
|
new_doc = as_json
|
32
|
-
Common::HashDiff.diff(new_doc,
|
76
|
+
Common::HashDiff.diff(new_doc, original_doc)
|
33
77
|
end
|
34
78
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
79
|
+
def dirty?
|
80
|
+
as_update != {}
|
81
|
+
end
|
82
|
+
|
83
|
+
def consolidate!
|
84
|
+
raise UnlinkedModel.new unless linked?
|
85
|
+
case
|
86
|
+
when @original_doc
|
87
|
+
@original_doc = JSON.parse(@doc.to_json)
|
88
|
+
else
|
89
|
+
_parent.original_doc[_key] = JSON.parse(doc.to_json)
|
44
90
|
end
|
45
91
|
end
|
92
|
+
|
93
|
+
def reset!
|
94
|
+
raise UnlinkedModel.new unless linked?
|
95
|
+
case
|
96
|
+
when @doc
|
97
|
+
@doc = JSON.parse(@original_doc.to_json)
|
98
|
+
else
|
99
|
+
_parent.doc[_key] = JSON.parse(original_doc.to_json)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def print
|
104
|
+
puts JSON.pretty_generate(as_json)
|
105
|
+
self
|
106
|
+
end
|
107
|
+
|
108
|
+
protected
|
109
|
+
|
110
|
+
def linked?
|
111
|
+
is_root = _parent == self && defined?(@doc)
|
112
|
+
is_root || _parent.doc[_key]
|
113
|
+
end
|
114
|
+
|
46
115
|
end
|
47
116
|
end
|
48
117
|
end
|
@@ -2,20 +2,25 @@ module Ecoportal
|
|
2
2
|
module API
|
3
3
|
module Common
|
4
4
|
class BatchResponse
|
5
|
+
|
5
6
|
attr_reader :status, :body, :result
|
7
|
+
|
6
8
|
def initialize(status, body, result = nil)
|
7
9
|
@status = HTTP::Response::Status.new(status)
|
8
10
|
@body = body
|
9
11
|
@result = result
|
10
12
|
end
|
13
|
+
|
11
14
|
def success?
|
12
15
|
status.success?
|
13
16
|
end
|
17
|
+
|
14
18
|
def each
|
15
19
|
[*@result].each do |doc|
|
16
20
|
yield doc
|
17
21
|
end
|
18
22
|
end
|
23
|
+
|
19
24
|
def print
|
20
25
|
if success?
|
21
26
|
each(&:print)
|
@@ -2,9 +2,22 @@ require 'http'
|
|
2
2
|
module Ecoportal
|
3
3
|
module API
|
4
4
|
module Common
|
5
|
+
# @note
|
6
|
+
# - You can see the documentation of the `HTTP` module in [the repository](https://github.com/httprb/http)
|
7
|
+
# - it does `extend` the module `Chainable` ([chainable.rb](https://github.com/httprb/http/blob/master/lib/http/chainable.rb)),
|
8
|
+
# - where all the http requests are dev by using `HTTP::Client#request` ([client.rb](https://github.com/httprb/http/blob/master/lib/http/client.rb))
|
9
|
+
# - which calls `build_request` (new `HTTP::Request`) and `perform` (new `HTTP::Connection`)
|
10
|
+
# - to return `HTTP::Response` ([response.rb](https://github.com/httprb/http/blob/master/lib/http/response.rb))
|
11
|
+
# @attr_reader logger [Logger] the logger.
|
5
12
|
class Client
|
6
13
|
attr_accessor :logger
|
7
14
|
|
15
|
+
# @note the `api_key` will be automatically added as parameter `X-ApiKey` in the header of the http requests.
|
16
|
+
# @param api_key [String] the key version to stablish the api connection.
|
17
|
+
# @param version [String] it is part of the base url and will determine the api version we query against.
|
18
|
+
# @param host [String] api server domain.
|
19
|
+
# @param logger [Logger] an object with `Logger` interface to generate logs.
|
20
|
+
# @return [Client] an object that holds the configuration of the api connection.
|
8
21
|
def initialize(api_key:, version: "v1", host: "live.ecoportal.com", logger: nil)
|
9
22
|
@version = version
|
10
23
|
@api_key = api_key
|
@@ -21,10 +34,27 @@ module Ecoportal
|
|
21
34
|
@response_logging_enabled = true
|
22
35
|
end
|
23
36
|
|
37
|
+
# Logger interface.
|
38
|
+
# @example:
|
39
|
+
# log(:info) {"General information on what's going on"}
|
40
|
+
# log(:warn) {"This is a warning that something is likely to have gone amiss"}
|
41
|
+
# log(:error) {"Something went wrong"}
|
42
|
+
# log(:fatal) {"An unrecoverable error has happend"}
|
43
|
+
# @param level [Symbol] the level that the message should be logged.
|
44
|
+
# @yield [] generates the message.
|
45
|
+
# @yieldreturn [String] the generated message.
|
24
46
|
def log(level, &block)
|
25
|
-
|
47
|
+
logger.send(level, &block) if logger
|
26
48
|
end
|
27
49
|
|
50
|
+
# Sends an http `GET` request against the api version using `path` to complete the base url,
|
51
|
+
# and adding the key_value pairs of `params` in the http _header_.
|
52
|
+
# @param path [String] the tail that completes the url of the request.
|
53
|
+
# @param params [Hash] the header paramters of the http request (not including the api key).
|
54
|
+
# @option params [String] :page the current page we are requesting with given the `:per_page` offset.
|
55
|
+
# @option params [String] :per_page the offset or the number of entries you get per request.
|
56
|
+
# @option params [String] :q some text to search. Omit this parameter to target all the entries.
|
57
|
+
# @return [Common::Reponse] the basic custom response object.
|
28
58
|
def get(path, params: {})
|
29
59
|
instrument("GET", path, params) do
|
30
60
|
request do |http|
|
@@ -33,6 +63,12 @@ module Ecoportal
|
|
33
63
|
end
|
34
64
|
end
|
35
65
|
|
66
|
+
# Sends an http `POST` request against the api version using `path` to complete the base url,
|
67
|
+
# and the `data` as a body of the http request.
|
68
|
+
# @note it automatically adds the http header param `Content-Type` as `application/json`
|
69
|
+
# @param path [String] the tail that completes the url of the request.
|
70
|
+
# @param data [String] the body of the query in json format.
|
71
|
+
# @return [Common::Reponse] the basic custom response object.
|
36
72
|
def post(path, data:)
|
37
73
|
instrument("POST", path, data) do
|
38
74
|
request do |http|
|
@@ -41,6 +77,12 @@ module Ecoportal
|
|
41
77
|
end
|
42
78
|
end
|
43
79
|
|
80
|
+
# Sends an http `PATCH` request against the api version using `path` to complete the base url,
|
81
|
+
# and the `data` as a body of the http request.
|
82
|
+
# @note it automatically adds the http header param `Content-Type` as `application/json`
|
83
|
+
# @param path [String] the tail that completes the url of the request.
|
84
|
+
# @param data [String] the body of the query in json format.
|
85
|
+
# @return [Common::Reponse] the basic custom response object.
|
44
86
|
def patch(path, data:)
|
45
87
|
instrument("PATCH", path, data) do
|
46
88
|
request do |http|
|
@@ -49,6 +91,9 @@ module Ecoportal
|
|
49
91
|
end
|
50
92
|
end
|
51
93
|
|
94
|
+
# Sends an http `DELETE` request against the api version using `path` to complete the base url.
|
95
|
+
# @param path [String] the tail that completes the url of the request.
|
96
|
+
# @return [Common::Reponse] the basic custom response object.
|
52
97
|
def delete(path)
|
53
98
|
instrument("DELETE", path) do
|
54
99
|
request do |http|
|
@@ -57,18 +102,33 @@ module Ecoportal
|
|
57
102
|
end
|
58
103
|
end
|
59
104
|
|
105
|
+
# Allows to launch a different operation via `block`, providing the
|
106
|
+
# basic HTTP connection to the block.
|
107
|
+
# @yield [http] launch specific http request.
|
108
|
+
# @yieldparam http [HTTP] the http connection.
|
109
|
+
# @yieldreturn [Common::Response] the basic custom reponse object.
|
110
|
+
# @return [Common::Reponse] the basic custom response object.
|
60
111
|
def request
|
61
112
|
wrap_response yield(base_request)
|
62
113
|
end
|
63
114
|
|
115
|
+
# Wrap with basic custom object of the gem for responses.
|
116
|
+
# @param response [HTTP::Response]
|
117
|
+
# @return [Common::Reponse] the basic custom response object.
|
64
118
|
def wrap_response(response)
|
65
119
|
Ecoportal::API::Common::Response.new(response)
|
66
120
|
end
|
67
121
|
|
122
|
+
# Creates a HTTP object adding the `X-ApiKey` param to the header.
|
123
|
+
# @note It configures HTTP so it only allows body data in json format.
|
124
|
+
# @return [HTTP] HTTP object.
|
68
125
|
def base_request
|
69
126
|
@base_request ||= HTTP.headers("X-ApiKey" => @api_key).accept(:json)
|
70
127
|
end
|
71
128
|
|
129
|
+
# Full URl builder of the request
|
130
|
+
# @param path [String] the tail that completes the url of the request.
|
131
|
+
# @return [String] the final url.
|
72
132
|
def url_for(path)
|
73
133
|
@base_uri+@version+path
|
74
134
|
end
|