dato 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +42 -5
  3. data/.travis.yml +1 -0
  4. data/Gemfile +1 -1
  5. data/Rakefile +2 -2
  6. data/bin/console +3 -3
  7. data/bin/rspec +6 -6
  8. data/dato.gemspec +1 -1
  9. data/exe/dato +3 -3
  10. data/lib/dato.rb +8 -8
  11. data/lib/dato/account/client.rb +2 -2
  12. data/lib/dato/api_client.rb +39 -43
  13. data/lib/dato/api_error.rb +10 -13
  14. data/lib/dato/cli.rb +18 -18
  15. data/lib/dato/dump/dsl/add_to_data_file.rb +1 -1
  16. data/lib/dato/dump/dsl/create_data_file.rb +1 -1
  17. data/lib/dato/dump/dsl/create_post.rb +1 -1
  18. data/lib/dato/dump/dsl/directory.rb +4 -4
  19. data/lib/dato/dump/dsl/root.rb +7 -7
  20. data/lib/dato/dump/format.rb +3 -3
  21. data/lib/dato/dump/format/json.rb +1 -1
  22. data/lib/dato/dump/format/toml.rb +6 -6
  23. data/lib/dato/dump/format/yaml.rb +3 -3
  24. data/lib/dato/dump/operation/add_to_data_file.rb +4 -4
  25. data/lib/dato/dump/operation/create_data_file.rb +3 -3
  26. data/lib/dato/dump/operation/create_post.rb +5 -6
  27. data/lib/dato/dump/operation/directory.rb +1 -1
  28. data/lib/dato/dump/runner.rb +5 -5
  29. data/lib/dato/dump/ssg_detector.rb +18 -20
  30. data/lib/dato/json_api_deserializer.rb +15 -16
  31. data/lib/dato/json_api_serializer.rb +30 -21
  32. data/lib/dato/json_schema_relationships.rb +19 -23
  33. data/lib/dato/json_schema_type.rb +47 -0
  34. data/lib/dato/local/entities_repo.rb +3 -3
  35. data/lib/dato/local/field_type/color.rb +11 -7
  36. data/lib/dato/local/field_type/file.rb +18 -24
  37. data/lib/dato/local/field_type/gallery.rb +1 -1
  38. data/lib/dato/local/field_type/global_seo.rb +4 -7
  39. data/lib/dato/local/field_type/lat_lon.rb +1 -1
  40. data/lib/dato/local/field_type/seo.rb +1 -1
  41. data/lib/dato/local/field_type/structured_text.rb +4 -10
  42. data/lib/dato/local/field_type/theme.rb +2 -2
  43. data/lib/dato/local/field_type/upload_id.rb +5 -5
  44. data/lib/dato/local/field_type/video.rb +9 -15
  45. data/lib/dato/local/item.rb +13 -12
  46. data/lib/dato/local/items_repo.rb +12 -18
  47. data/lib/dato/local/json_api_entity.rb +4 -3
  48. data/lib/dato/local/loader.rb +30 -31
  49. data/lib/dato/local/site.rb +5 -4
  50. data/lib/dato/paginator.rb +4 -4
  51. data/lib/dato/repo.rb +23 -30
  52. data/lib/dato/site/client.rb +5 -5
  53. data/lib/dato/upload/create_upload_path.rb +7 -10
  54. data/lib/dato/upload/file.rb +3 -3
  55. data/lib/dato/upload/image.rb +1 -1
  56. data/lib/dato/utils/build_modular_block.rb +4 -4
  57. data/lib/dato/utils/favicon_tags_builder.rb +10 -10
  58. data/lib/dato/utils/locale_value.rb +1 -1
  59. data/lib/dato/utils/meta_tags/article_modified_time.rb +3 -3
  60. data/lib/dato/utils/meta_tags/article_publisher.rb +2 -2
  61. data/lib/dato/utils/meta_tags/base.rb +6 -6
  62. data/lib/dato/utils/meta_tags/description.rb +4 -4
  63. data/lib/dato/utils/meta_tags/image.rb +4 -5
  64. data/lib/dato/utils/meta_tags/og_locale.rb +2 -2
  65. data/lib/dato/utils/meta_tags/og_site_name.rb +2 -2
  66. data/lib/dato/utils/meta_tags/og_type.rb +3 -3
  67. data/lib/dato/utils/meta_tags/robots.rb +2 -2
  68. data/lib/dato/utils/meta_tags/title.rb +6 -6
  69. data/lib/dato/utils/meta_tags/twitter_card.rb +2 -2
  70. data/lib/dato/utils/meta_tags/twitter_site.rb +2 -2
  71. data/lib/dato/utils/seo_tags_builder.rb +12 -12
  72. data/lib/dato/version.rb +1 -1
  73. metadata +7 -6
data/lib/dato/repo.rb CHANGED
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/json_api_serializer'
4
- require 'dato/json_api_deserializer'
5
- require 'dato/paginator'
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
- 'instances' => :all,
15
- 'self' => :find
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 |link|
36
- METHOD_NAMES.fetch(link.rel, link.rel).to_sym == method.to_sym
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 if !link
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) or
47
- raise ArgumentError, "wrong number of arguments (given #{args.size}, expected #{min_arguments_count})"
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['href'].gsub(IDENTITY_REGEXP) do |_stuff|
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 == :delete
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(type, link).serialize(
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
- while !job_result do
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 => error
100
- if error.response[:status] != 404
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
- if options.fetch(:deserialize_response, true)
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
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/api_client'
4
- require 'dato/upload/file'
5
- require 'dato/upload/create_upload_path'
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 'site-api'
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 'mime/types'
4
- require 'tempfile'
5
- require 'addressable'
6
- require 'net/http'
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(['file', ext])
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 == 'http' || uri.scheme == 'https'
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
-
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/upload/create_upload_path'
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['id'])
28
+ }.merge(field_attributes).merge(upload_id: upload["id"])
29
29
  end
30
30
  end
31
31
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/upload/file'
3
+ require "dato/upload/file"
4
4
 
5
5
  module Dato
6
6
  module Upload
@@ -1,22 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/json_api_serializer'
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('item', nil)
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: 'item',
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: 'item_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
- 'apple-touch-icon',
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
- 'icon',
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('application-name', site.name)
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('theme-color', theme_color),
69
- meta_tag('msapplication-TileColor', theme_color)
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: 'meta', attributes: { name: name, content: value } }
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: 'link', attributes: attrs.merge(rel: rel, href: href) }
82
+ { tag_name: "link", attributes: attrs.merge(rel: rel, href: href) }
83
83
  end
84
84
  end
85
85
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'i18n/backend/fallbacks'
3
+ require "i18n/backend/fallbacks"
4
4
 
5
5
  module Dato
6
6
  module Utils
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/utils/meta_tags/base'
4
- require 'time'
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('article:modified_time', item.updated_at.iso8601) if item
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 'dato/utils/meta_tags/base'
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('article:publisher', facebook_page_url) if facebook_page_url
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 'forwardable'
4
- require 'dato/local/field_type/seo'
5
- require 'active_support/core_ext/object/blank'
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 == 'seo' }
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('meta', name: name, content: content)
39
+ tag("meta", name: name, content: content)
40
40
  end
41
41
 
42
42
  def og_tag(property, content)
43
- tag('meta', property: property, content: content)
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 'dato/utils/meta_tags/base'
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('description', description),
14
- og_tag('og:description', description),
15
- card_tag('twitter:description', description)
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 'dato/utils/meta_tags/base'
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('og:image', image.url),
14
- card_tag('twitter:image', image.url)
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 == 'file' }
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