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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8281ddd92777978a05824eeb518a05811ae762d4
|
4
|
+
data.tar.gz: 23f0dab9c01750089eb400879034f44cfdced2bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35bf49bfe358c1f1975e3cafd6a35038372fa398d7ff9d3e41fec91e32d038050e21ebcec2921b41c08f0e67e4c78d9c650253af7f495910c2b5c73e62e8eae9
|
7
|
+
data.tar.gz: 193ce665fb9027bdff18ee3147df90e0b5159117bf676a65ecdd9e11cf6d97b940f9ade791ab6be38f26d0d72903221256ab4b94b55d884bd8483ca2247d6089
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.3
|
3
|
+
|
4
|
+
Style/Documentation:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Metrics/MethodLength:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
Metrics/ClassLength:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Metrics/ModuleLength:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Metrics/AbcSize:
|
17
|
+
Max: 18
|
18
|
+
|
19
|
+
Metrics/LineLength:
|
20
|
+
Exclude:
|
21
|
+
- "spec/**/*"
|
22
|
+
- "lib/dato/site/repo/*"
|
23
|
+
- "lib/dato/account/repo/*"
|
24
|
+
- "dato.gemspec"
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,23 +1,39 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require 'open-uri'
|
4
5
|
|
5
|
-
require_relative
|
6
|
+
require_relative './build/build_client'
|
6
7
|
|
7
8
|
RSpec::Core::RakeTask.new(:spec)
|
8
9
|
|
9
|
-
task :
|
10
|
+
task default: :spec
|
10
11
|
|
12
|
+
desc 'Regenerates the client starting from the JSON Hyperschema'
|
11
13
|
task :build_repos do
|
12
14
|
BuildClient.new(
|
13
|
-
open(
|
14
|
-
|
15
|
+
open('https://site-api.datocms.com/docs/site-api-hyperschema.json').read,
|
16
|
+
'site',
|
15
17
|
%w(session item)
|
16
18
|
).build
|
17
19
|
|
18
20
|
BuildClient.new(
|
19
|
-
open(
|
20
|
-
|
21
|
+
open('https://site-api.datocms.com/docs/account-api-hyperschema.json').read,
|
22
|
+
'account',
|
21
23
|
%w(session item)
|
22
24
|
).build
|
23
25
|
end
|
26
|
+
|
27
|
+
desc 'Open an irb (or pry) session preloaded with this gem'
|
28
|
+
task :console do
|
29
|
+
begin
|
30
|
+
require 'pry'
|
31
|
+
gem_name = File.basename(Dir.pwd)
|
32
|
+
sh %(pry -I lib -r #{gem_name}.rb)
|
33
|
+
rescue LoadError => _
|
34
|
+
sh %(irb -rubygems -I lib -r #{gem_name}.rb)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
require 'rubocop/rake_task'
|
39
|
+
RuboCop::RakeTask.new
|
data/bin/console
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require
|
4
|
-
require
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'dato'
|
5
6
|
|
6
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
8
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +11,5 @@ require "dato"
|
|
10
11
|
# require "pry"
|
11
12
|
# Pry.start
|
12
13
|
|
13
|
-
require
|
14
|
+
require 'irb'
|
14
15
|
IRB.start
|
data/dato.gemspec
CHANGED
@@ -1,37 +1,42 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
lib = File.expand_path('../lib', __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'dato/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'dato'
|
8
9
|
spec.version = Dato::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
10
|
+
spec.authors = ['Stefano Verna']
|
11
|
+
spec.email = ['s.verna@cantierecreativo.net']
|
11
12
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
13
|
+
spec.summary = 'Ruby client for DatoCMS API'
|
14
|
+
spec.description = 'Ruby client for DatoCMS API'
|
15
|
+
spec.homepage = 'https://github.com/datocms/ruby-datocms-client'
|
16
|
+
spec.license = 'MIT'
|
16
17
|
|
17
18
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|build|spec|features)/}) }
|
18
|
-
spec.bindir =
|
19
|
+
spec.bindir = 'exe'
|
19
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
21
|
+
spec.require_paths = ['lib']
|
21
22
|
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.11'
|
24
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
25
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
26
|
+
spec.add_development_dependency 'rubyzip'
|
27
|
+
spec.add_development_dependency 'json_schema'
|
28
|
+
spec.add_development_dependency 'simplecov'
|
29
|
+
spec.add_development_dependency 'vcr'
|
30
|
+
spec.add_development_dependency 'webmock'
|
31
|
+
spec.add_development_dependency 'rubocop'
|
30
32
|
|
31
|
-
spec.add_runtime_dependency
|
32
|
-
spec.add_runtime_dependency
|
33
|
-
spec.add_runtime_dependency
|
34
|
-
spec.add_runtime_dependency
|
35
|
-
spec.add_runtime_dependency
|
36
|
-
spec.add_runtime_dependency
|
33
|
+
spec.add_runtime_dependency 'faraday', ['>= 0.9.0']
|
34
|
+
spec.add_runtime_dependency 'faraday_middleware', ['>= 0.9.0']
|
35
|
+
spec.add_runtime_dependency 'activesupport'
|
36
|
+
spec.add_runtime_dependency 'fastimage'
|
37
|
+
spec.add_runtime_dependency 'downloadr'
|
38
|
+
spec.add_runtime_dependency 'addressable'
|
39
|
+
spec.add_runtime_dependency('imgix', ['>= 0.3.1'])
|
40
|
+
spec.add_runtime_dependency('video_embed')
|
41
|
+
spec.add_runtime_dependency('semantic')
|
37
42
|
end
|
data/lib/dato.rb
CHANGED
data/lib/dato/account/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'
|
@@ -12,8 +13,8 @@ module Dato
|
|
12
13
|
class Client
|
13
14
|
REPOS = {
|
14
15
|
account: Repo::Account,
|
15
|
-
sites: Repo::Site
|
16
|
-
}
|
16
|
+
sites: Repo::Site
|
17
|
+
}.freeze
|
17
18
|
|
18
19
|
attr_reader :token, :base_url, :schema
|
19
20
|
|
@@ -35,7 +36,7 @@ module Dato
|
|
35
36
|
def request(*args)
|
36
37
|
connection.send(*args).body.with_indifferent_access
|
37
38
|
rescue Faraday::ClientError => e
|
38
|
-
raise ApiError
|
39
|
+
raise ApiError, e
|
39
40
|
end
|
40
41
|
|
41
42
|
private
|
@@ -44,8 +45,8 @@ module Dato
|
|
44
45
|
options = {
|
45
46
|
url: base_url,
|
46
47
|
headers: {
|
47
|
-
'Accept' =>
|
48
|
-
'Content-Type' =>
|
48
|
+
'Accept' => 'application/json',
|
49
|
+
'Content-Type' => 'application/json',
|
49
50
|
'Authorization' => "Bearer #{@token}"
|
50
51
|
}
|
51
52
|
}
|
@@ -1,43 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'dato/account/repo/base'
|
2
3
|
|
3
4
|
module Dato
|
4
5
|
module Account
|
5
6
|
module Repo
|
6
7
|
class Account < Base
|
7
|
-
|
8
8
|
def create(resource_attributes)
|
9
9
|
body = JsonApiSerializer.new(
|
10
10
|
type: :account,
|
11
11
|
attributes: %i(email password),
|
12
|
-
required_attributes: %i(email password)
|
12
|
+
required_attributes: %i(email password)
|
13
13
|
).serialize(resource_attributes)
|
14
14
|
|
15
|
-
post_request
|
15
|
+
post_request '/account', body
|
16
16
|
end
|
17
17
|
|
18
18
|
def update(resource_attributes)
|
19
19
|
body = JsonApiSerializer.new(
|
20
20
|
type: :account,
|
21
|
-
attributes: %i(email password)
|
21
|
+
attributes: %i(email password)
|
22
22
|
).serialize(resource_attributes)
|
23
23
|
|
24
|
-
put_request
|
24
|
+
put_request '/account', body
|
25
25
|
end
|
26
26
|
|
27
|
-
def find
|
28
|
-
get_request
|
27
|
+
def find
|
28
|
+
get_request '/account'
|
29
29
|
end
|
30
30
|
|
31
31
|
def reset_password(resource_attributes)
|
32
32
|
body = JsonApiSerializer.new(
|
33
33
|
type: :account,
|
34
34
|
attributes: %i(email),
|
35
|
-
required_attributes: %i(email)
|
35
|
+
required_attributes: %i(email)
|
36
36
|
).serialize(resource_attributes)
|
37
37
|
|
38
|
-
post_request
|
38
|
+
post_request '/account/reset_password', body
|
39
39
|
end
|
40
|
-
|
41
40
|
end
|
42
41
|
end
|
43
42
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
|
2
|
-
require
|
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 Account
|
@@ -24,4 +25,3 @@ module Dato
|
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
27
|
-
|
@@ -1,31 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'dato/account/repo/base'
|
2
3
|
|
3
4
|
module Dato
|
4
5
|
module Account
|
5
6
|
module Repo
|
6
7
|
class Site < Base
|
7
|
-
|
8
8
|
def find(site_id)
|
9
9
|
get_request "/sites/#{site_id}"
|
10
10
|
end
|
11
11
|
|
12
|
-
def all
|
13
|
-
get_request
|
12
|
+
def all
|
13
|
+
get_request '/sites'
|
14
14
|
end
|
15
15
|
|
16
16
|
def create(resource_attributes)
|
17
17
|
body = JsonApiSerializer.new(
|
18
18
|
type: :site,
|
19
|
-
attributes: %i(domain name notes template)
|
19
|
+
attributes: %i(domain name notes template)
|
20
20
|
).serialize(resource_attributes)
|
21
21
|
|
22
|
-
post_request
|
22
|
+
post_request '/sites', body
|
23
23
|
end
|
24
24
|
|
25
25
|
def update(site_id, resource_attributes)
|
26
26
|
body = JsonApiSerializer.new(
|
27
27
|
type: :site,
|
28
|
-
attributes: %i(domain name notes)
|
28
|
+
attributes: %i(domain name notes)
|
29
29
|
).serialize(resource_attributes, site_id)
|
30
30
|
|
31
31
|
put_request "/sites/#{site_id}", body
|
@@ -38,12 +38,11 @@ module Dato
|
|
38
38
|
def duplicate(site_id, resource_attributes)
|
39
39
|
body = JsonApiSerializer.new(
|
40
40
|
type: :site,
|
41
|
-
attributes: %i(name)
|
41
|
+
attributes: %i(name)
|
42
42
|
).serialize(resource_attributes)
|
43
43
|
|
44
44
|
post_request "/sites/#{site_id}/duplicate", body
|
45
45
|
end
|
46
|
-
|
47
46
|
end
|
48
47
|
end
|
49
48
|
end
|
data/lib/dato/api_error.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Dato
|
2
3
|
class ApiError < StandardError
|
3
4
|
attr_reader :faraday_error
|
@@ -8,9 +9,9 @@ module Dato
|
|
8
9
|
|
9
10
|
def message
|
10
11
|
[
|
11
|
-
|
12
|
+
'DatoCMS API Error',
|
12
13
|
"Status: #{faraday_error.response[:status]}",
|
13
|
-
|
14
|
+
'Response:',
|
14
15
|
JSON.pretty_generate(JSON.load(faraday_error.response[:body]))
|
15
16
|
].join("\n")
|
16
17
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Dato
|
2
3
|
class JsonApiDeserializer
|
3
4
|
def deserialize(data)
|
@@ -17,14 +18,12 @@ module Dato
|
|
17
18
|
relationships = data.delete(:relationships)
|
18
19
|
|
19
20
|
if relationships
|
20
|
-
relationships.each do |key,
|
21
|
-
|
22
|
-
value = if
|
23
|
-
|
24
|
-
elsif
|
25
|
-
|
26
|
-
else
|
27
|
-
nil
|
21
|
+
relationships.each do |key, handle|
|
22
|
+
handle_data = handle['data']
|
23
|
+
value = if handle_data.is_a? Array
|
24
|
+
handle_data.map { |ref| ref['id'] }
|
25
|
+
elsif handle_data.is_a? Hash
|
26
|
+
handle_data[:id]
|
28
27
|
end
|
29
28
|
result[key] = value
|
30
29
|
end
|
@@ -34,4 +33,3 @@ module Dato
|
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
37
|
-
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Dato
|
2
3
|
class JsonApiSerializer
|
3
4
|
attr_reader :type, :attributes, :relationships
|
@@ -21,9 +22,7 @@ module Dato
|
|
21
22
|
resource = resource.with_indifferent_access
|
22
23
|
data = {}
|
23
24
|
|
24
|
-
if id || resource[:id]
|
25
|
-
data[:id] = id || resource[:id]
|
26
|
-
end
|
25
|
+
data[:id] = id || resource[:id] if id || resource[:id]
|
27
26
|
|
28
27
|
data[:type] = type
|
29
28
|
data[:attributes] = serialized_attributes(resource)
|
@@ -39,7 +38,7 @@ module Dato
|
|
39
38
|
result = {}
|
40
39
|
|
41
40
|
attributes.each do |attribute|
|
42
|
-
if resource.
|
41
|
+
if resource.key? attribute
|
43
42
|
result[attribute] = resource[attribute]
|
44
43
|
elsif required_attributes.include? attribute
|
45
44
|
throw "Required attribute: #{attribute}"
|
@@ -53,7 +52,7 @@ module Dato
|
|
53
52
|
result = {}
|
54
53
|
|
55
54
|
relationships.each do |relationship, meta|
|
56
|
-
if resource.
|
55
|
+
if resource.key? relationship
|
57
56
|
value = resource[relationship]
|
58
57
|
|
59
58
|
data = if value
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'dato/local/json_api_entity'
|
3
|
+
|
4
|
+
module Dato
|
5
|
+
module Local
|
6
|
+
class EntitiesRepo
|
7
|
+
attr_reader :entities
|
8
|
+
|
9
|
+
def initialize(*payloads)
|
10
|
+
@entities = {}
|
11
|
+
|
12
|
+
payloads.each do |payload|
|
13
|
+
EntitiesRepo.payload_entities(payload).each do |entity_payload|
|
14
|
+
object = JsonApiEntity.new(entity_payload, self)
|
15
|
+
@entities[object.type] ||= {}
|
16
|
+
@entities[object.type][object.id] = object
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_entities_of_type(type)
|
22
|
+
entities.fetch(type, {}).values
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_entity(type, id)
|
26
|
+
entities.fetch(type, {}).fetch(id, nil)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.payload_entities(payload)
|
30
|
+
acc = []
|
31
|
+
|
32
|
+
if payload[:data]
|
33
|
+
acc = if payload[:data].is_a? Array
|
34
|
+
acc + payload[:data]
|
35
|
+
else
|
36
|
+
acc + [payload[:data]]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
acc += payload[:included] if payload[:included]
|
41
|
+
|
42
|
+
acc
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|