dato 0.1.5 → 0.1.6
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/.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
|