dato 0.7.8 → 0.7.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c290af75b0de6f8cd9b187448294b82d731b17d31d4443b1f40b5349fdb9c618
4
- data.tar.gz: c127cf9869c434dce38bb77ba81895bf5ef351bee5a9b0edc9ef2d0fec510753
3
+ metadata.gz: 7779edc00921c84e0f98aee2008bb8fd3f89d893c02107d965db12d1f5bc7882
4
+ data.tar.gz: 25ba5f84f8a6236c40d2846ef976987501f4977d481c9c445e298b666bc6b1ec
5
5
  SHA512:
6
- metadata.gz: d5552912880af2435a664eed763cb18e858b8653dae00f85f5915b0c7245225454538fe8da7e08e14d6e2fd7e460ed67e4770d1053df78c146060009aee0dfa5
7
- data.tar.gz: 830e413829504a1ae8fc076fc3cb7a9a6b5e60dd9652df2121dca94eaa5a4e3cf68f498796411e09bda3be862ab0515a750c3a97c723a49a0a75422cce6c0c88
6
+ metadata.gz: 955b67a6fadad2fb96e1342ec2e8907f5084085e0f18737655ebac56a4a8661e5d670ff9e662b3afc21381636139480f86ae48d47f268b571a21fcfa470de8c2
7
+ data.tar.gz: 479fe2e231a44cdf9518961c98bfddbd67ac06d4cd511e37a7369d668e5f0fa4eeca195d8af09bd981277a5c195f01d5f368f6b134562ebdd8f43df0c47a8c91
@@ -1,3 +1,50 @@
1
+ # 0.7.13
2
+
3
+ Add option to pass a project's environment:
4
+
5
+ ```ruby
6
+ require "dato"
7
+ client = Dato::Site::Client.new("YOUR-API-KEY", environment: 'sandbox-foobar')
8
+ ```
9
+
10
+ # 0.7.12
11
+
12
+ Introduces `Dato::Utils::BuildModularBlock` class to help creating modular blocks.
13
+
14
+ An example usage can be:
15
+
16
+ ```ruby
17
+ description = [
18
+ Dato::Utils::BuildModularBlock.build(
19
+ item_type: "1235",
20
+ name: "Best dog in the world",
21
+ year: "2020",
22
+ picture: picture
23
+ )
24
+ ]
25
+
26
+ record = client.items.create(
27
+ item_type: "1234", # model ID
28
+ name: "Gigio",
29
+ description: description
30
+ )
31
+ ```
32
+
33
+ Find more info [on the documentation](https://www.datocms.com/docs/content-management-api/resources/item/create).
34
+
35
+ # 0.7.11 (not released)
36
+
37
+ * Updated specs cassettes after `appeareance -> appearance` typo fix
38
+ * Some style changes
39
+
40
+ # 0.7.10
41
+
42
+ * Fixed SEO title retrieval. Now it fallbacks to default SEO title is item title is blank
43
+
44
+ # 0.7.9
45
+
46
+ * Added new attributes to uploads
47
+
1
48
  # 0.7.0
2
49
 
3
50
  * Real-time events are now much more granular and the gem avoids downloading all the content every time a change occurs
data/Rakefile CHANGED
@@ -3,5 +3,8 @@
3
3
  require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
5
 
6
- RSpec::Core::RakeTask.new(:spec)
6
+ RSpec::Core::RakeTask.new(:spec) do |t|
7
+ t.rspec_opts = "-b"
8
+ end
9
+
7
10
  task default: :spec
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'rubocop'
31
31
  spec.add_development_dependency 'coveralls'
32
32
  spec.add_development_dependency 'pry'
33
+ spec.add_development_dependency 'pry-byebug'
33
34
  spec.add_development_dependency 'front_matter_parser'
34
35
 
35
36
  spec.add_runtime_dependency 'faraday', ['>= 0.9.0']
@@ -37,7 +38,7 @@ Gem::Specification.new do |spec|
37
38
  spec.add_runtime_dependency 'activesupport', ['>= 4.2.7']
38
39
  spec.add_runtime_dependency 'addressable'
39
40
  spec.add_runtime_dependency 'thor'
40
- spec.add_runtime_dependency 'imgix', ['>= 0.3.1']
41
+ spec.add_runtime_dependency 'imgix', ['~> 4']
41
42
  spec.add_runtime_dependency 'toml'
42
43
  spec.add_runtime_dependency 'cacert'
43
44
  spec.add_runtime_dependency 'dotenv'
@@ -8,6 +8,7 @@ require 'dato/local/site'
8
8
  require 'dato/cli'
9
9
  require 'dato/utils/seo_tags_builder'
10
10
  require 'dato/utils/favicon_tags_builder'
11
+ require 'dato/utils/build_modular_block'
11
12
 
12
13
  module Dato
13
14
  end
@@ -20,7 +20,7 @@ module Dato
20
20
  base.extend ClassMethods
21
21
 
22
22
  base.class_eval do
23
- attr_reader :token, :base_url, :schema, :extra_headers
23
+ attr_reader :token, :environment, :base_url, :schema, :extra_headers
24
24
  end
25
25
  end
26
26
 
@@ -29,27 +29,28 @@ module Dato
29
29
  define_method(:initialize) do |token, options = {}|
30
30
  @token = token
31
31
  @base_url = options[:base_url] || "https://#{subdomain}.datocms.com"
32
+ @environment = options[:environment]
32
33
  @extra_headers = options[:extra_headers] || {}
33
34
  end
34
35
 
36
+ # FOR DEV
37
+ # "http://#{subdomain}.lvh.me:3001/docs/#{subdomain}-hyperschema.json"
35
38
  response = Faraday.get(
36
- # FOR DEV
37
- # "http://#{subdomain}.lvh.me:3001/docs/#{subdomain}-hyperschema.json"
38
39
  "https://#{subdomain}.datocms.com/docs/#{subdomain}-hyperschema.json"
39
40
  )
40
41
 
41
42
  schema = JsonSchema.parse!(JSON.parse(response.body))
42
43
  schema.expand_references!
43
44
 
44
- schema.definitions.each do |type, schema|
45
- is_collection = schema.links.select { |x| x.rel === 'instances' }.any?
45
+ schema.definitions.each do |type, obj|
46
+ is_collection = obj.links.select { |x| x.rel == 'instances' }.any?
46
47
  namespace = is_collection ? type.pluralize : type
47
48
 
48
49
  define_method(namespace) do
49
50
  instance_variable_set(
50
51
  "@#{namespace}",
51
52
  instance_variable_get("@#{namespace}") ||
52
- Dato::Repo.new(self, type, schema)
53
+ Dato::Repo.new(self, type, obj)
53
54
  )
54
55
  end
55
56
  end
@@ -76,16 +77,10 @@ module Dato
76
77
  method, absolute_path, body, params = args
77
78
 
78
79
  response = connection.send(method, absolute_path, body) do |c|
79
- if params
80
- c.params = params
81
- end
80
+ c.params = params if params
82
81
  end
83
82
 
84
- if response.body.is_a?(Hash)
85
- response.body.with_indifferent_access
86
- else
87
- nil
88
- end
83
+ response.body.with_indifferent_access if response.body.is_a?(Hash)
89
84
  rescue Faraday::SSLError => e
90
85
  raise e if ENV['SSL_CERT_FILE'] == Cacert.pem
91
86
 
@@ -101,14 +96,15 @@ module Dato
101
96
  sleep(to_wait + 1)
102
97
  request(*args)
103
98
  elsif e.response[:status] == 422 && batch_data_validation?(e.response)
104
- puts "Validating items, waiting 1 second and retrying..."
99
+ puts 'Validating items, waiting 1 second and retrying...'
105
100
  sleep(1)
106
101
  request(*args)
107
102
  else
103
+ # puts body.inspect
104
+ # puts '===='
105
+ # puts error.message
106
+ # puts '===='
108
107
  error = ApiError.new(e.response)
109
- puts "===="
110
- puts error.message
111
- puts "===="
112
108
  raise error
113
109
  end
114
110
  end
@@ -123,12 +119,12 @@ module Dato
123
119
  end
124
120
 
125
121
  return false unless body
126
- return false unless body["data"]
122
+ return false unless body['data']
127
123
 
128
- body["data"].any? do |e|
129
- e["attributes"]["code"] == "BATCH_DATA_VALIDATION_IN_PROGRESS"
124
+ body['data'].any? do |e|
125
+ e['attributes']['code'] == 'BATCH_DATA_VALIDATION_IN_PROGRESS'
130
126
  end
131
- rescue
127
+ rescue StandardError
132
128
  false
133
129
  end
134
130
 
@@ -141,9 +137,13 @@ module Dato
141
137
  'X-Api-Version' => '3'
142
138
  }
143
139
 
140
+ if environment
141
+ default_headers.merge!('X-Environment' => environment)
142
+ end
143
+
144
144
  options = {
145
145
  url: base_url,
146
- headers: default_headers.merge(extra_headers),
146
+ headers: default_headers.merge(extra_headers)
147
147
  }
148
148
 
149
149
  @connection ||= Faraday.new(options) do |c|
@@ -11,8 +11,10 @@ module Dato
11
11
  desc 'dump', 'dumps DatoCMS content into local files'
12
12
  option :config, default: 'dato.config.rb'
13
13
  option :token, default: ENV['DATO_API_TOKEN'], required: true
14
+ option :environment, type: :string, required: false
14
15
  option :preview, default: false, type: :boolean
15
16
  option :watch, default: false, type: :boolean
17
+
16
18
  def dump
17
19
  config_file = File.expand_path(options[:config])
18
20
  watch_mode = options[:watch]
@@ -20,6 +22,7 @@ module Dato
20
22
 
21
23
  client = Dato::Site::Client.new(
22
24
  options[:token],
25
+ environment: options[:environment],
23
26
  extra_headers: {
24
27
  'X-Reason' => 'dump',
25
28
  'X-SSG' => Dump::SsgDetector.new(Dir.pwd).detect
@@ -23,8 +23,10 @@ module Dato
23
23
  data[:type] = type
24
24
  data[:attributes] = serialized_attributes(resource)
25
25
 
26
- if relationships.any?
27
- data[:relationships] = serialized_relationships(resource)
26
+ serialized_relationships = serialized_relationships(resource)
27
+
28
+ if serialized_relationships
29
+ data[:relationships] = serialized_relationships
28
30
  end
29
31
 
30
32
  { data: data }
@@ -82,7 +84,7 @@ module Dato
82
84
  end
83
85
  end
84
86
 
85
- result
87
+ result.empty? ? nil : result
86
88
  end
87
89
 
88
90
  def attributes(resource)
@@ -110,7 +112,11 @@ module Dato
110
112
  end
111
113
 
112
114
  def required_relationships
113
- (link_relationships.required || []).map(&:to_sym)
115
+ if link.schema.properties['data'].required.include?("relationships")
116
+ (link_relationships.required || []).map(&:to_sym)
117
+ else
118
+ []
119
+ end
114
120
  end
115
121
 
116
122
  def link_attributes
@@ -18,6 +18,7 @@ module Dato
18
18
  v[:alt],
19
19
  v[:title],
20
20
  v[:custom_data],
21
+ v[:focal_point],
21
22
  repo.site.entity.imgix_host
22
23
  )
23
24
  end
@@ -29,12 +30,14 @@ module Dato
29
30
  alt,
30
31
  title,
31
32
  custom_data,
33
+ focal_point,
32
34
  imgix_host
33
35
  )
34
36
  @upload = upload
35
37
  @alt = alt
36
38
  @title = title
37
39
  @custom_data = custom_data
40
+ @focal_point = focal_point
38
41
  @imgix_host = imgix_host
39
42
  end
40
43
 
@@ -74,31 +77,184 @@ module Dato
74
77
  @upload.copyright
75
78
  end
76
79
 
80
+ def filename
81
+ @upload.filename
82
+ end
83
+
84
+ def basename
85
+ @upload.basename
86
+ end
87
+
77
88
  def alt
78
- default_metadata = @upload.default_field_metadata.deep_stringify_keys.fetch(I18n.locale.to_s, {})
79
- @alt || default_metadata["alt"]
89
+ default_metadata = @upload.default_field_metadata.deep_stringify_keys
90
+ .fetch(I18n.locale.to_s, {})
91
+ @alt || default_metadata['alt']
80
92
  end
81
93
 
82
94
  def title
83
- default_metadata = @upload.default_field_metadata.deep_stringify_keys.fetch(I18n.locale.to_s, {})
84
- @title || default_metadata["title"]
95
+ default_metadata = @upload.default_field_metadata.deep_stringify_keys
96
+ .fetch(I18n.locale.to_s, {})
97
+ @title || default_metadata['title']
85
98
  end
86
99
 
87
100
  def custom_data
88
- default_metadata = @upload.default_field_metadata.deep_stringify_keys.fetch(I18n.locale.to_s, {})
89
- @custom_data.merge(default_metadata.fetch("custom_data", {}))
101
+ default_metadata = @upload.default_field_metadata.deep_stringify_keys
102
+ .fetch(I18n.locale.to_s, {})
103
+ @custom_data.merge(default_metadata.fetch('custom_data', {}))
104
+ end
105
+
106
+ def focal_point
107
+ default_metadata = @upload.default_field_metadata.deep_stringify_keys
108
+ .fetch(I18n.locale.to_s, {})
109
+ @focal_point || default_metadata['focal_point']
110
+ end
111
+
112
+ def tags
113
+ @upload.tags
114
+ end
115
+
116
+ def smart_tags
117
+ @upload.smart_tags
118
+ end
119
+
120
+ def is_image
121
+ @upload.is_image
122
+ end
123
+
124
+ def exif_info
125
+ @upload.exif_info
126
+ end
127
+
128
+ def mime_type
129
+ @upload.mime_type
130
+ end
131
+
132
+ def colors
133
+ @upload.colors.map { |color| Color.parse(color, nil) }
134
+ end
135
+
136
+ def blurhash
137
+ @upload.blurhash
138
+ end
139
+
140
+ class VideoAttributes
141
+ def initialize(upload)
142
+ @upload = upload
143
+ end
144
+
145
+ def mux_playback_id
146
+ @upload.mux_playback_id
147
+ end
148
+
149
+ def frame_rate
150
+ @upload.frame_rate
151
+ end
152
+
153
+ def duration
154
+ @upload.duration
155
+ end
156
+
157
+ def streaming_url
158
+ "https://stream.mux.com/#{@upload.mux_playback_id}.m3u8"
159
+ end
160
+
161
+ def thumbnail_url(format = :jpg)
162
+ if format == :gif
163
+ "https://image.mux.com/#{@upload.mux_playback_id}/animated.gif"
164
+ else
165
+ "https://image.mux.com/#{@upload.mux_playback_id}/thumbnail.#{format}"
166
+ end
167
+ end
168
+
169
+ def mp4_url(options = nil)
170
+ @upload.mux_mp4_highest_res or
171
+ return nil
172
+
173
+ if options && options[:exact_res]
174
+ if options[:exact_res] == :low
175
+ raw_mp4_url("low")
176
+ elsif options[:exact_res] == :medium
177
+ if %w[medium high].include?(@upload.mux_mp4_highest_res)
178
+ raw_mp4_url("medium")
179
+ end
180
+ elsif @upload.mux_mp4_highest_res == :high
181
+ raw_mp4_url("high")
182
+ end
183
+ elsif options && options[:res] == :low
184
+ raw_mp4_url("low")
185
+ elsif options && options[:res] == :medium
186
+ if %w[low medium].include?(@upload.mux_mp4_highest_res)
187
+ raw_mp4_url(@upload.mux_mp4_highest_res)
188
+ else
189
+ raw_mp4_url("medium")
190
+ end
191
+ else
192
+ raw_mp4_url(@upload.mux_mp4_highest_res)
193
+ end
194
+ end
195
+
196
+ def to_hash
197
+ {
198
+ mux_playback_id: mux_playback_id,
199
+ frame_rate: frame_rate,
200
+ duration: duration,
201
+ streaming_url: streaming_url,
202
+ thumbnail_url: thumbnail_url,
203
+ mp4_url: mp4_url,
204
+ }
205
+ end
206
+
207
+ private
208
+
209
+ def raw_mp4_url(res)
210
+ "https://stream.mux.com/#{@upload.mux_playback_id}/#{res}.mp4"
211
+ end
212
+ end
213
+
214
+ def video
215
+ if @upload.mux_playback_id
216
+ VideoAttributes.new(@upload)
217
+ end
90
218
  end
91
219
 
92
220
  def file
93
221
  Imgix::Client.new(
94
- host: @imgix_host,
222
+ domain: @imgix_host,
95
223
  secure: true,
96
224
  include_library_param: false
97
225
  ).path(path)
98
226
  end
99
227
 
100
- def url(opts = {})
101
- file.to_url(opts)
228
+ def url(query = {})
229
+ query.deep_stringify_keys!
230
+
231
+ if focal_point &&
232
+ query["fit"] == "crop" &&
233
+ (query["h"] || query["height"]) &&
234
+ (query["w"] || query["width"]) &&
235
+ [nil, "focalpoint"].include?(query["crop"]) &&
236
+ query["fp-x"].nil? &&
237
+ query["fp-y"].nil?
238
+
239
+ query.merge!(
240
+ "crop" => "focalpoint",
241
+ "fp-x" => focal_point[:x],
242
+ "fp-y" => focal_point[:y],
243
+ )
244
+ end
245
+
246
+ file.to_url(query)
247
+ end
248
+
249
+ def lqip_data_url(opts = {})
250
+ @imgix_host != "www.datocms-assets.com" and
251
+ raise "#lqip_data_url can only be used with www.datocms-assets.com domain"
252
+
253
+ response = Faraday.get(file.to_url(opts.merge(lqip: "blurhash")))
254
+
255
+ if response.status == 200
256
+ "data:image/jpeg;base64,#{Base64.strict_encode64(response.body)}"
257
+ end
102
258
  end
103
259
 
104
260
  def to_hash(*_args)
@@ -111,7 +267,19 @@ module Dato
111
267
  alt: alt,
112
268
  title: title,
113
269
  custom_data: custom_data,
114
- url: url
270
+ focal_point: focal_point,
271
+ url: url,
272
+ copyright: copyright,
273
+ tags: tags,
274
+ smart_tags: smart_tags,
275
+ filename: filename,
276
+ basename: basename,
277
+ is_image: is_image,
278
+ exif_info: exif_info,
279
+ mime_type: mime_type,
280
+ colors: colors.map(&:to_hash),
281
+ blurhash: blurhash,
282
+ video: video && video.to_hash
115
283
  }
116
284
  end
117
285
  end
@@ -43,7 +43,7 @@ module Dato
43
43
 
44
44
  def file
45
45
  Imgix::Client.new(
46
- host: @imgix_host,
46
+ domain: @imgix_host,
47
47
  secure: true,
48
48
  include_library_param: false
49
49
  ).path(path)
@@ -43,7 +43,13 @@ module Dato
43
43
 
44
44
  return if pusher && pusher.connected
45
45
 
46
- pusher.subscribe("private-site-#{site_id}")
46
+ channel_name = if client.environment
47
+ "private-site-#{site_id}-environment-#{environment}"
48
+ else
49
+ "private-site-#{site_id}"
50
+ end
51
+
52
+ pusher.subscribe(channel_name)
47
53
 
48
54
  bind_on_site_upsert(&block)
49
55
  bind_on_item_destroy(&block)
@@ -66,7 +72,8 @@ module Dato
66
72
  bind_on("site:upsert", block) do |data|
67
73
  threads = [
68
74
  Thread.new { Thread.current[:output] = site },
69
- Thread.new { Thread.current[:output] = all_items }
75
+ Thread.new { Thread.current[:output] = all_items },
76
+ Thread.new { Thread.current[:output] = all_uploads }
70
77
  ]
71
78
 
72
79
  results = threads.map do |t|
@@ -72,7 +72,7 @@ module Dato
72
72
  end
73
73
  connection.get(url).body
74
74
  rescue Faraday::Error => e
75
- puts "Error during uploading #{url}"
75
+ puts "Error during upload of #{url}: #{e.message}"
76
76
  raise e
77
77
  end
78
78
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dato/json_api_serializer'
4
+
5
+ module Dato
6
+ module Utils
7
+ module BuildModularBlock
8
+ def self.build(unserialized_body)
9
+ json_api_serializer = JsonApiSerializer.new('item', nil)
10
+ attributes = json_api_serializer.serialized_attributes(unserialized_body)
11
+
12
+ payload = {
13
+ type: 'item',
14
+ attributes: attributes,
15
+ relationships: {
16
+ item_type: {
17
+ data: {
18
+ id: unserialized_body[:item_type],
19
+ type: 'item_type',
20
+ },
21
+ },
22
+ },
23
+ }
24
+
25
+ payload[:id] = unserialized_body[:id] if unserialized_body[:id]
26
+
27
+ payload
28
+ end
29
+ end
30
+ end
31
+ end
@@ -28,7 +28,7 @@ module Dato
28
28
  fallback_seo_value = fallback_seo &&
29
29
  fallback_seo.send(attribute)
30
30
 
31
- item_seo_value || alternative || fallback_seo_value
31
+ item_seo_value.presence || alternative.presence || fallback_seo_value
32
32
  end
33
33
 
34
34
  def tag(tag_name, attributes)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dato
4
- VERSION = '0.7.8'
4
+ VERSION = '0.7.15'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dato
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.8
4
+ version: 0.7.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Verna
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-30 00:00:00.000000000 Z
11
+ date: 2020-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry-byebug
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: front_matter_parser
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -238,16 +252,16 @@ dependencies:
238
252
  name: imgix
239
253
  requirement: !ruby/object:Gem::Requirement
240
254
  requirements:
241
- - - ">="
255
+ - - "~>"
242
256
  - !ruby/object:Gem::Version
243
- version: 0.3.1
257
+ version: '4'
244
258
  type: :runtime
245
259
  prerelease: false
246
260
  version_requirements: !ruby/object:Gem::Requirement
247
261
  requirements:
248
- - - ">="
262
+ - - "~>"
249
263
  - !ruby/object:Gem::Version
250
- version: 0.3.1
264
+ version: '4'
251
265
  - !ruby/object:Gem::Dependency
252
266
  name: toml
253
267
  requirement: !ruby/object:Gem::Requirement
@@ -429,6 +443,7 @@ files:
429
443
  - lib/dato/upload/create_upload_path.rb
430
444
  - lib/dato/upload/file.rb
431
445
  - lib/dato/upload/image.rb
446
+ - lib/dato/utils/build_modular_block.rb
432
447
  - lib/dato/utils/favicon_tags_builder.rb
433
448
  - lib/dato/utils/locale_value.rb
434
449
  - lib/dato/utils/meta_tags/article_modified_time.rb
@@ -449,7 +464,7 @@ homepage: https://github.com/datocms/ruby-datocms-client
449
464
  licenses:
450
465
  - MIT
451
466
  metadata: {}
452
- post_install_message:
467
+ post_install_message:
453
468
  rdoc_options: []
454
469
  require_paths:
455
470
  - lib
@@ -464,9 +479,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
464
479
  - !ruby/object:Gem::Version
465
480
  version: '0'
466
481
  requirements: []
467
- rubyforge_project:
482
+ rubyforge_project:
468
483
  rubygems_version: 2.7.6
469
- signing_key:
484
+ signing_key:
470
485
  specification_version: 4
471
486
  summary: Ruby client for DatoCMS API
472
487
  test_files: []