plate_api 0.4.0 → 1.0.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/.byebug_history +43 -0
- data/.gitignore +2 -0
- data/.travis.yml +11 -0
- data/Gemfile.lock +47 -1
- data/README.md +28 -9
- data/lib/plate_api/connector.rb +40 -14
- data/lib/plate_api/delete_request.rb +0 -2
- data/lib/plate_api/get_request.rb +0 -2
- data/lib/plate_api/object_handler.rb +110 -0
- data/lib/plate_api/plate_object/attachment.rb +18 -0
- data/lib/plate_api/plate_object/base.rb +117 -0
- data/lib/plate_api/plate_object/column.rb +15 -0
- data/lib/plate_api/plate_object/company.rb +15 -0
- data/lib/plate_api/plate_object/element.rb +14 -0
- data/lib/plate_api/plate_object/partner.rb +14 -0
- data/lib/plate_api/plate_object/post.rb +18 -0
- data/lib/plate_api/plate_object/row.rb +16 -0
- data/lib/plate_api/plate_object/section.rb +17 -0
- data/lib/plate_api/plate_object/site.rb +28 -0
- data/lib/plate_api/plate_object/site_translations.rb +19 -0
- data/lib/plate_api/plate_object/theme.rb +8 -0
- data/lib/plate_api/post_multipart_request.rb +35 -0
- data/lib/plate_api/put_request.rb +0 -2
- data/lib/plate_api/request.rb +14 -5
- data/lib/plate_api/version.rb +1 -1
- data/lib/plate_api.rb +10 -0
- data/plate_api.gemspec +9 -1
- metadata +104 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47fb3d26ae744fae7daf830907607587c1978be77029fa8d4cade526edeeccfe
|
4
|
+
data.tar.gz: 2f3e0817b62ee8f7bd344785adc353b12fb9189c539925ba7da7f181ede52246
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8a9bba6f6bc0582813b0df46d5a72d3f5de015e4bb5dcbf66bcd52fc043bb354db6bba5e9d2379160f0fbc96c3077d43914094ef8d3c09572381a1b8e4e8788
|
7
|
+
data.tar.gz: f66601a98fad886c26a10106697ea5c0632f423513581fce78431cfa094d97e980e04b83acb89a8a0917d90041ebde34c28cf7b215a1b2afcd7f6c9bc166b544
|
data/.byebug_history
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
c
|
2
|
+
attributes
|
3
|
+
m
|
4
|
+
c
|
5
|
+
attributes
|
6
|
+
m
|
7
|
+
c;m
|
8
|
+
m
|
9
|
+
c
|
10
|
+
m
|
11
|
+
c
|
12
|
+
attributes
|
13
|
+
s
|
14
|
+
up
|
15
|
+
s
|
16
|
+
up
|
17
|
+
s
|
18
|
+
new_object.attributes
|
19
|
+
c
|
20
|
+
new_object.attributes
|
21
|
+
new_object
|
22
|
+
c
|
23
|
+
full_path
|
24
|
+
c
|
25
|
+
n
|
26
|
+
val.is_a? File
|
27
|
+
val
|
28
|
+
c
|
29
|
+
val.is_a? File
|
30
|
+
val
|
31
|
+
parameters
|
32
|
+
c
|
33
|
+
site.id
|
34
|
+
site = subject.find(5)
|
35
|
+
c
|
36
|
+
site.class.superclass
|
37
|
+
site.class.methods
|
38
|
+
site.class
|
39
|
+
site.methods.class
|
40
|
+
site.methods - Object.methods
|
41
|
+
site.methods
|
42
|
+
site.id
|
43
|
+
site = subject.find(5)
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,5 +1,16 @@
|
|
1
|
+
|
2
|
+
env:
|
3
|
+
global:
|
4
|
+
- CC_TEST_REPORTER_ID=5ad5ab58c1dde153aed2f4ed1ca671baa6d34530eb18a0c421fcb7bab89338e6
|
1
5
|
sudo: false
|
2
6
|
language: ruby
|
3
7
|
rvm:
|
4
8
|
- 2.5.1
|
5
9
|
before_install: gem install bundler -v 1.16.1
|
10
|
+
before_script:
|
11
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
12
|
+
- chmod +x ./cc-test-reporter
|
13
|
+
- ./cc-test-reporter before-build
|
14
|
+
script: bundle exec rake spec
|
15
|
+
after_script:
|
16
|
+
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,43 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
plate_api (0.
|
4
|
+
plate_api (1.0.0)
|
5
5
|
faraday (~> 0.15.4)
|
6
6
|
faraday_middleware (~> 0.13.1)
|
7
|
+
mimemagic (~> 0.3.3)
|
7
8
|
|
8
9
|
GEM
|
9
10
|
remote: https://rubygems.org/
|
10
11
|
specs:
|
12
|
+
activesupport (5.2.2)
|
13
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
14
|
+
i18n (>= 0.7, < 2)
|
15
|
+
minitest (~> 5.1)
|
16
|
+
tzinfo (~> 1.1)
|
17
|
+
addressable (2.6.0)
|
18
|
+
public_suffix (>= 2.0.2, < 4.0)
|
19
|
+
ansi (1.5.0)
|
20
|
+
byebug (11.0.0)
|
21
|
+
concurrent-ruby (1.1.4)
|
22
|
+
crack (0.4.3)
|
23
|
+
safe_yaml (~> 1.0.0)
|
11
24
|
diff-lcs (1.3)
|
25
|
+
docile (1.3.1)
|
26
|
+
factory_bot (5.0.1)
|
27
|
+
activesupport (>= 4.2.0)
|
12
28
|
faraday (0.15.4)
|
13
29
|
multipart-post (>= 1.2, < 3)
|
14
30
|
faraday_middleware (0.13.1)
|
15
31
|
faraday (>= 0.7.4, < 1.0)
|
32
|
+
hashdiff (0.3.8)
|
33
|
+
hirb (0.7.3)
|
34
|
+
i18n (1.5.3)
|
35
|
+
concurrent-ruby (~> 1.0)
|
36
|
+
json (2.1.0)
|
37
|
+
mimemagic (0.3.3)
|
38
|
+
minitest (5.11.3)
|
16
39
|
multipart-post (2.0.0)
|
40
|
+
public_suffix (3.0.3)
|
17
41
|
rake (10.5.0)
|
18
42
|
rspec (3.8.0)
|
19
43
|
rspec-core (~> 3.8.0)
|
@@ -28,15 +52,37 @@ GEM
|
|
28
52
|
diff-lcs (>= 1.2.0, < 2.0)
|
29
53
|
rspec-support (~> 3.8.0)
|
30
54
|
rspec-support (3.8.0)
|
55
|
+
safe_yaml (1.0.5)
|
56
|
+
simplecov (0.16.1)
|
57
|
+
docile (~> 1.1)
|
58
|
+
json (>= 1.8, < 3)
|
59
|
+
simplecov-html (~> 0.10.0)
|
60
|
+
simplecov-console (0.4.2)
|
61
|
+
ansi
|
62
|
+
hirb
|
63
|
+
simplecov
|
64
|
+
simplecov-html (0.10.2)
|
65
|
+
thread_safe (0.3.6)
|
66
|
+
tzinfo (1.2.5)
|
67
|
+
thread_safe (~> 0.1)
|
68
|
+
webmock (3.5.1)
|
69
|
+
addressable (>= 2.3.6)
|
70
|
+
crack (>= 0.3.2)
|
71
|
+
hashdiff
|
31
72
|
|
32
73
|
PLATFORMS
|
33
74
|
ruby
|
34
75
|
|
35
76
|
DEPENDENCIES
|
36
77
|
bundler (~> 1.16)
|
78
|
+
byebug
|
79
|
+
factory_bot (~> 5.0.1)
|
37
80
|
plate_api!
|
38
81
|
rake (~> 10.0)
|
39
82
|
rspec (~> 3.0)
|
83
|
+
simplecov
|
84
|
+
simplecov-console
|
85
|
+
webmock (~> 3.0)
|
40
86
|
|
41
87
|
BUNDLED WITH
|
42
88
|
1.16.1
|
data/README.md
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+

|
2
|
+
[](https://badge.fury.io/rb/plate_api)
|
3
|
+
[](https://travis-ci.com/platehub/plate_api)
|
4
|
+
[](https://codeclimate.com/github/platehub/plate_api/maintainability)
|
5
|
+
[](https://codeclimate.com/github/platehub/plate_api/test_coverage)
|
1
6
|
# PlateApi
|
2
7
|
|
3
|
-
Welcome to
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
8
|
+
Welcome to the PlateApi gem. This gem provides a wrapper to communicate with the Plate API, taking care of
|
9
|
+
authentication.
|
6
10
|
|
7
11
|
## Installation
|
8
12
|
|
@@ -20,9 +24,28 @@ Or install it yourself as:
|
|
20
24
|
|
21
25
|
$ gem install plate_api
|
22
26
|
|
23
|
-
##
|
27
|
+
## Getting started
|
28
|
+
|
29
|
+
To get started with a simple connector:
|
30
|
+
|
31
|
+
```
|
32
|
+
# Initialze a connector
|
33
|
+
con == PlateApi::Connector.new("{{public_key}}", "{{secret_key}}")
|
34
|
+
|
35
|
+
# Find information of a specific site with id == 822
|
36
|
+
site = con.sites.find(822)
|
24
37
|
|
25
|
-
|
38
|
+
# Find all posts in this site
|
39
|
+
posts = site.posts
|
40
|
+
|
41
|
+
# Find all elements in the first post of this site
|
42
|
+
first_post = posts.first
|
43
|
+
elements = first_post.elements
|
44
|
+
|
45
|
+
# Update the content field 'body' of the first element
|
46
|
+
element = elements.first
|
47
|
+
element.update(body: "<h2>My new text</h2>")
|
48
|
+
```
|
26
49
|
|
27
50
|
## Development
|
28
51
|
|
@@ -30,10 +53,6 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
30
53
|
|
31
54
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
55
|
|
33
|
-
## Contributing
|
34
|
-
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/plate_api.
|
36
|
-
|
37
56
|
## License
|
38
57
|
|
39
58
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/lib/plate_api/connector.rb
CHANGED
@@ -1,32 +1,58 @@
|
|
1
|
-
require "plate_api/get_request"
|
2
|
-
require "plate_api/delete_request"
|
3
|
-
require "plate_api/post_request"
|
4
|
-
require "plate_api/put_request"
|
5
|
-
|
6
1
|
module PlateApi
|
7
2
|
class Connector
|
8
3
|
|
9
|
-
|
10
4
|
def initialize(public_key, secret_key, custom_server=nil)
|
11
5
|
@custom_server = custom_server
|
12
6
|
@public_key = public_key
|
13
7
|
@secret_key = secret_key
|
8
|
+
@handling_classes = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def get(url="", parameters={}, response_type=:json)
|
12
|
+
GetRequest.new(@public_key, @secret_key, url, parameters, @custom_server).execute(response_type)
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete(url="", parameters={}, response_type=:json)
|
16
|
+
DeleteRequest.new(@public_key, @secret_key, url, parameters, @custom_server).execute(response_type)
|
14
17
|
end
|
15
18
|
|
16
|
-
def
|
17
|
-
|
19
|
+
def put(url="", put_params={}, response_type=:json)
|
20
|
+
PutRequest.new(@public_key, @secret_key, url, put_params, @custom_server).execute(response_type)
|
18
21
|
end
|
19
22
|
|
20
|
-
def
|
21
|
-
|
23
|
+
def post(url="", post_params={}, response_type=:json)
|
24
|
+
PostRequest.new(@public_key, @secret_key, url, post_params, @custom_server).execute(response_type)
|
22
25
|
end
|
23
26
|
|
24
|
-
def
|
25
|
-
|
27
|
+
def post_multipart(url="", post_params={}, response_type=:json)
|
28
|
+
PostMultipartRequest.new(@public_key, @secret_key, url, post_params, @custom_server).execute(response_type)
|
26
29
|
end
|
27
30
|
|
28
|
-
def
|
29
|
-
|
31
|
+
def handler(handled_class)
|
32
|
+
@handling_classes[handled_class] ||= ObjectHandler.new(handled_class, self)
|
30
33
|
end
|
34
|
+
|
35
|
+
def self.plate_object_classes
|
36
|
+
{
|
37
|
+
sites: PlateApi::PlateObject::Site,
|
38
|
+
partners: PlateApi::PlateObject::Partner,
|
39
|
+
companies: PlateApi::PlateObject::Company,
|
40
|
+
themes: PlateApi::PlateObject::Theme,
|
41
|
+
site_translations: PlateApi::PlateObject::SiteTranslation,
|
42
|
+
posts: PlateApi::PlateObject::Post,
|
43
|
+
sections: PlateApi::PlateObject::Section,
|
44
|
+
rows: PlateApi::PlateObject::Row,
|
45
|
+
columns: PlateApi::PlateObject::Column,
|
46
|
+
elements: PlateApi::PlateObject::Element
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
self.plate_object_classes.each do |k,v|
|
51
|
+
define_method(k) do
|
52
|
+
return handler(v)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
31
57
|
end
|
32
58
|
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module PlateApi
|
2
|
+
class ObjectHandler
|
3
|
+
|
4
|
+
attr_reader :api_connector
|
5
|
+
attr_reader :handling_class
|
6
|
+
|
7
|
+
def initialize(handling_class, api_connector)
|
8
|
+
raise ArgumentError.new("`handling_class` given for #new is not valid") unless handling_class
|
9
|
+
raise ArgumentError.new("`api_connector` given for #new is not valid") unless api_connector
|
10
|
+
@handling_class = handling_class
|
11
|
+
@api_connector = api_connector
|
12
|
+
end
|
13
|
+
|
14
|
+
def find(id)
|
15
|
+
raise ArgumentError.new("`id` given for #find is not valid") unless id
|
16
|
+
result = @api_connector.get(resource_path(id))
|
17
|
+
if result["data"]
|
18
|
+
return new_object(result["data"])
|
19
|
+
else
|
20
|
+
puts "No result: #{result}"
|
21
|
+
return nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def update(id, attributes)
|
26
|
+
raise ArgumentError.new("`id` given for #update is not valid") unless id
|
27
|
+
raise ArgumentError.new("`attributes` given for #update is not valid") unless attributes.is_a? Hash
|
28
|
+
result = @api_connector.put(resource_path(id), {"data" => attributes})
|
29
|
+
|
30
|
+
if result["data"]
|
31
|
+
return new_object(result["data"])
|
32
|
+
else
|
33
|
+
puts "No result: #{result}"
|
34
|
+
return nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def create(parent, attributes, create_method=:post)
|
39
|
+
raise ArgumentError.new("`parent` given for #create is not valid") unless parent
|
40
|
+
raise ArgumentError.new("`attributes` given for #create is not valid") unless attributes.is_a? Hash
|
41
|
+
parameters = case create_method
|
42
|
+
when :post
|
43
|
+
{"data" => attributes}
|
44
|
+
when :post_multipart
|
45
|
+
attributes
|
46
|
+
end
|
47
|
+
|
48
|
+
result = @api_connector.send(create_method, collection_path(parent.class, parent.id), parameters)
|
49
|
+
|
50
|
+
if result["data"]
|
51
|
+
return new_object(result["data"])
|
52
|
+
else
|
53
|
+
puts "No result: #{result}"
|
54
|
+
return nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def delete(id)
|
59
|
+
raise ArgumentError.new("`id` given for #find is not valid") unless id
|
60
|
+
result = @api_connector.delete(resource_path(id))
|
61
|
+
if result["data"]
|
62
|
+
return new_object(result["data"])
|
63
|
+
else
|
64
|
+
puts "No result: #{result}"
|
65
|
+
return nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def index(parent_class, parent_id)
|
70
|
+
raise ArgumentError.new("`parent_id` given for #index is not valid") unless parent_id
|
71
|
+
raise ArgumentError.new("`parent_class` given for #index is not valid") unless parent_class
|
72
|
+
|
73
|
+
result = @api_connector.get(collection_path(parent_class, parent_id))
|
74
|
+
if result["data"]
|
75
|
+
return result["data"].map{|x| new_object(x)}
|
76
|
+
else
|
77
|
+
puts "No result: #{result}"
|
78
|
+
return nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
# Construct a new object of @handling_class, given a succesful api_response
|
85
|
+
def new_object(api_response)
|
86
|
+
@handling_class.new(
|
87
|
+
api_response["id"],
|
88
|
+
api_response["attributes"],
|
89
|
+
api_response["relations"],
|
90
|
+
self
|
91
|
+
)
|
92
|
+
end
|
93
|
+
|
94
|
+
def resource_path(id)
|
95
|
+
"#{@handling_class.api_name}/#{id}"
|
96
|
+
end
|
97
|
+
|
98
|
+
def collection_path(parent_class=nil, parent_id=nil)
|
99
|
+
if (parent_class != nil) ^ (parent_id != nil)
|
100
|
+
raise ArgumentError.new("An invalid combination `parent_class` and `parent_id` is given. Provide both or none.")
|
101
|
+
end
|
102
|
+
|
103
|
+
if parent_class
|
104
|
+
"#{parent_class.api_name}/#{parent_id}/#{@handling_class.api_name}"
|
105
|
+
else
|
106
|
+
"#{@handling_class.api_name}"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module PlateApi::PlateObject
|
2
|
+
class Attachment < Base
|
3
|
+
|
4
|
+
has_one :site, "PlateApi::PlateObject::Site"
|
5
|
+
|
6
|
+
def download
|
7
|
+
@object_handler.api_connector.get("attachments/#{@id}/download", {}, :raw)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.api_name
|
11
|
+
"attachments"
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.parent_class
|
15
|
+
Site
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
module PlateApi::PlateObject
|
2
|
+
class Base
|
3
|
+
attr_reader :id, :attributes, :relations
|
4
|
+
attr_accessor :object_handler
|
5
|
+
|
6
|
+
HasOneRelations = {}
|
7
|
+
HasManyRelations = {}
|
8
|
+
|
9
|
+
def initialize(id, attributes, relations, object_handler=nil)
|
10
|
+
@id = id
|
11
|
+
@object_handler = object_handler
|
12
|
+
initialize_state(attributes, relations)
|
13
|
+
end
|
14
|
+
|
15
|
+
def api_name
|
16
|
+
self.class.api_name
|
17
|
+
end
|
18
|
+
|
19
|
+
def reload
|
20
|
+
raise ArgumentError.new("No object_handler is set.") unless @object_handler
|
21
|
+
reinitialize(@object_handler.find(@id))
|
22
|
+
return self
|
23
|
+
end
|
24
|
+
|
25
|
+
def update(attributes)
|
26
|
+
raise ArgumentError.new("Input `attributes` is not a Hash") unless attributes.is_a? Hash
|
27
|
+
raise ArgumentError.new("No object_handler is attached to this object") unless @object_handler
|
28
|
+
if new_object = @object_handler.update(@id, attributes)
|
29
|
+
reinitialize(new_object)
|
30
|
+
else
|
31
|
+
raise ArgumentError.new("The update was unsuccesful.")
|
32
|
+
end
|
33
|
+
return self
|
34
|
+
end
|
35
|
+
|
36
|
+
def delete
|
37
|
+
raise ArgumentError.new("No object_handler is attached to this object") unless @object_handler
|
38
|
+
@object_handler.delete(@id)
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_s
|
42
|
+
"<Plate #{self.class.name.split('::').last}, @id=#{@id}, @attributes=#{@attributes}, @object_handler=#{@object_handler}>"
|
43
|
+
end
|
44
|
+
|
45
|
+
def inspect
|
46
|
+
to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
def method_missing(m, *args, &block)
|
50
|
+
if attributes[m.to_s]
|
51
|
+
return attributes[m.to_s]
|
52
|
+
elsif attributes["content"] && attributes["content"][m.to_s]
|
53
|
+
return attributes["content"][m.to_s]["value"]
|
54
|
+
else
|
55
|
+
super
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def ==(other)
|
60
|
+
return other.id == @id && other.class == self.class
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def reinitialize(new_object)
|
66
|
+
initialize_state(new_object.attributes, new_object.relations)
|
67
|
+
end
|
68
|
+
|
69
|
+
def initialize_state(attributes, relations)
|
70
|
+
set_relation_ids(relations)
|
71
|
+
@attributes = attributes
|
72
|
+
@relations = relations
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.has_one(name, klass)
|
76
|
+
self.attr_accessor "#{name}_id"
|
77
|
+
HasOneRelations[name.to_s] = klass
|
78
|
+
define_has_one_method(name, klass)
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.define_has_one_method(name, klass)
|
82
|
+
define_method(name.to_s) do
|
83
|
+
id = self.send("#{name}_id")
|
84
|
+
return nil unless id
|
85
|
+
@object_handler.api_connector.handler(Object.const_get(klass)).find(id)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.has_many(plural_name, singular_name, klass, define_create_method=false)
|
90
|
+
HasManyRelations[plural_name.to_s] = klass
|
91
|
+
define_has_many_method(plural_name, klass)
|
92
|
+
define_create_method(singular_name, klass) if define_create_method
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.define_has_many_method(plural_name, klass)
|
96
|
+
define_method(plural_name.to_s) do
|
97
|
+
@object_handler.api_connector.handler(Object.const_get(klass)).index(self.class, @id)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.define_create_method(singular_name, klass)
|
102
|
+
define_method("create_#{singular_name}") do |create_attributes|
|
103
|
+
@object_handler.api_connector.handler(Object.const_get(klass)).create(self, create_attributes)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def set_relation_ids(relations_attributes)
|
108
|
+
return unless relations_attributes
|
109
|
+
self.class::HasOneRelations.keys.each do |relation_name|
|
110
|
+
val = relations_attributes["#{relation_name}_id"]
|
111
|
+
if val
|
112
|
+
send("#{relation_name}_id=", val)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module PlateApi::PlateObject
|
2
|
+
class Column < Base
|
3
|
+
|
4
|
+
has_one :row, "PlateApi::PlateObject::Row"
|
5
|
+
has_many :elements, :element, "PlateApi::PlateObject::Element", true
|
6
|
+
|
7
|
+
def self.api_name
|
8
|
+
"columns"
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.parent_class
|
12
|
+
Row
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module PlateApi::PlateObject
|
2
|
+
class Company < Base
|
3
|
+
|
4
|
+
has_one :partner, "PlateApi::PlateObject::Partner"
|
5
|
+
has_many :sites, :site, "PlateApi::PlateObject::Site"
|
6
|
+
|
7
|
+
def self.api_name
|
8
|
+
"companies"
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.parent_class
|
12
|
+
Partner
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module PlateApi::PlateObject
|
2
|
+
class Post < Base
|
3
|
+
|
4
|
+
has_one :site_translation, "PlateApi::PlateObject::SiteTranslation"
|
5
|
+
has_many :sections, :section, "PlateApi::PlateObject::Section", true
|
6
|
+
has_many :rows, :row, "PlateApi::PlateObject::Row"
|
7
|
+
has_many :columns, :column, "PlateApi::PlateObject::Column"
|
8
|
+
has_many :elements, :element, "PlateApi::PlateObject::Element"
|
9
|
+
|
10
|
+
def self.api_name
|
11
|
+
"posts"
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.parent_class
|
15
|
+
SiteTranslation
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module PlateApi::PlateObject
|
2
|
+
class Row < Base
|
3
|
+
|
4
|
+
has_one :section, "PlateApi::PlateObject::Section"
|
5
|
+
has_many :columns, :column, "PlateApi::PlateObject::Column", true
|
6
|
+
has_many :elements, :element, "PlateApi::PlateObject::Element"
|
7
|
+
|
8
|
+
def self.api_name
|
9
|
+
"rows"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.parent_class
|
13
|
+
Section
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module PlateApi::PlateObject
|
2
|
+
class Section < Base
|
3
|
+
|
4
|
+
has_one :post, "PlateApi::PlateObject::Post"
|
5
|
+
has_many :rows, :row, "PlateApi::PlateObject::Row", true
|
6
|
+
has_many :columns, :column, "PlateApi::PlateObject::Column"
|
7
|
+
has_many :elements, :element, "PlateApi::PlateObject::Element"
|
8
|
+
|
9
|
+
def self.api_name
|
10
|
+
"sections"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.parent_class
|
14
|
+
Post
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module PlateApi::PlateObject
|
2
|
+
class Site < Base
|
3
|
+
|
4
|
+
has_one :theme, "PlateApi::PlateObject::Theme"
|
5
|
+
has_one :company, "PlateApi::PlateObject::Company"
|
6
|
+
has_many :site_translations, :site_translation, "PlateApi::PlateObject::SiteTranslation"
|
7
|
+
has_many :posts, :post, "PlateApi::PlateObject::Post"
|
8
|
+
has_many :sections, :section, "PlateApi::PlateObject::Section"
|
9
|
+
has_many :rows, :row, "PlateApi::PlateObject::Row"
|
10
|
+
has_many :columns, :column, "PlateApi::PlateObject::Column"
|
11
|
+
has_many :elements, :element, "PlateApi::PlateObject::Element"
|
12
|
+
has_many :attachments, :attachment, "PlateApi::PlateObject::Attachment"
|
13
|
+
|
14
|
+
def self.api_name
|
15
|
+
"sites"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.parent_class
|
19
|
+
Company
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_attachment(file, extra_parameters={})
|
23
|
+
raise ArgumentError.new("No File is given as input") unless file.is_a? File
|
24
|
+
parameters = extra_parameters.merge({file: file})
|
25
|
+
@object_handler.api_connector.handler(PlateApi::PlateObject::Attachment).create(self, parameters, :post_multipart)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module PlateApi::PlateObject
|
2
|
+
class SiteTranslation < Base
|
3
|
+
|
4
|
+
has_one :site, "PlateApi::PlateObject::Site"
|
5
|
+
has_many :posts, :post, "PlateApi::PlateObject::Post", true
|
6
|
+
has_many :sections, :section, "PlateApi::PlateObject::Section"
|
7
|
+
has_many :rows, :row, "PlateApi::PlateObject::Row"
|
8
|
+
has_many :columns, :column, "PlateApi::PlateObject::Column"
|
9
|
+
has_many :elements, :element, "PlateApi::PlateObject::Element"
|
10
|
+
|
11
|
+
def self.api_name
|
12
|
+
"site_translations"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.parent_class
|
16
|
+
Site
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'mimemagic'
|
2
|
+
|
3
|
+
module PlateApi
|
4
|
+
class PostMultipartRequest < Request
|
5
|
+
HttpAdapter = :net_http
|
6
|
+
|
7
|
+
def initialize(public_key, secret, path, parameters={}, custom_server=nil)
|
8
|
+
super(public_key, secret, "POST", path, custom_server)
|
9
|
+
|
10
|
+
@post_parameters = map_parameters(parameters)
|
11
|
+
end
|
12
|
+
|
13
|
+
def extra_builder_options(builder)
|
14
|
+
builder.request :multipart
|
15
|
+
builder.request :url_encoded
|
16
|
+
end
|
17
|
+
|
18
|
+
def extra_request_options(request)
|
19
|
+
request.body = @post_parameters
|
20
|
+
end
|
21
|
+
|
22
|
+
def map_parameters(parameters)
|
23
|
+
parameters.keys.each do |key|
|
24
|
+
val = parameters[key]
|
25
|
+
if val.is_a? File
|
26
|
+
full_path = File.expand_path(val)
|
27
|
+
mime_type = MimeMagic.by_path(full_path).type
|
28
|
+
parameters[key] = Faraday::UploadIO.new(full_path, mime_type)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
return parameters
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/plate_api/request.rb
CHANGED
@@ -3,18 +3,20 @@ require 'faraday_middleware'
|
|
3
3
|
require 'time'
|
4
4
|
require "base64"
|
5
5
|
require "openssl"
|
6
|
+
require "json"
|
6
7
|
|
7
8
|
|
8
9
|
module PlateApi
|
9
10
|
class Request
|
10
11
|
DefaultApiBaseEndpoint = "https://www.startwithplate.com/api/v2"
|
12
|
+
HttpAdapter = Faraday.default_adapter
|
11
13
|
|
12
14
|
def initialize(public_key, secret, method, path, custom_server=nil)
|
13
15
|
base_api_endpoint = custom_server ? custom_server : DefaultApiBaseEndpoint
|
14
16
|
|
15
17
|
@connection = ::Faraday.new(url: base_api_endpoint) do |faraday|
|
16
|
-
faraday
|
17
|
-
faraday.adapter
|
18
|
+
extra_builder_options(faraday)
|
19
|
+
faraday.adapter HttpAdapter
|
18
20
|
end
|
19
21
|
|
20
22
|
@public_key = public_key
|
@@ -23,16 +25,20 @@ module PlateApi
|
|
23
25
|
@path = strip_path(path)
|
24
26
|
end
|
25
27
|
|
26
|
-
def
|
28
|
+
def execute(response_type=:raw)
|
27
29
|
response = @connection.send(@method.downcase) do |request|
|
28
30
|
request.url url_path
|
29
31
|
request.headers['Date'] = request_date
|
30
32
|
request.headers['Authorization'] = calculate_signature
|
31
|
-
request.headers['Content-Type'] = 'application/json'
|
32
33
|
extra_request_options(request)
|
33
34
|
end
|
34
35
|
|
35
|
-
return
|
36
|
+
return case response_type
|
37
|
+
when :raw
|
38
|
+
return response.body
|
39
|
+
when :json
|
40
|
+
return JSON.parse(response.body)
|
41
|
+
end
|
36
42
|
end
|
37
43
|
|
38
44
|
def request_date
|
@@ -62,6 +68,9 @@ module PlateApi
|
|
62
68
|
def extra_request_options(request)
|
63
69
|
end
|
64
70
|
|
71
|
+
def extra_builder_options(request)
|
72
|
+
end
|
73
|
+
|
65
74
|
def strip_path(path)
|
66
75
|
path.gsub(/^\/|\/$/, '')
|
67
76
|
end
|
data/lib/plate_api/version.rb
CHANGED
data/lib/plate_api.rb
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
require "plate_api/version"
|
2
|
+
require "plate_api/object_handler"
|
3
|
+
require "plate_api/plate_object/base"
|
4
|
+
Dir[File.join(__dir__,"plate_api/plate_object/", "*.rb")].each {|file| require file }
|
2
5
|
require "plate_api/connector"
|
6
|
+
require "plate_api/request"
|
7
|
+
require "plate_api/get_request"
|
8
|
+
require "plate_api/delete_request"
|
9
|
+
require "plate_api/post_request"
|
10
|
+
require "plate_api/post_multipart_request"
|
11
|
+
require "plate_api/put_request"
|
12
|
+
|
3
13
|
|
4
14
|
module PlateApi
|
5
15
|
end
|
data/plate_api.gemspec
CHANGED
@@ -9,7 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.date = '2019-01-05'
|
10
10
|
spec.summary = "Connector for the Plate API"
|
11
11
|
spec.description = "This gem can be used to connect to the Plate API. It takes care
|
12
|
-
of the authentication procedure.
|
12
|
+
of the authentication procedure. It also provides a basic wrapper around the Plate API,
|
13
|
+
so objects in Plate can be manipulated as local objects."
|
13
14
|
spec.authors = ["David Kortleven"]
|
14
15
|
spec.email = 'david@getplate.com'
|
15
16
|
spec.files = ["lib/plate_api.rb"]
|
@@ -33,8 +34,15 @@ Gem::Specification.new do |spec|
|
|
33
34
|
|
34
35
|
spec.add_dependency "faraday", "~> 0.15.4"
|
35
36
|
spec.add_dependency "faraday_middleware", "~> 0.13.1"
|
37
|
+
spec.add_dependency "mimemagic", "~> 0.3.3"
|
36
38
|
|
37
39
|
spec.add_development_dependency "bundler", "~> 1.16"
|
38
40
|
spec.add_development_dependency "rake", "~> 10.0"
|
39
41
|
spec.add_development_dependency "rspec", "~> 3.0"
|
42
|
+
spec.add_development_dependency "webmock", "~> 3.0"
|
43
|
+
spec.add_development_dependency "factory_bot", "~> 5.0.1"
|
44
|
+
spec.add_development_dependency "simplecov"
|
45
|
+
spec.add_development_dependency "simplecov-console"
|
46
|
+
spec.add_development_dependency "byebug"
|
47
|
+
|
40
48
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plate_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Kortleven
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.13.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mimemagic
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.3.3
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.3.3
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,13 +94,86 @@ dependencies:
|
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '3.0'
|
83
|
-
|
84
|
-
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: webmock
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: factory_bot
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 5.0.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 5.0.1
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: simplecov-console
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: byebug
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
description: |-
|
168
|
+
This gem can be used to connect to the Plate API. It takes care
|
169
|
+
of the authentication procedure. It also provides a basic wrapper around the Plate API,
|
170
|
+
so objects in Plate can be manipulated as local objects.
|
85
171
|
email: david@getplate.com
|
86
172
|
executables: []
|
87
173
|
extensions: []
|
88
174
|
extra_rdoc_files: []
|
89
175
|
files:
|
176
|
+
- ".byebug_history"
|
90
177
|
- ".gitignore"
|
91
178
|
- ".rspec"
|
92
179
|
- ".travis.yml"
|
@@ -101,6 +188,20 @@ files:
|
|
101
188
|
- lib/plate_api/connector.rb
|
102
189
|
- lib/plate_api/delete_request.rb
|
103
190
|
- lib/plate_api/get_request.rb
|
191
|
+
- lib/plate_api/object_handler.rb
|
192
|
+
- lib/plate_api/plate_object/attachment.rb
|
193
|
+
- lib/plate_api/plate_object/base.rb
|
194
|
+
- lib/plate_api/plate_object/column.rb
|
195
|
+
- lib/plate_api/plate_object/company.rb
|
196
|
+
- lib/plate_api/plate_object/element.rb
|
197
|
+
- lib/plate_api/plate_object/partner.rb
|
198
|
+
- lib/plate_api/plate_object/post.rb
|
199
|
+
- lib/plate_api/plate_object/row.rb
|
200
|
+
- lib/plate_api/plate_object/section.rb
|
201
|
+
- lib/plate_api/plate_object/site.rb
|
202
|
+
- lib/plate_api/plate_object/site_translations.rb
|
203
|
+
- lib/plate_api/plate_object/theme.rb
|
204
|
+
- lib/plate_api/post_multipart_request.rb
|
104
205
|
- lib/plate_api/post_request.rb
|
105
206
|
- lib/plate_api/put_request.rb
|
106
207
|
- lib/plate_api/request.rb
|