dato 0.8.0 → 0.8.1

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.
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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/dump/operation/add_to_data_file'
3
+ require "dato/dump/operation/add_to_data_file"
4
4
 
5
5
  module Dato
6
6
  module Dump
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/dump/operation/create_data_file'
3
+ require "dato/dump/operation/create_data_file"
4
4
 
5
5
  module Dato
6
6
  module Dump
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/dump/operation/create_post'
3
+ require "dato/dump/operation/create_post"
4
4
 
5
5
  module Dato
6
6
  module Dump
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/dump/dsl/create_post'
4
- require 'dato/dump/dsl/create_data_file'
5
- require 'dato/dump/dsl/add_to_data_file'
3
+ require "dato/dump/dsl/create_post"
4
+ require "dato/dump/dsl/create_data_file"
5
+ require "dato/dump/dsl/add_to_data_file"
6
6
 
7
7
  module Dato
8
8
  module Dump
@@ -17,7 +17,7 @@ module Dato
17
17
  def initialize(dato, operations, &block)
18
18
  @dato = dato
19
19
  @operations = operations
20
- @self_before_instance_eval = eval 'self', block.binding
20
+ @self_before_instance_eval = eval "self", block.binding
21
21
 
22
22
  instance_eval(&block)
23
23
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/dump/dsl/directory'
4
- require 'dato/dump/dsl/create_post'
5
- require 'dato/dump/dsl/create_data_file'
6
- require 'dato/dump/dsl/add_to_data_file'
3
+ require "dato/dump/dsl/directory"
4
+ require "dato/dump/dsl/create_post"
5
+ require "dato/dump/dsl/create_data_file"
6
+ require "dato/dump/dsl/add_to_data_file"
7
7
 
8
- require 'dato/dump/operation/directory'
8
+ require "dato/dump/operation/directory"
9
9
 
10
10
  module Dato
11
11
  module Dump
@@ -21,9 +21,9 @@ module Dato
21
21
  @dato = dato
22
22
  @operations = operations
23
23
 
24
- # rubocop:disable Lint/Eval
24
+ # rubocop:disable Security/Eval
25
25
  eval(config_code)
26
- # rubocop:enable Lint/Eval
26
+ # rubocop:enable Security/Eval
27
27
  end
28
28
 
29
29
  def directory(path, &block)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/dump/format/toml'
4
- require 'dato/dump/format/yaml'
5
- require 'dato/dump/format/json'
3
+ require "dato/dump/format/toml"
4
+ require "dato/dump/format/yaml"
5
+ require "dato/dump/format/json"
6
6
 
7
7
  module Dato
8
8
  module Dump
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'json'
3
+ require "json"
4
4
 
5
5
  module Dato
6
6
  module Dump
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/core_ext/hash/keys'
4
- require 'toml'
3
+ require "active_support/core_ext/hash/keys"
4
+ require "toml"
5
5
 
6
6
  class Time
7
- def to_toml(_path = '')
8
- utc.strftime('%Y-%m-%dT%H:%M:%SZ')
7
+ def to_toml(_path = "")
8
+ utc.strftime("%Y-%m-%dT%H:%M:%SZ")
9
9
  end
10
10
  end
11
11
 
12
12
  class Date
13
- def to_toml(_path = '')
14
- strftime('%Y-%m-%d')
13
+ def to_toml(_path = "")
14
+ strftime("%Y-%m-%d")
15
15
  end
16
16
  end
17
17
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/core_ext/hash/keys'
4
- require 'yaml'
3
+ require "active_support/core_ext/hash/keys"
4
+ require "yaml"
5
5
 
6
6
  class Array
7
7
  def deep_stringify_keys
@@ -22,7 +22,7 @@ module Dato
22
22
  module Format
23
23
  module Yaml
24
24
  def self.dump(value)
25
- YAML.dump(value.deep_stringify_keys).chomp.gsub(/^\-+\n/, '')
25
+ YAML.dump(value.deep_stringify_keys).chomp.gsub(/^-+\n/, "")
26
26
  end
27
27
 
28
28
  def self.frontmatter_dump(value)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/dump/format'
3
+ require "dato/dump/format"
4
4
 
5
5
  module Dato
6
6
  module Dump
@@ -24,15 +24,15 @@ module Dato
24
24
  old_content = if File.exist? complete_path
25
25
  ::File.read(complete_path)
26
26
  else
27
- ''
27
+ ""
28
28
  end
29
29
 
30
30
  new_content = old_content.sub(
31
31
  /\n*(#\s*datocms:start.*#\s*datocms:end|\Z)/m,
32
- "\n\n# datocms:start\n#{content_to_add}\n# datocms:end"
32
+ "\n\n# datocms:start\n#{content_to_add}\n# datocms:end",
33
33
  )
34
34
 
35
- File.open(complete_path, 'w') do |f|
35
+ File.open(complete_path, "w") do |f|
36
36
  f.write new_content
37
37
  end
38
38
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fileutils'
4
- require 'dato/dump/format'
3
+ require "fileutils"
4
+ require "dato/dump/format"
5
5
 
6
6
  module Dato
7
7
  module Dump
@@ -19,7 +19,7 @@ module Dato
19
19
  def perform
20
20
  FileUtils.mkdir_p(File.dirname(path))
21
21
 
22
- File.open(File.join(context.path, path), 'w') do |file|
22
+ File.open(File.join(context.path, path), "w") do |file|
23
23
  file.write Format.dump(format, value)
24
24
  end
25
25
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fileutils'
4
- require 'dato/dump/format'
3
+ require "fileutils"
4
+ require "dato/dump/format"
5
5
 
6
6
  module Dato
7
7
  module Dump
@@ -9,8 +9,7 @@ module Dato
9
9
  class CreatePost
10
10
  attr_reader :context, :path
11
11
 
12
- attr_accessor :frontmatter_format, :frontmatter_value
13
- attr_accessor :content
12
+ attr_accessor :frontmatter_format, :frontmatter_value, :content
14
13
 
15
14
  def initialize(context, path)
16
15
  @context = context
@@ -20,10 +19,10 @@ module Dato
20
19
  def perform
21
20
  FileUtils.mkdir_p(File.dirname(path))
22
21
 
23
- File.open(File.join(context.path, path), 'w') do |file|
22
+ File.open(File.join(context.path, path), "w") do |file|
24
23
  file.write Format.frontmatter_dump(
25
24
  frontmatter_format,
26
- frontmatter_value
25
+ frontmatter_value,
27
26
  )
28
27
  file.write "\n\n"
29
28
  file.write content
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fileutils'
3
+ require "fileutils"
4
4
 
5
5
  module Dato
6
6
  module Dump
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dato/dump/dsl/root'
4
- require 'dato/dump/operation/root'
5
- require 'dato/dump/ssg_detector'
6
- require 'dato/local/loader'
3
+ require "dato/dump/dsl/root"
4
+ require "dato/dump/operation/root"
5
+ require "dato/dump/ssg_detector"
6
+ require "dato/local/loader"
7
7
 
8
8
  module Dato
9
9
  module Dump
@@ -25,7 +25,7 @@ module Dato
25
25
  Dsl::Root.new(
26
26
  File.read(config_path),
27
27
  loader.items_repo,
28
- operation
28
+ operation,
29
29
  )
30
30
 
31
31
  operation.perform
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'toml'
4
- require 'json'
5
- require 'yaml'
3
+ require "toml"
4
+ require "json"
5
+ require "yaml"
6
6
 
7
7
  module Dato
8
8
  module Dump
@@ -18,17 +18,17 @@ module Dato
18
18
 
19
19
  HUGO = [
20
20
  {
21
- file: 'config.toml',
22
- loader: ->(content) { TOML::Parser.new(content).parsed }
21
+ file: "config.toml",
22
+ loader: ->(content) { TOML::Parser.new(content).parsed },
23
23
  },
24
24
  {
25
- file: 'config.yaml',
26
- loader: ->(content) { YAML.safe_load(content) }
25
+ file: "config.yaml",
26
+ loader: ->(content) { YAML.safe_load(content) },
27
27
  },
28
28
  {
29
- file: 'config.json',
30
- loader: ->(content) { JSON.parse(content) }
31
- }
29
+ file: "config.json",
30
+ loader: ->(content) { JSON.parse(content) },
31
+ },
32
32
  ].freeze
33
33
 
34
34
  def initialize(path)
@@ -40,13 +40,13 @@ module Dato
40
40
  node_generator ||
41
41
  python_generator ||
42
42
  hugo ||
43
- 'unknown'
43
+ "unknown"
44
44
  end
45
45
 
46
46
  private
47
47
 
48
48
  def ruby_generator
49
- gemfile_path = File.join(path, 'Gemfile')
49
+ gemfile_path = File.join(path, "Gemfile")
50
50
  return unless File.exist?(gemfile_path)
51
51
 
52
52
  gemfile = File.read(gemfile_path)
@@ -57,13 +57,13 @@ module Dato
57
57
  end
58
58
 
59
59
  def node_generator
60
- package_path = File.join(path, 'package.json')
60
+ package_path = File.join(path, "package.json")
61
61
  return unless File.exist?(package_path)
62
62
 
63
63
  package = JSON.parse(File.read(package_path))
64
64
 
65
- deps = package.fetch('dependencies', {})
66
- dev_deps = package.fetch('devDependencies', {})
65
+ deps = package.fetch("dependencies", {})
66
+ dev_deps = package.fetch("devDependencies", {})
67
67
  all_deps = deps.merge(dev_deps)
68
68
 
69
69
  NODE.find do |generator|
@@ -74,7 +74,7 @@ module Dato
74
74
  end
75
75
 
76
76
  def python_generator
77
- requirements_path = File.join(path, 'requirements.txt')
77
+ requirements_path = File.join(path, "requirements.txt")
78
78
  return unless File.exist?(requirements_path)
79
79
 
80
80
  requirements = File.read(requirements_path)
@@ -89,13 +89,11 @@ module Dato
89
89
  config_path = File.join(path, option[:file])
90
90
  if File.exist?(config_path)
91
91
  config = option[:loader].call(File.read(config_path))
92
- config.key? 'baseurl'
92
+ config.key? "baseurl"
93
93
  end
94
- end && 'hugo'
94
+ end && "hugo"
95
95
  rescue JSON::ParserError
96
96
  nil
97
- rescue Psych::SyntaxError
98
- nil
99
97
  end
100
98
  end
101
99
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require 'dato/json_schema_relationships'
2
+
3
+ require "dato/json_schema_relationships"
3
4
 
4
5
  module Dato
5
6
  class JsonApiDeserializer
@@ -28,21 +29,19 @@ module Dato
28
29
 
29
30
  if data[:relationships]
30
31
  relationships.each do |relationship, meta|
31
- if data[:relationships][relationship]
32
- rel_data = data[:relationships][relationship][:data]
33
-
34
- result[relationship] = if meta[:types].length > 1
35
- rel_data
36
- else
37
- if !rel_data
38
- nil
39
- elsif meta[:collection]
40
- rel_data.map { |ref| ref[:id] }
41
- else
42
- rel_data[:id]
43
- end
44
- end
45
- end
32
+ next unless data[:relationships][relationship]
33
+
34
+ rel_data = data[:relationships][relationship][:data]
35
+
36
+ result[relationship] = if meta[:types].length > 1
37
+ rel_data
38
+ elsif !rel_data
39
+ nil
40
+ elsif meta[:collection]
41
+ rel_data.map { |ref| ref[:id] }
42
+ else
43
+ rel_data[:id]
44
+ end
46
45
  end
47
46
  end
48
47
 
@@ -1,13 +1,15 @@
1
1
  # frozen_string_literal: true
2
- require 'dato/json_schema_relationships'
2
+
3
+ require "dato/json_schema_relationships"
4
+ require "dato/json_schema_type"
3
5
 
4
6
  module Dato
5
7
  class JsonApiSerializer
6
8
  attr_reader :link, :type
7
9
 
8
- def initialize(type, link)
10
+ def initialize(type: nil, link: nil)
9
11
  @link = link
10
- @type = type
12
+ @type = type || type_from_schema
11
13
  end
12
14
 
13
15
  def serialize(resource, id = nil)
@@ -16,19 +18,22 @@ module Dato
16
18
 
17
19
  data[:id] = id || resource[:id] if id || resource[:id]
18
20
 
19
- if resource.has_key?(:meta)
20
- resource.delete(:meta)
21
- end
21
+ resource.delete(:meta) if resource.key?(:meta)
22
22
 
23
23
  data[:type] = type
24
- data[:attributes] = serialized_attributes(resource)
25
24
 
26
- serialized_relationships = serialized_relationships(resource)
25
+ if link.schema &&
26
+ link.schema.properties["data"] &&
27
+ link.schema.properties["data"].properties.keys.include?("attributes")
27
28
 
28
- if serialized_relationships
29
- data[:relationships] = serialized_relationships
29
+ serialized_resource_attributes = serialized_attributes(resource)
30
+ data[:attributes] = serialized_resource_attributes
30
31
  end
31
32
 
33
+ serialized_relationships = serialized_relationships(resource)
34
+
35
+ data[:relationships] = serialized_relationships if serialized_relationships
36
+
32
37
  { data: data }
33
38
  end
34
39
 
@@ -61,18 +66,18 @@ module Dato
61
66
  value.symbolize_keys
62
67
  end
63
68
  else
64
- type = meta[:types].first
69
+ meta_type = meta[:types].first
65
70
  if meta[:collection]
66
71
  value.map do |id|
67
72
  {
68
- type: type,
69
- id: id.to_s
73
+ type: meta_type,
74
+ id: id.to_s,
70
75
  }
71
76
  end
72
77
  else
73
78
  {
74
- type: type,
75
- id: value.to_s
79
+ type: meta_type,
80
+ id: value.to_s,
76
81
  }
77
82
  end
78
83
  end
@@ -88,7 +93,7 @@ module Dato
88
93
  end
89
94
 
90
95
  def attributes(resource)
91
- if type == 'item'
96
+ if type == "item"
92
97
  return resource.keys.reject do |key|
93
98
  %i[
94
99
  item_type
@@ -100,11 +105,11 @@ module Dato
100
105
  end
101
106
  end
102
107
 
103
- link_attributes['properties'].keys.map(&:to_sym)
108
+ link_attributes["properties"].keys.map(&:to_sym)
104
109
  end
105
110
 
106
111
  def required_attributes
107
- return [] if type == 'item'
112
+ return [] if type == "item"
108
113
 
109
114
  (link_attributes.required || []).map(&:to_sym)
110
115
  end
@@ -114,7 +119,7 @@ module Dato
114
119
  end
115
120
 
116
121
  def required_relationships
117
- if link.schema.properties['data'].required.include?("relationships")
122
+ if link.schema.properties["data"].required.include?("relationships")
118
123
  (link_relationships.required || []).map(&:to_sym)
119
124
  else
120
125
  []
@@ -122,11 +127,15 @@ module Dato
122
127
  end
123
128
 
124
129
  def link_attributes
125
- link.schema.properties['data'].properties['attributes']
130
+ link.schema.properties["data"].properties["attributes"]
126
131
  end
127
132
 
128
133
  def link_relationships
129
- link.schema.properties['data'].properties['relationships']
134
+ link.schema.properties["data"].properties["relationships"]
135
+ end
136
+
137
+ def type_from_schema
138
+ Dato::JsonSchemaType.new(link.schema).call
130
139
  end
131
140
  end
132
141
  end