dato 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
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