dato 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +42 -5
- data/.travis.yml +1 -0
- data/Gemfile +1 -1
- data/Rakefile +2 -2
- data/bin/console +3 -3
- data/bin/rspec +6 -6
- data/dato.gemspec +1 -1
- data/exe/dato +3 -3
- data/lib/dato.rb +8 -8
- data/lib/dato/account/client.rb +2 -2
- data/lib/dato/api_client.rb +39 -43
- data/lib/dato/api_error.rb +10 -13
- data/lib/dato/cli.rb +18 -18
- data/lib/dato/dump/dsl/add_to_data_file.rb +1 -1
- data/lib/dato/dump/dsl/create_data_file.rb +1 -1
- data/lib/dato/dump/dsl/create_post.rb +1 -1
- data/lib/dato/dump/dsl/directory.rb +4 -4
- data/lib/dato/dump/dsl/root.rb +7 -7
- data/lib/dato/dump/format.rb +3 -3
- data/lib/dato/dump/format/json.rb +1 -1
- data/lib/dato/dump/format/toml.rb +6 -6
- data/lib/dato/dump/format/yaml.rb +3 -3
- data/lib/dato/dump/operation/add_to_data_file.rb +4 -4
- data/lib/dato/dump/operation/create_data_file.rb +3 -3
- data/lib/dato/dump/operation/create_post.rb +5 -6
- data/lib/dato/dump/operation/directory.rb +1 -1
- data/lib/dato/dump/runner.rb +5 -5
- data/lib/dato/dump/ssg_detector.rb +18 -20
- data/lib/dato/json_api_deserializer.rb +15 -16
- data/lib/dato/json_api_serializer.rb +30 -21
- data/lib/dato/json_schema_relationships.rb +19 -23
- data/lib/dato/json_schema_type.rb +47 -0
- data/lib/dato/local/entities_repo.rb +3 -3
- data/lib/dato/local/field_type/color.rb +11 -7
- data/lib/dato/local/field_type/file.rb +18 -24
- data/lib/dato/local/field_type/gallery.rb +1 -1
- data/lib/dato/local/field_type/global_seo.rb +4 -7
- data/lib/dato/local/field_type/lat_lon.rb +1 -1
- data/lib/dato/local/field_type/seo.rb +1 -1
- data/lib/dato/local/field_type/structured_text.rb +4 -10
- data/lib/dato/local/field_type/theme.rb +2 -2
- data/lib/dato/local/field_type/upload_id.rb +5 -5
- data/lib/dato/local/field_type/video.rb +9 -15
- data/lib/dato/local/item.rb +13 -12
- data/lib/dato/local/items_repo.rb +12 -18
- data/lib/dato/local/json_api_entity.rb +4 -3
- data/lib/dato/local/loader.rb +30 -31
- data/lib/dato/local/site.rb +5 -4
- data/lib/dato/paginator.rb +4 -4
- data/lib/dato/repo.rb +23 -30
- data/lib/dato/site/client.rb +5 -5
- data/lib/dato/upload/create_upload_path.rb +7 -10
- data/lib/dato/upload/file.rb +3 -3
- data/lib/dato/upload/image.rb +1 -1
- data/lib/dato/utils/build_modular_block.rb +4 -4
- data/lib/dato/utils/favicon_tags_builder.rb +10 -10
- data/lib/dato/utils/locale_value.rb +1 -1
- data/lib/dato/utils/meta_tags/article_modified_time.rb +3 -3
- data/lib/dato/utils/meta_tags/article_publisher.rb +2 -2
- data/lib/dato/utils/meta_tags/base.rb +6 -6
- data/lib/dato/utils/meta_tags/description.rb +4 -4
- data/lib/dato/utils/meta_tags/image.rb +4 -5
- data/lib/dato/utils/meta_tags/og_locale.rb +2 -2
- data/lib/dato/utils/meta_tags/og_site_name.rb +2 -2
- data/lib/dato/utils/meta_tags/og_type.rb +3 -3
- data/lib/dato/utils/meta_tags/robots.rb +2 -2
- data/lib/dato/utils/meta_tags/title.rb +6 -6
- data/lib/dato/utils/meta_tags/twitter_card.rb +2 -2
- data/lib/dato/utils/meta_tags/twitter_site.rb +2 -2
- data/lib/dato/utils/seo_tags_builder.rb +12 -12
- data/lib/dato/version.rb +1 -1
- metadata +7 -6
data/lib/dato/repo.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "dato/json_api_serializer"
|
4
|
+
require "dato/json_api_deserializer"
|
5
|
+
require "dato/paginator"
|
6
6
|
|
7
7
|
module Dato
|
8
8
|
class Repo
|
9
9
|
attr_reader :client, :type, :schema
|
10
10
|
|
11
|
-
IDENTITY_REGEXP = /\{\(.*?definitions%2F(.*?)%2Fdefinitions%2Fidentity\)}
|
11
|
+
IDENTITY_REGEXP = /\{\(.*?definitions%2F(.*?)%2Fdefinitions%2Fidentity\)}/.freeze
|
12
12
|
|
13
13
|
METHOD_NAMES = {
|
14
|
-
|
15
|
-
|
14
|
+
"instances" => :all,
|
15
|
+
"self" => :find,
|
16
16
|
}.freeze
|
17
17
|
|
18
18
|
def initialize(client, type, schema)
|
@@ -32,23 +32,23 @@ module Dato
|
|
32
32
|
private
|
33
33
|
|
34
34
|
def method_missing(method, *args, &block)
|
35
|
-
link = schema.links.find do |
|
36
|
-
METHOD_NAMES.fetch(
|
35
|
+
link = schema.links.find do |ilink|
|
36
|
+
METHOD_NAMES.fetch(ilink.rel, ilink.rel).to_sym == method.to_sym
|
37
37
|
end
|
38
38
|
|
39
|
-
return super
|
39
|
+
return super unless link
|
40
40
|
|
41
41
|
min_arguments_count = [
|
42
42
|
link.href.scan(IDENTITY_REGEXP).size,
|
43
|
-
link.schema && link.method != :get ? 1 : 0
|
43
|
+
link.schema && link.method != :get ? 1 : 0,
|
44
44
|
].reduce(0, :+)
|
45
45
|
|
46
|
-
(args.size >= min_arguments_count)
|
47
|
-
raise
|
46
|
+
(args.size >= min_arguments_count) ||
|
47
|
+
raise(ArgumentError, "wrong number of arguments (given #{args.size}, expected #{min_arguments_count})")
|
48
48
|
|
49
49
|
placeholders = []
|
50
50
|
|
51
|
-
url = link[
|
51
|
+
url = link["href"].gsub(IDENTITY_REGEXP) do |_stuff|
|
52
52
|
placeholder = args.shift.to_s
|
53
53
|
placeholders << placeholder
|
54
54
|
placeholder
|
@@ -61,19 +61,16 @@ module Dato
|
|
61
61
|
body = link.schema ? args.shift : {}
|
62
62
|
query_string = args.shift || {}
|
63
63
|
|
64
|
-
elsif link.method
|
65
|
-
query_string = args.shift || {}
|
66
|
-
|
67
|
-
elsif link.method == :get
|
64
|
+
elsif %i[get delete].include?(link.method)
|
68
65
|
query_string = args.shift || {}
|
69
66
|
end
|
70
67
|
|
71
68
|
options = args.any? ? args.shift.symbolize_keys : {}
|
72
69
|
|
73
70
|
if link.schema && %i[post put].include?(link.method) && options.fetch(:serialize_response, true)
|
74
|
-
body = JsonApiSerializer.new(
|
71
|
+
body = JsonApiSerializer.new(link: link).serialize(
|
75
72
|
body,
|
76
|
-
link.method == :post ? nil : placeholders.last
|
73
|
+
link.method == :post ? nil : placeholders.last,
|
77
74
|
)
|
78
75
|
end
|
79
76
|
|
@@ -92,21 +89,19 @@ module Dato
|
|
92
89
|
if response && response[:data] && response[:data].is_a?(Hash) && response[:data][:type] == "job"
|
93
90
|
job_result = nil
|
94
91
|
|
95
|
-
|
92
|
+
until job_result
|
96
93
|
begin
|
97
94
|
sleep(1)
|
98
95
|
job_result = client.job_result.find(response[:data][:id])
|
99
|
-
rescue ApiError =>
|
100
|
-
if
|
101
|
-
raise error
|
102
|
-
end
|
96
|
+
rescue ApiError => e
|
97
|
+
raise e if e.response[:status] != 404
|
103
98
|
end
|
104
99
|
end
|
105
100
|
|
106
101
|
if job_result[:status] < 200 || job_result[:status] >= 300
|
107
102
|
error = ApiError.new(
|
108
103
|
status: job_result[:status],
|
109
|
-
body: JSON.dump(job_result[:payload])
|
104
|
+
body: JSON.dump(job_result[:payload]),
|
110
105
|
)
|
111
106
|
|
112
107
|
puts "===="
|
@@ -121,12 +116,10 @@ module Dato
|
|
121
116
|
else
|
122
117
|
job_result.payload
|
123
118
|
end
|
119
|
+
elsif options.fetch(:deserialize_response, true)
|
120
|
+
JsonApiDeserializer.new(link.target_schema).deserialize(response)
|
124
121
|
else
|
125
|
-
|
126
|
-
JsonApiDeserializer.new(link.target_schema).deserialize(response)
|
127
|
-
else
|
128
|
-
response
|
129
|
-
end
|
122
|
+
response
|
130
123
|
end
|
131
124
|
end
|
132
125
|
end
|
data/lib/dato/site/client.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "dato/api_client"
|
4
|
+
require "dato/upload/file"
|
5
|
+
require "dato/upload/create_upload_path"
|
6
6
|
|
7
7
|
module Dato
|
8
8
|
module Site
|
9
9
|
class Client
|
10
10
|
include ApiClient
|
11
11
|
|
12
|
-
json_schema
|
12
|
+
json_schema "site-api"
|
13
13
|
|
14
14
|
def create_upload_path(path_or_url)
|
15
15
|
file = Upload::CreateUploadPath.new(self, path_or_url)
|
@@ -30,7 +30,7 @@ module Dato
|
|
30
30
|
request(
|
31
31
|
:post,
|
32
32
|
"/pusher/authenticate",
|
33
|
-
{ socket_id: socket_id, channel_name: channel}
|
33
|
+
{ socket_id: socket_id, channel_name: channel },
|
34
34
|
)
|
35
35
|
end
|
36
36
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
3
|
+
require "mime/types"
|
4
|
+
require "tempfile"
|
5
|
+
require "addressable"
|
6
|
+
require "net/http"
|
7
7
|
|
8
8
|
module Dato
|
9
9
|
module Upload
|
@@ -19,7 +19,7 @@ module Dato
|
|
19
19
|
@file ||= if http_source?
|
20
20
|
uri = Addressable::URI.parse(source)
|
21
21
|
ext = ::File.extname(uri.path).downcase
|
22
|
-
tempfile = Tempfile.new([
|
22
|
+
tempfile = Tempfile.new(["file", ext])
|
23
23
|
tempfile.binmode
|
24
24
|
tempfile.write(download_file(source))
|
25
25
|
tempfile.rewind
|
@@ -31,7 +31,7 @@ module Dato
|
|
31
31
|
|
32
32
|
def http_source?
|
33
33
|
uri = Addressable::URI.parse(source)
|
34
|
-
uri.scheme ==
|
34
|
+
uri.scheme == "http" || uri.scheme == "https"
|
35
35
|
rescue Addressable::URI::InvalidURIError
|
36
36
|
false
|
37
37
|
end
|
@@ -51,9 +51,7 @@ module Dato
|
|
51
51
|
mime_type = MIME::Types.of(filename).first
|
52
52
|
|
53
53
|
request = Net::HTTP::Put.new(uri)
|
54
|
-
if mime_type
|
55
|
-
request.add_field("Content-Type", mime_type.to_s)
|
56
|
-
end
|
54
|
+
request.add_field("Content-Type", mime_type.to_s) if mime_type
|
57
55
|
request.body = file.read
|
58
56
|
|
59
57
|
http = Net::HTTP.new(uri.host, uri.port)
|
@@ -78,4 +76,3 @@ module Dato
|
|
78
76
|
end
|
79
77
|
end
|
80
78
|
end
|
81
|
-
|
data/lib/dato/upload/file.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dato/upload/create_upload_path"
|
4
4
|
|
5
5
|
module Dato
|
6
6
|
module Upload
|
@@ -18,14 +18,14 @@ module Dato
|
|
18
18
|
upload_path = CreateUploadPath.new(client, source).upload_path
|
19
19
|
|
20
20
|
upload = client.uploads.create(
|
21
|
-
upload_attributes.merge(path: upload_path)
|
21
|
+
upload_attributes.merge(path: upload_path),
|
22
22
|
)
|
23
23
|
|
24
24
|
{
|
25
25
|
alt: nil,
|
26
26
|
title: nil,
|
27
27
|
custom_data: {},
|
28
|
-
}.merge(field_attributes).merge(upload_id: upload[
|
28
|
+
}.merge(field_attributes).merge(upload_id: upload["id"])
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
data/lib/dato/upload/image.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dato/json_api_serializer"
|
4
4
|
|
5
5
|
module Dato
|
6
6
|
module Utils
|
7
7
|
module BuildModularBlock
|
8
8
|
def self.build(unserialized_body)
|
9
|
-
json_api_serializer = JsonApiSerializer.new(
|
9
|
+
json_api_serializer = JsonApiSerializer.new(type: "item")
|
10
10
|
attributes = json_api_serializer.serialized_attributes(unserialized_body)
|
11
11
|
|
12
12
|
payload = {
|
13
|
-
type:
|
13
|
+
type: "item",
|
14
14
|
attributes: attributes,
|
15
15
|
relationships: {
|
16
16
|
item_type: {
|
17
17
|
data: {
|
18
18
|
id: unserialized_body[:item_type],
|
19
|
-
type:
|
19
|
+
type: "item_type",
|
20
20
|
},
|
21
21
|
},
|
22
22
|
},
|
@@ -20,7 +20,7 @@ module Dato
|
|
20
20
|
build_apple_icon_tags,
|
21
21
|
build_windows_tags,
|
22
22
|
build_color_tags,
|
23
|
-
build_app_name_tag
|
23
|
+
build_app_name_tag,
|
24
24
|
].flatten.compact
|
25
25
|
end
|
26
26
|
|
@@ -29,9 +29,9 @@ module Dato
|
|
29
29
|
|
30
30
|
APPLE_TOUCH_ICON_SIZES.map do |size|
|
31
31
|
link_tag(
|
32
|
-
|
32
|
+
"apple-touch-icon",
|
33
33
|
url(size),
|
34
|
-
sizes: "#{size}x#{size}"
|
34
|
+
sizes: "#{size}x#{size}",
|
35
35
|
)
|
36
36
|
end
|
37
37
|
end
|
@@ -41,10 +41,10 @@ module Dato
|
|
41
41
|
|
42
42
|
ICON_SIZES.map do |size|
|
43
43
|
link_tag(
|
44
|
-
|
44
|
+
"icon",
|
45
45
|
url(size),
|
46
46
|
sizes: "#{size}x#{size}",
|
47
|
-
type: "image/#{site.favicon.format}"
|
47
|
+
type: "image/#{site.favicon.format}",
|
48
48
|
)
|
49
49
|
end
|
50
50
|
end
|
@@ -58,15 +58,15 @@ module Dato
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def build_app_name_tag
|
61
|
-
meta_tag(
|
61
|
+
meta_tag("application-name", site.name)
|
62
62
|
end
|
63
63
|
|
64
64
|
def build_color_tags
|
65
65
|
return unless theme_color
|
66
66
|
|
67
67
|
[
|
68
|
-
meta_tag(
|
69
|
-
meta_tag(
|
68
|
+
meta_tag("theme-color", theme_color),
|
69
|
+
meta_tag("msapplication-TileColor", theme_color),
|
70
70
|
]
|
71
71
|
end
|
72
72
|
|
@@ -75,11 +75,11 @@ module Dato
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def meta_tag(name, value)
|
78
|
-
{ tag_name:
|
78
|
+
{ tag_name: "meta", attributes: { name: name, content: value } }
|
79
79
|
end
|
80
80
|
|
81
81
|
def link_tag(rel, href, attrs = {})
|
82
|
-
{ tag_name:
|
82
|
+
{ tag_name: "link", attributes: attrs.merge(rel: rel, href: href) }
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "dato/utils/meta_tags/base"
|
4
|
+
require "time"
|
5
5
|
|
6
6
|
module Dato
|
7
7
|
module Utils
|
8
8
|
module MetaTags
|
9
9
|
class ArticleModifiedTime < Base
|
10
10
|
def build
|
11
|
-
og_tag(
|
11
|
+
og_tag("article:modified_time", item.updated_at.iso8601) if item
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dato/utils/meta_tags/base"
|
4
4
|
|
5
5
|
module Dato
|
6
6
|
module Utils
|
7
7
|
module MetaTags
|
8
8
|
class ArticlePublisher < Base
|
9
9
|
def build
|
10
|
-
og_tag(
|
10
|
+
og_tag("article:publisher", facebook_page_url) if facebook_page_url
|
11
11
|
end
|
12
12
|
|
13
13
|
def facebook_page_url
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "forwardable"
|
4
|
+
require "dato/local/field_type/seo"
|
5
|
+
require "active_support/core_ext/object/blank"
|
6
6
|
|
7
7
|
module Dato
|
8
8
|
module Utils
|
@@ -19,7 +19,7 @@ module Dato
|
|
19
19
|
fallback_seo = site.global_seo && site.global_seo.fallback_seo
|
20
20
|
|
21
21
|
seo_field = item &&
|
22
|
-
item.fields.detect { |f| f.field_type ==
|
22
|
+
item.fields.detect { |f| f.field_type == "seo" }
|
23
23
|
|
24
24
|
item_seo_value = seo_field &&
|
25
25
|
item[seo_field.api_key] &&
|
@@ -36,11 +36,11 @@ module Dato
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def meta_tag(name, content)
|
39
|
-
tag(
|
39
|
+
tag("meta", name: name, content: content)
|
40
40
|
end
|
41
41
|
|
42
42
|
def og_tag(property, content)
|
43
|
-
tag(
|
43
|
+
tag("meta", property: property, content: content)
|
44
44
|
end
|
45
45
|
|
46
46
|
def card_tag(name, content)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dato/utils/meta_tags/base"
|
4
4
|
|
5
5
|
module Dato
|
6
6
|
module Utils
|
@@ -10,9 +10,9 @@ module Dato
|
|
10
10
|
return unless description.present?
|
11
11
|
|
12
12
|
[
|
13
|
-
meta_tag(
|
14
|
-
og_tag(
|
15
|
-
card_tag(
|
13
|
+
meta_tag("description", description),
|
14
|
+
og_tag("og:description", description),
|
15
|
+
card_tag("twitter:description", description),
|
16
16
|
]
|
17
17
|
end
|
18
18
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dato/utils/meta_tags/base"
|
4
4
|
|
5
5
|
module Dato
|
6
6
|
module Utils
|
@@ -10,8 +10,8 @@ module Dato
|
|
10
10
|
return unless image
|
11
11
|
|
12
12
|
[
|
13
|
-
og_tag(
|
14
|
-
card_tag(
|
13
|
+
og_tag("og:image", image.url),
|
14
|
+
card_tag("twitter:image", image.url),
|
15
15
|
]
|
16
16
|
end
|
17
17
|
|
@@ -21,11 +21,10 @@ module Dato
|
|
21
21
|
|
22
22
|
def item_image
|
23
23
|
item && item.fields
|
24
|
-
.select { |field| field.field_type ==
|
24
|
+
.select { |field| field.field_type == "file" }
|
25
25
|
.map { |field| item[field.api_key] }
|
26
26
|
.compact
|
27
27
|
.find do |image|
|
28
|
-
|
29
28
|
image.width && image.height &&
|
30
29
|
image.width >= 200 && image.height >= 200
|
31
30
|
end
|