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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +24 -0
  3. data/Gemfile +1 -0
  4. data/Rakefile +25 -9
  5. data/bin/console +4 -3
  6. data/dato.gemspec +28 -23
  7. data/lib/dato.rb +5 -3
  8. data/lib/dato/account/client.rb +6 -5
  9. data/lib/dato/account/repo/account.rb +9 -10
  10. data/lib/dato/account/repo/base.rb +3 -3
  11. data/lib/dato/account/repo/site.rb +7 -8
  12. data/lib/dato/api_error.rb +3 -2
  13. data/lib/dato/json_api_deserializer.rb +7 -9
  14. data/lib/dato/json_api_serializer.rb +4 -5
  15. data/lib/dato/local/entities_repo.rb +46 -0
  16. data/lib/dato/local/field_type/boolean.rb +12 -0
  17. data/lib/dato/local/field_type/date.rb +12 -0
  18. data/lib/dato/local/field_type/date_time.rb +12 -0
  19. data/lib/dato/local/field_type/file.rb +33 -0
  20. data/lib/dato/local/field_type/float.rb +12 -0
  21. data/lib/dato/local/field_type/image.rb +32 -0
  22. data/lib/dato/local/field_type/integer.rb +12 -0
  23. data/lib/dato/local/field_type/lat_lon.rb +23 -0
  24. data/lib/dato/local/field_type/link.rb +12 -0
  25. data/lib/dato/local/field_type/links.rb +12 -0
  26. data/lib/dato/local/field_type/seo.rb +24 -0
  27. data/lib/dato/local/field_type/string.rb +12 -0
  28. data/lib/dato/local/field_type/text.rb +12 -0
  29. data/lib/dato/local/field_type/video.rb +55 -0
  30. data/lib/dato/local/item.rb +121 -0
  31. data/lib/dato/local/items_repo.rb +110 -0
  32. data/lib/dato/local/json_api_entity.rb +78 -0
  33. data/lib/dato/local/site.rb +57 -0
  34. data/lib/dato/site/client.rb +6 -5
  35. data/lib/dato/site/repo/base.rb +3 -2
  36. data/lib/dato/site/repo/field.rb +3 -4
  37. data/lib/dato/site/repo/item.rb +6 -7
  38. data/lib/dato/site/repo/item_type.rb +6 -7
  39. data/lib/dato/site/repo/menu_item.rb +8 -9
  40. data/lib/dato/site/repo/site.rb +5 -6
  41. data/lib/dato/site/repo/upload_request.rb +3 -4
  42. data/lib/dato/site/repo/user.rb +8 -9
  43. data/lib/dato/upload/file.rb +6 -5
  44. data/lib/dato/upload/image.rb +3 -3
  45. data/lib/dato/version.rb +2 -1
  46. 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
@@ -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.new(e)
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' => "application/json",
71
- 'Content-Type' => "application/json",
71
+ 'Accept' => 'application/json',
72
+ 'Content-Type' => 'application/json',
72
73
  'Authorization' => "Bearer #{@token}"
73
74
  }
74
75
  }
@@ -1,5 +1,6 @@
1
- require "dato/json_api_serializer"
2
- require "dato/json_api_deserializer"
1
+ # frozen_string_literal: true
2
+ require 'dato/json_api_serializer'
3
+ require 'dato/json_api_deserializer'
3
4
 
4
5
  module Dato
5
6
  module Site
@@ -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
@@ -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: "item_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 "/items", body
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 "/items", filters
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 "/item-types", body
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 "/item-types"
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: {:item_type=>{:collection=>false, :type=>:item_type}, :parent=>{:collection=>false, :type=>:menu_item}},
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 "/menu-items", body
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: {:item_type=>{:collection=>false, :type=>:item_type}, :parent=>{:collection=>false, :type=>:menu_item}},
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 "/menu-items"
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
@@ -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
- def find()
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 "/site", body
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 "/upload-requests", body
14
+ post_request '/upload-requests', body
15
15
  end
16
-
17
16
  end
18
17
  end
19
18
  end
@@ -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 "/users", body
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 "/users"
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 "/users/reset_password", body
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