middleman-dato 0.0.1.rc12 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +7 -0
- data/.rspec +2 -0
- data/.rubocop.yml +9 -1070
- data/Gemfile +8 -8
- data/Rakefile +14 -5
- data/foo.rb +12 -0
- data/lib/dato/client.rb +14 -9
- data/lib/dato/entities_repo.rb +43 -0
- data/lib/dato/field_type/boolean.rb +9 -0
- data/lib/dato/field_type/date.rb +9 -0
- data/lib/dato/field_type/date_time.rb +9 -0
- data/lib/dato/field_type/file.rb +30 -0
- data/lib/dato/field_type/float.rb +9 -0
- data/lib/dato/field_type/image.rb +23 -0
- data/lib/dato/field_type/integer.rb +9 -0
- data/lib/dato/field_type/lat_lon.rb +16 -0
- data/lib/dato/field_type/link.rb +9 -0
- data/lib/dato/field_type/links.rb +9 -0
- data/lib/dato/field_type/seo.rb +21 -0
- data/lib/dato/field_type/string.rb +9 -0
- data/lib/dato/field_type/text.rb +9 -0
- data/lib/dato/field_type/video.rb +48 -0
- data/lib/dato/json_api_entity.rb +75 -0
- data/lib/dato/meta_tags/article_modified_time.rb +3 -3
- data/lib/dato/meta_tags/article_publisher.rb +3 -3
- data/lib/dato/meta_tags/base.rb +12 -19
- data/lib/dato/meta_tags/description.rb +4 -4
- data/lib/dato/meta_tags/image.rb +5 -8
- data/lib/dato/meta_tags/og_locale.rb +2 -2
- data/lib/dato/meta_tags/og_meta_tag.rb +2 -4
- data/lib/dato/meta_tags/og_site_name.rb +2 -2
- data/lib/dato/meta_tags/og_type.rb +5 -5
- data/lib/dato/meta_tags/robots.rb +2 -4
- data/lib/dato/meta_tags/title.rb +5 -4
- data/lib/dato/meta_tags/twitter_card.rb +3 -3
- data/lib/dato/meta_tags/twitter_meta_tag.rb +2 -4
- data/lib/dato/meta_tags/twitter_site.rb +2 -2
- data/lib/dato/meta_tags/url.rb +4 -4
- data/lib/dato/meta_tags_builder.rb +13 -13
- data/lib/dato/middleman_extension.rb +15 -23
- data/lib/dato/record.rb +77 -46
- data/lib/dato/records_repo.rb +106 -0
- data/lib/dato/space.rb +36 -0
- data/lib/middleman-dato.rb +5 -2
- data/middleman-dato.gemspec +14 -13
- data/spec/dato/entities_repo_spec.rb +41 -0
- data/spec/dato/field_type/file_spec.rb +20 -0
- data/spec/dato/field_type/image_spec.rb +24 -0
- data/spec/dato/field_type/lat_lon_spec.rb +18 -0
- data/spec/dato/field_type/seo_spec.rb +31 -0
- data/spec/dato/field_type/video_spec.rb +32 -0
- data/spec/dato/json_api_entity_spec.rb +123 -0
- data/spec/dato/meta_tags/article_modified_time_spec.rb +16 -14
- data/spec/dato/meta_tags/image_spec.rb +39 -0
- data/spec/dato/meta_tags/og_locale_spec.rb +14 -12
- data/spec/dato/record_spec.rb +137 -78
- data/spec/dato/records_repo_spec.rb +125 -0
- data/spec/spec_helper.rb +14 -12
- metadata +58 -13
- data/lib/dato/field.rb +0 -43
- data/lib/dato/fields/belongs_to.rb +0 -21
- data/lib/dato/fields/file.rb +0 -22
- data/lib/dato/fields/seo.rb +0 -37
- data/lib/dato/repo.rb +0 -111
- data/lib/middleman_extension.rb +0 -1
- data/spec/dato/field_spec.rb +0 -110
data/Gemfile
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
# If you do not have OpenSSL installed, update
|
2
2
|
# the following line to use "http://" instead
|
3
|
-
source
|
3
|
+
source 'https://rubygems.org'
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in middleman-dato.gemspec
|
6
6
|
gemspec
|
7
7
|
|
8
|
-
gem
|
9
|
-
gem "rubocop-rspec"
|
8
|
+
gem 'rubocop'
|
10
9
|
|
11
10
|
group :development do
|
12
|
-
gem
|
13
|
-
gem
|
14
|
-
gem
|
11
|
+
gem 'rake'
|
12
|
+
gem 'rdoc'
|
13
|
+
gem 'yard'
|
14
|
+
gem 'pry'
|
15
15
|
end
|
16
16
|
|
17
17
|
group :test do
|
18
|
-
gem
|
19
|
-
gem
|
18
|
+
gem 'rspec'
|
19
|
+
gem 'simplecov', require: false
|
20
20
|
end
|
data/Rakefile
CHANGED
@@ -1,12 +1,21 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler'
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
3
|
|
4
|
-
require
|
4
|
+
require 'rspec/core/rake_task'
|
5
5
|
RSpec::Core::RakeTask.new(:spec)
|
6
6
|
|
7
|
-
require
|
8
|
-
RuboCop::RakeTask.new
|
9
|
-
|
7
|
+
require 'rubocop/rake_task'
|
8
|
+
RuboCop::RakeTask.new
|
9
|
+
|
10
|
+
desc 'Open an irb (or pry) session preloaded with this gem'
|
11
|
+
task :console do
|
12
|
+
begin
|
13
|
+
require 'pry'
|
14
|
+
gem_name = File.basename(Dir.pwd)
|
15
|
+
sh %(pry -I lib -r #{gem_name}.rb)
|
16
|
+
rescue LoadError => _
|
17
|
+
sh %(irb -rubygems -I lib -r #{gem_name}.rb)
|
18
|
+
end
|
10
19
|
end
|
11
20
|
|
12
21
|
task default: :spec
|
data/foo.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
space = Dato::Space.new(
|
2
|
+
domain: 'admin.cucistorie.it',
|
3
|
+
api_host: 'http://127.0.0.1:3001',
|
4
|
+
token: 'xZqr1G8vRFOMnLe9ofn7w4Yr590SKhxjZ46v4tw1WXc'
|
5
|
+
)
|
6
|
+
|
7
|
+
space.refresh!
|
8
|
+
puts space.records_repo.creations.size
|
9
|
+
puts space.records_repo.creations.first.attributes.inspect
|
10
|
+
puts space.records_repo.creations.first.name
|
11
|
+
puts space.records_repo.creations.first.slug
|
12
|
+
puts space.records_repo.creations.first.cover_image.file.to_url
|
data/lib/dato/client.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
require 'json'
|
4
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
4
5
|
|
5
6
|
module Dato
|
6
7
|
class Client
|
@@ -11,11 +12,15 @@ module Dato
|
|
11
12
|
end
|
12
13
|
|
13
14
|
def space
|
14
|
-
|
15
|
+
include = [
|
16
|
+
'content_types',
|
17
|
+
'content_types.fields'
|
18
|
+
]
|
19
|
+
get('space', include: include).body.with_indifferent_access
|
15
20
|
end
|
16
21
|
|
17
22
|
def records
|
18
|
-
get(
|
23
|
+
get('records', 'page[limit]' => 10_000).body.with_indifferent_access
|
19
24
|
end
|
20
25
|
|
21
26
|
def get(*args)
|
@@ -30,10 +35,10 @@ module Dato
|
|
30
35
|
options = {
|
31
36
|
url: @host,
|
32
37
|
headers: {
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
'Content-Type' => 'application/json',
|
39
|
+
'Accept' => 'application/json',
|
40
|
+
'X-Space-Domain' => @domain,
|
41
|
+
'Authorization' => "Api-Key #{@token}"
|
37
42
|
}
|
38
43
|
}
|
39
44
|
@connection ||= Faraday.new(options) do |c|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'dato/json_api_entity'
|
2
|
+
|
3
|
+
module Dato
|
4
|
+
class EntitiesRepo
|
5
|
+
attr_reader :entities
|
6
|
+
|
7
|
+
def initialize(*payloads)
|
8
|
+
@entities = {}
|
9
|
+
|
10
|
+
payloads.each do |payload|
|
11
|
+
EntitiesRepo.payload_entities(payload).each do |entity_payload|
|
12
|
+
object = JsonApiEntity.new(entity_payload, self)
|
13
|
+
@entities[object.type] ||= {}
|
14
|
+
@entities[object.type][object.id] = object
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def find_entities_of_type(type)
|
20
|
+
entities.fetch(type, {}).values
|
21
|
+
end
|
22
|
+
|
23
|
+
def find_entity(type, id)
|
24
|
+
entities.fetch(type, {}).fetch(id, nil)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.payload_entities(payload)
|
28
|
+
acc = []
|
29
|
+
|
30
|
+
if payload[:data]
|
31
|
+
acc = if payload[:data].is_a? Array
|
32
|
+
acc + payload[:data]
|
33
|
+
else
|
34
|
+
acc + [payload[:data]]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
acc += payload[:included] if payload[:included]
|
39
|
+
|
40
|
+
acc
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'imgix'
|
2
|
+
|
3
|
+
module Dato
|
4
|
+
module FieldType
|
5
|
+
class File
|
6
|
+
attr_reader :path, :format, :size
|
7
|
+
|
8
|
+
def self.parse(value, _repo)
|
9
|
+
new(
|
10
|
+
value[:path],
|
11
|
+
value[:format],
|
12
|
+
value[:size]
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(path, format, size)
|
17
|
+
@path = path
|
18
|
+
@format = format
|
19
|
+
@size = size
|
20
|
+
end
|
21
|
+
|
22
|
+
def file
|
23
|
+
@file ||= Imgix::Client.new(
|
24
|
+
host: 'dato-images.imgix.net',
|
25
|
+
secure: true
|
26
|
+
).path(path).ch("DPR", "Width").auto("compress", "format")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Dato
|
2
|
+
module FieldType
|
3
|
+
class Image < Dato::FieldType::File
|
4
|
+
attr_reader :width, :height
|
5
|
+
|
6
|
+
def self.parse(value, _repo)
|
7
|
+
new(
|
8
|
+
value[:path],
|
9
|
+
value[:format],
|
10
|
+
value[:size],
|
11
|
+
value[:width],
|
12
|
+
value[:height]
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(path, format, size, width, height)
|
17
|
+
super(path, format, size)
|
18
|
+
@width = width
|
19
|
+
@height = height
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Dato
|
2
|
+
module FieldType
|
3
|
+
class LatLon
|
4
|
+
attr_reader :latitude, :longitude
|
5
|
+
|
6
|
+
def self.parse(value, _repo)
|
7
|
+
new(value[:latitude], value[:longitude])
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(latitude, longitude)
|
11
|
+
@latitude = latitude
|
12
|
+
@longitude = longitude
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Dato
|
2
|
+
module FieldType
|
3
|
+
class Seo
|
4
|
+
attr_reader :title, :description
|
5
|
+
|
6
|
+
def self.parse(value, _repo)
|
7
|
+
new(value[:title], value[:description], value[:image])
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(title, description, image)
|
11
|
+
@title = title
|
12
|
+
@description = description
|
13
|
+
@image = image
|
14
|
+
end
|
15
|
+
|
16
|
+
def image
|
17
|
+
@image && Image.parse(@image, nil)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'active_support/core_ext/hash/compact'
|
2
|
+
require 'video_embed'
|
3
|
+
|
4
|
+
module Dato
|
5
|
+
module FieldType
|
6
|
+
class Video
|
7
|
+
def self.parse(value, _repo)
|
8
|
+
new(value)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(attributes)
|
12
|
+
@attributes = attributes
|
13
|
+
end
|
14
|
+
|
15
|
+
def url
|
16
|
+
@attributes[:url]
|
17
|
+
end
|
18
|
+
|
19
|
+
def thumbnail_url
|
20
|
+
@attributes[:thumbnail_url]
|
21
|
+
end
|
22
|
+
|
23
|
+
def title
|
24
|
+
@attributes[:title]
|
25
|
+
end
|
26
|
+
|
27
|
+
def width
|
28
|
+
@attributes[:width]
|
29
|
+
end
|
30
|
+
|
31
|
+
def height
|
32
|
+
@attributes[:height]
|
33
|
+
end
|
34
|
+
|
35
|
+
def provider
|
36
|
+
@attributes[:provider]
|
37
|
+
end
|
38
|
+
|
39
|
+
def provider_url
|
40
|
+
@attributes[:provider_url]
|
41
|
+
end
|
42
|
+
|
43
|
+
def iframe_embed(width = nil, height = nil)
|
44
|
+
VideoEmbed.embed(url, { width: width, height: height }.compact)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Dato
|
2
|
+
class JsonApiEntity
|
3
|
+
attr_reader :payload, :data_source
|
4
|
+
|
5
|
+
def initialize(payload, data_source)
|
6
|
+
@payload = payload
|
7
|
+
@data_source = data_source
|
8
|
+
end
|
9
|
+
|
10
|
+
def id
|
11
|
+
@payload[:id]
|
12
|
+
end
|
13
|
+
|
14
|
+
def type
|
15
|
+
@payload[:type]
|
16
|
+
end
|
17
|
+
|
18
|
+
def ==(other)
|
19
|
+
if other.is_a? JsonApiEntity
|
20
|
+
id == other.id && type == other.type
|
21
|
+
else
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
"#<JsonApiEntity id=#{id} type=#{type} payload=#{payload}>"
|
28
|
+
end
|
29
|
+
alias inspect to_s
|
30
|
+
|
31
|
+
def [](key)
|
32
|
+
attributes[key]
|
33
|
+
end
|
34
|
+
|
35
|
+
def respond_to?(method, include_private = false)
|
36
|
+
if attributes.key?(method) || relationships.key?(method)
|
37
|
+
true
|
38
|
+
else
|
39
|
+
super
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def attributes
|
46
|
+
@payload.fetch(:attributes, {})
|
47
|
+
end
|
48
|
+
|
49
|
+
def relationships
|
50
|
+
@payload.fetch(:relationships, {})
|
51
|
+
end
|
52
|
+
|
53
|
+
def dereference_linkage(linkage)
|
54
|
+
if linkage.is_a? Array
|
55
|
+
linkage.map do |item|
|
56
|
+
data_source.find_entity(item[:type], item[:id])
|
57
|
+
end
|
58
|
+
else
|
59
|
+
data_source.find_entity(linkage[:type], linkage[:id])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def method_missing(method, *arguments, &block)
|
64
|
+
return super unless arguments.empty?
|
65
|
+
|
66
|
+
if attributes.key?(method)
|
67
|
+
attributes[method]
|
68
|
+
elsif relationships.key?(method)
|
69
|
+
dereference_linkage(relationships[method][:data])
|
70
|
+
else
|
71
|
+
super
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|