dato 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +24 -0
- data/Gemfile +1 -0
- data/Rakefile +25 -9
- data/bin/console +4 -3
- data/dato.gemspec +28 -23
- data/lib/dato.rb +5 -3
- data/lib/dato/account/client.rb +6 -5
- data/lib/dato/account/repo/account.rb +9 -10
- data/lib/dato/account/repo/base.rb +3 -3
- data/lib/dato/account/repo/site.rb +7 -8
- data/lib/dato/api_error.rb +3 -2
- data/lib/dato/json_api_deserializer.rb +7 -9
- data/lib/dato/json_api_serializer.rb +4 -5
- data/lib/dato/local/entities_repo.rb +46 -0
- data/lib/dato/local/field_type/boolean.rb +12 -0
- data/lib/dato/local/field_type/date.rb +12 -0
- data/lib/dato/local/field_type/date_time.rb +12 -0
- data/lib/dato/local/field_type/file.rb +33 -0
- data/lib/dato/local/field_type/float.rb +12 -0
- data/lib/dato/local/field_type/image.rb +32 -0
- data/lib/dato/local/field_type/integer.rb +12 -0
- data/lib/dato/local/field_type/lat_lon.rb +23 -0
- data/lib/dato/local/field_type/link.rb +12 -0
- data/lib/dato/local/field_type/links.rb +12 -0
- data/lib/dato/local/field_type/seo.rb +24 -0
- data/lib/dato/local/field_type/string.rb +12 -0
- data/lib/dato/local/field_type/text.rb +12 -0
- data/lib/dato/local/field_type/video.rb +55 -0
- data/lib/dato/local/item.rb +121 -0
- data/lib/dato/local/items_repo.rb +110 -0
- data/lib/dato/local/json_api_entity.rb +78 -0
- data/lib/dato/local/site.rb +57 -0
- data/lib/dato/site/client.rb +6 -5
- data/lib/dato/site/repo/base.rb +3 -2
- data/lib/dato/site/repo/field.rb +3 -4
- data/lib/dato/site/repo/item.rb +6 -7
- data/lib/dato/site/repo/item_type.rb +6 -7
- data/lib/dato/site/repo/menu_item.rb +8 -9
- data/lib/dato/site/repo/site.rb +5 -6
- data/lib/dato/site/repo/upload_request.rb +3 -4
- data/lib/dato/site/repo/user.rb +8 -9
- data/lib/dato/upload/file.rb +6 -5
- data/lib/dato/upload/image.rb +3 -3
- data/lib/dato/version.rb +2 -1
- metadata +77 -1
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Dato
|
3
|
+
module Local
|
4
|
+
class JsonApiEntity
|
5
|
+
attr_reader :payload, :data_source
|
6
|
+
|
7
|
+
def initialize(payload, data_source)
|
8
|
+
@payload = payload
|
9
|
+
@data_source = data_source
|
10
|
+
end
|
11
|
+
|
12
|
+
def id
|
13
|
+
@payload[:id]
|
14
|
+
end
|
15
|
+
|
16
|
+
def type
|
17
|
+
@payload[:type]
|
18
|
+
end
|
19
|
+
|
20
|
+
def ==(other)
|
21
|
+
if other.is_a? JsonApiEntity
|
22
|
+
id == other.id && type == other.type
|
23
|
+
else
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
"#<JsonApiEntity id=#{id} type=#{type} payload=#{payload}>"
|
30
|
+
end
|
31
|
+
alias inspect to_s
|
32
|
+
|
33
|
+
def [](key)
|
34
|
+
attributes[key]
|
35
|
+
end
|
36
|
+
|
37
|
+
def respond_to_missing?(method, include_private = false)
|
38
|
+
if attributes.key?(method) || relationships.key?(method)
|
39
|
+
true
|
40
|
+
else
|
41
|
+
super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def attributes
|
48
|
+
@payload.fetch(:attributes, {})
|
49
|
+
end
|
50
|
+
|
51
|
+
def relationships
|
52
|
+
@payload.fetch(:relationships, {})
|
53
|
+
end
|
54
|
+
|
55
|
+
def dereference_linkage(linkage)
|
56
|
+
if linkage.is_a? Array
|
57
|
+
linkage.map do |item|
|
58
|
+
data_source.find_entity(item[:type], item[:id])
|
59
|
+
end
|
60
|
+
else
|
61
|
+
data_source.find_entity(linkage[:type], linkage[:id])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def method_missing(method, *arguments, &block)
|
66
|
+
return super unless arguments.empty?
|
67
|
+
|
68
|
+
if attributes.key?(method)
|
69
|
+
attributes[method]
|
70
|
+
elsif relationships.key?(method)
|
71
|
+
dereference_linkage(relationships[method][:data])
|
72
|
+
else
|
73
|
+
super
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'dato/local/entities_repo'
|
3
|
+
require 'dato/local/items_repo'
|
4
|
+
|
5
|
+
module Dato
|
6
|
+
module Local
|
7
|
+
class Site
|
8
|
+
attr_reader :client
|
9
|
+
attr_reader :entities_repo
|
10
|
+
attr_reader :items_repo
|
11
|
+
|
12
|
+
def initialize(client)
|
13
|
+
@client = client
|
14
|
+
@entities_repo = EntitiesRepo.new
|
15
|
+
@items_repo = ItemsRepo.new(@entities_repo)
|
16
|
+
end
|
17
|
+
|
18
|
+
def load
|
19
|
+
@entities_repo = EntitiesRepo.new(site, all_items)
|
20
|
+
@items_repo = ItemsRepo.new(@entities_repo)
|
21
|
+
end
|
22
|
+
|
23
|
+
def entity
|
24
|
+
@entities_repo.find_entities_of_type('site').first
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def site
|
30
|
+
include = [
|
31
|
+
'item_types',
|
32
|
+
'item_types.fields'
|
33
|
+
]
|
34
|
+
client.request(:get, '/site', include: include)
|
35
|
+
end
|
36
|
+
|
37
|
+
def all_items
|
38
|
+
items_per_page = 500
|
39
|
+
base_response = client.request(:get, '/items', 'page[limit]' => 1)
|
40
|
+
|
41
|
+
pages = (base_response[:meta][:total_count] / items_per_page.to_f).ceil
|
42
|
+
base_response[:data] = []
|
43
|
+
|
44
|
+
pages.times do |page|
|
45
|
+
base_response[:data] += client.request(
|
46
|
+
:get,
|
47
|
+
'/items',
|
48
|
+
'page[offset]' => items_per_page * page,
|
49
|
+
'page[limit]' => items_per_page
|
50
|
+
)[:data]
|
51
|
+
end
|
52
|
+
|
53
|
+
base_response
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/dato/site/client.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'faraday'
|
2
3
|
require 'faraday_middleware'
|
3
4
|
require 'json'
|
@@ -25,8 +26,8 @@ module Dato
|
|
25
26
|
site: Repo::Site,
|
26
27
|
upload_requests: Repo::UploadRequest,
|
27
28
|
users: Repo::User,
|
28
|
-
items: Repo::Item
|
29
|
-
}
|
29
|
+
items: Repo::Item
|
30
|
+
}.freeze
|
30
31
|
|
31
32
|
attr_reader :token, :base_url, :schema
|
32
33
|
|
@@ -58,7 +59,7 @@ module Dato
|
|
58
59
|
def request(*args)
|
59
60
|
connection.send(*args).body.with_indifferent_access
|
60
61
|
rescue Faraday::ClientError => e
|
61
|
-
raise ApiError
|
62
|
+
raise ApiError, e
|
62
63
|
end
|
63
64
|
|
64
65
|
private
|
@@ -67,8 +68,8 @@ module Dato
|
|
67
68
|
options = {
|
68
69
|
url: base_url,
|
69
70
|
headers: {
|
70
|
-
'Accept' =>
|
71
|
-
'Content-Type' =>
|
71
|
+
'Accept' => 'application/json',
|
72
|
+
'Content-Type' => 'application/json',
|
72
73
|
'Authorization' => "Bearer #{@token}"
|
73
74
|
}
|
74
75
|
}
|
data/lib/dato/site/repo/base.rb
CHANGED
data/lib/dato/site/repo/field.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'dato/site/repo/base'
|
2
3
|
|
3
4
|
module Dato
|
4
5
|
module Site
|
5
6
|
module Repo
|
6
7
|
class Field < Base
|
7
|
-
|
8
8
|
def create(item_type_id, resource_attributes)
|
9
9
|
body = JsonApiSerializer.new(
|
10
10
|
type: :field,
|
11
11
|
attributes: %i(api_key appeareance field_type hint label localized position validators),
|
12
|
-
required_attributes: %i(api_key appeareance field_type hint label localized position validators)
|
12
|
+
required_attributes: %i(api_key appeareance field_type hint label localized position validators)
|
13
13
|
).serialize(resource_attributes)
|
14
14
|
|
15
15
|
post_request "/item-types/#{item_type_id}/fields", body
|
@@ -18,7 +18,7 @@ module Dato
|
|
18
18
|
def update(field_id, resource_attributes)
|
19
19
|
body = JsonApiSerializer.new(
|
20
20
|
type: :field,
|
21
|
-
attributes: %i(api_key appeareance hint label localized position validators)
|
21
|
+
attributes: %i(api_key appeareance hint label localized position validators)
|
22
22
|
).serialize(resource_attributes, field_id)
|
23
23
|
|
24
24
|
put_request "/fields/#{field_id}", body
|
@@ -35,7 +35,6 @@ module Dato
|
|
35
35
|
def destroy(field_id)
|
36
36
|
delete_request "/fields/#{field_id}"
|
37
37
|
end
|
38
|
-
|
39
38
|
end
|
40
39
|
end
|
41
40
|
end
|
data/lib/dato/site/repo/item.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'dato/site/repo/base'
|
2
3
|
require 'active_support/core_ext/hash/except'
|
3
4
|
|
@@ -5,18 +6,17 @@ module Dato
|
|
5
6
|
module Site
|
6
7
|
module Repo
|
7
8
|
class Item < Base
|
8
|
-
|
9
9
|
def create(resource_attributes)
|
10
10
|
body = JsonApiSerializer.new(
|
11
11
|
type: :item,
|
12
12
|
attributes: resource_attributes.keys - [:item_type, :id],
|
13
13
|
relationships: {
|
14
|
-
item_type: { collection: false, type:
|
14
|
+
item_type: { collection: false, type: 'item_type' }
|
15
15
|
},
|
16
|
-
required_relationships: %i(item_type)
|
16
|
+
required_relationships: %i(item_type)
|
17
17
|
).serialize(resource_attributes)
|
18
18
|
|
19
|
-
post_request
|
19
|
+
post_request '/items', body
|
20
20
|
end
|
21
21
|
|
22
22
|
def update(item_id, resource_attributes)
|
@@ -29,14 +29,14 @@ module Dato
|
|
29
29
|
|
30
30
|
body = JsonApiSerializer.new(
|
31
31
|
type: :item,
|
32
|
-
attributes: resource_attributes.keys
|
32
|
+
attributes: resource_attributes.keys
|
33
33
|
).serialize(resource_attributes, item_id)
|
34
34
|
|
35
35
|
put_request "/items/#{item_id}", body
|
36
36
|
end
|
37
37
|
|
38
38
|
def all(filters = {})
|
39
|
-
get_request
|
39
|
+
get_request '/items', filters
|
40
40
|
end
|
41
41
|
|
42
42
|
def find(item_id)
|
@@ -46,7 +46,6 @@ module Dato
|
|
46
46
|
def destroy(item_id)
|
47
47
|
delete_request "/items/#{item_id}"
|
48
48
|
end
|
49
|
-
|
50
49
|
end
|
51
50
|
end
|
52
51
|
end
|
@@ -1,32 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'dato/site/repo/base'
|
2
3
|
|
3
4
|
module Dato
|
4
5
|
module Site
|
5
6
|
module Repo
|
6
7
|
class ItemType < Base
|
7
|
-
|
8
8
|
def create(resource_attributes)
|
9
9
|
body = JsonApiSerializer.new(
|
10
10
|
type: :item_type,
|
11
11
|
attributes: %i(api_key name singleton sortable),
|
12
|
-
required_attributes: %i(api_key name singleton sortable)
|
12
|
+
required_attributes: %i(api_key name singleton sortable)
|
13
13
|
).serialize(resource_attributes)
|
14
14
|
|
15
|
-
post_request
|
15
|
+
post_request '/item-types', body
|
16
16
|
end
|
17
17
|
|
18
18
|
def update(item_type_id, resource_attributes)
|
19
19
|
body = JsonApiSerializer.new(
|
20
20
|
type: :item_type,
|
21
21
|
attributes: %i(api_key name singleton sortable),
|
22
|
-
required_attributes: %i(api_key name singleton sortable)
|
22
|
+
required_attributes: %i(api_key name singleton sortable)
|
23
23
|
).serialize(resource_attributes, item_type_id)
|
24
24
|
|
25
25
|
put_request "/item-types/#{item_type_id}", body
|
26
26
|
end
|
27
27
|
|
28
|
-
def all
|
29
|
-
get_request
|
28
|
+
def all
|
29
|
+
get_request '/item-types'
|
30
30
|
end
|
31
31
|
|
32
32
|
def find(item_type_id)
|
@@ -36,7 +36,6 @@ module Dato
|
|
36
36
|
def destroy(item_type_id)
|
37
37
|
delete_request "/item-types/#{item_type_id}"
|
38
38
|
end
|
39
|
-
|
40
39
|
end
|
41
40
|
end
|
42
41
|
end
|
@@ -1,35 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'dato/site/repo/base'
|
2
3
|
|
3
4
|
module Dato
|
4
5
|
module Site
|
5
6
|
module Repo
|
6
7
|
class MenuItem < Base
|
7
|
-
|
8
8
|
def create(resource_attributes)
|
9
9
|
body = JsonApiSerializer.new(
|
10
10
|
type: :menu_item,
|
11
11
|
attributes: %i(label position),
|
12
|
-
relationships: {:
|
13
|
-
required_attributes: %i(label position)
|
12
|
+
relationships: { item_type: { collection: false, type: :item_type }, parent: { collection: false, type: :menu_item } },
|
13
|
+
required_attributes: %i(label position)
|
14
14
|
).serialize(resource_attributes)
|
15
15
|
|
16
|
-
post_request
|
16
|
+
post_request '/menu-items', body
|
17
17
|
end
|
18
18
|
|
19
19
|
def update(menu_item_id, resource_attributes)
|
20
20
|
body = JsonApiSerializer.new(
|
21
21
|
type: :menu_item,
|
22
22
|
attributes: %i(label position),
|
23
|
-
relationships: {:
|
23
|
+
relationships: { item_type: { collection: false, type: :item_type }, parent: { collection: false, type: :menu_item } },
|
24
24
|
required_attributes: %i(label position),
|
25
|
-
required_relationships: %i(item_type)
|
25
|
+
required_relationships: %i(item_type)
|
26
26
|
).serialize(resource_attributes, menu_item_id)
|
27
27
|
|
28
28
|
put_request "/menu-items/#{menu_item_id}", body
|
29
29
|
end
|
30
30
|
|
31
|
-
def all
|
32
|
-
get_request
|
31
|
+
def all
|
32
|
+
get_request '/menu-items'
|
33
33
|
end
|
34
34
|
|
35
35
|
def find(menu_item_id)
|
@@ -39,7 +39,6 @@ module Dato
|
|
39
39
|
def destroy(menu_item_id)
|
40
40
|
delete_request "/menu-items/#{menu_item_id}"
|
41
41
|
end
|
42
|
-
|
43
42
|
end
|
44
43
|
end
|
45
44
|
end
|
data/lib/dato/site/repo/site.rb
CHANGED
@@ -1,23 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'dato/site/repo/base'
|
2
3
|
|
3
4
|
module Dato
|
4
5
|
module Site
|
5
6
|
module Repo
|
6
7
|
class Site < Base
|
7
|
-
|
8
|
-
|
9
|
-
get_request "/site"
|
8
|
+
def find
|
9
|
+
get_request '/site'
|
10
10
|
end
|
11
11
|
|
12
12
|
def update(resource_attributes)
|
13
13
|
body = JsonApiSerializer.new(
|
14
14
|
type: :site,
|
15
|
-
attributes: %i(deploy_adapter deploy_settings favicon global_seo locales name no_index theme_hue timezone)
|
15
|
+
attributes: %i(deploy_adapter deploy_settings favicon global_seo locales name no_index theme_hue timezone)
|
16
16
|
).serialize(resource_attributes)
|
17
17
|
|
18
|
-
put_request
|
18
|
+
put_request '/site', body
|
19
19
|
end
|
20
|
-
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
@@ -1,19 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'dato/site/repo/base'
|
2
3
|
|
3
4
|
module Dato
|
4
5
|
module Site
|
5
6
|
module Repo
|
6
7
|
class UploadRequest < Base
|
7
|
-
|
8
8
|
def create(resource_attributes)
|
9
9
|
body = JsonApiSerializer.new(
|
10
10
|
type: :upload_request,
|
11
|
-
attributes: %i(filename)
|
11
|
+
attributes: %i(filename)
|
12
12
|
).serialize(resource_attributes)
|
13
13
|
|
14
|
-
post_request
|
14
|
+
post_request '/upload-requests', body
|
15
15
|
end
|
16
|
-
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
data/lib/dato/site/repo/user.rb
CHANGED
@@ -1,31 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'dato/site/repo/base'
|
2
3
|
|
3
4
|
module Dato
|
4
5
|
module Site
|
5
6
|
module Repo
|
6
7
|
class User < Base
|
7
|
-
|
8
8
|
def create(resource_attributes)
|
9
9
|
body = JsonApiSerializer.new(
|
10
10
|
type: :user,
|
11
11
|
attributes: %i(email first_name is_admin last_name),
|
12
|
-
required_attributes: %i(email first_name last_name)
|
12
|
+
required_attributes: %i(email first_name last_name)
|
13
13
|
).serialize(resource_attributes)
|
14
14
|
|
15
|
-
post_request
|
15
|
+
post_request '/users', body
|
16
16
|
end
|
17
17
|
|
18
18
|
def update(user_id, resource_attributes)
|
19
19
|
body = JsonApiSerializer.new(
|
20
20
|
type: :user,
|
21
|
-
attributes: %i(email first_name is_admin last_name password)
|
21
|
+
attributes: %i(email first_name is_admin last_name password)
|
22
22
|
).serialize(resource_attributes, user_id)
|
23
23
|
|
24
24
|
put_request "/users/#{user_id}", body
|
25
25
|
end
|
26
26
|
|
27
|
-
def all
|
28
|
-
get_request
|
27
|
+
def all
|
28
|
+
get_request '/users'
|
29
29
|
end
|
30
30
|
|
31
31
|
def find(user_id)
|
@@ -36,16 +36,15 @@ module Dato
|
|
36
36
|
body = JsonApiSerializer.new(
|
37
37
|
type: :user,
|
38
38
|
attributes: %i(email),
|
39
|
-
required_attributes: %i(email)
|
39
|
+
required_attributes: %i(email)
|
40
40
|
).serialize(resource_attributes)
|
41
41
|
|
42
|
-
post_request
|
42
|
+
post_request '/users/reset_password', body
|
43
43
|
end
|
44
44
|
|
45
45
|
def destroy(user_id)
|
46
46
|
delete_request "/users/#{user_id}"
|
47
47
|
end
|
48
|
-
|
49
48
|
end
|
50
49
|
end
|
51
50
|
end
|