dato 0.2.7 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 186f63cfff368069213a4dd2e8b0659c03c940a1
4
- data.tar.gz: c3ddd98a4638451b2f18b076c352b28cede76976
3
+ metadata.gz: e8bd9232f5d7494629388a5faf7e29af279a3892
4
+ data.tar.gz: 4a2a9ce729001fac5cbbaefe1066693e4bac0848
5
5
  SHA512:
6
- metadata.gz: 3569cada67d3a8b46d6f1092d0184dc9be5a460ef87b8ddd5fb5ef3673e17363cda25b99adbea35f7d356a966a7780d79e74af045c621e30fa44c08226a7f96f
7
- data.tar.gz: 9db4bd3512b4543ccfb607063ae381ab1c98c2d76596fa2eab5d9f15bee1a94a8cfda6dcf327d4eb0d1e448712f83149f6a801fc181453ffcb9ea58ff34abbf6
6
+ metadata.gz: 10bcef46db03d23cdf7ee723b01e19a50a878ac5d707890adbad735dff3c11f9b2105a6b9f8d850e6938bce665b403c69a073b1d6cf4df03922818f6dcb38c42
7
+ data.tar.gz: 6fafa7598ffab0f0939c08664fb9531c89ba1a31836a54f64102cc2b60841c94f802afcb6031068e600ea5a10b2910ef849b3188aa89931c1cb3f7b57aa10e36
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
- --format documentation
1
+ --format progress
2
2
  --color
@@ -21,7 +21,7 @@ Metrics/ModuleLength:
21
21
  Enabled: false
22
22
 
23
23
  Metrics/CyclomaticComplexity:
24
- Max: 7
24
+ Max: 8
25
25
 
26
26
  Metrics/AbcSize:
27
27
  Max: 30
@@ -1 +1 @@
1
- 2.2.2
1
+ 2.3.1
@@ -43,4 +43,5 @@ Gem::Specification.new do |spec|
43
43
  spec.add_runtime_dependency 'video_embed'
44
44
  spec.add_runtime_dependency 'toml'
45
45
  spec.add_runtime_dependency 'cacert'
46
+ spec.add_runtime_dependency 'dotenv'
46
47
  end
@@ -117,4 +117,5 @@ client.upload_file(path_or_url)
117
117
  client.users.create(resource_attributes)
118
118
  client.users.all
119
119
  client.users.find(user_id)
120
+ client.users.destroy(user_id)
120
121
  ```
data/exe/dato CHANGED
@@ -4,4 +4,7 @@
4
4
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
5
5
 
6
6
  require 'dato'
7
+ require 'dotenv'
8
+
9
+ Dotenv.load
7
10
  Dato::Cli.start(ARGV)
@@ -5,6 +5,8 @@ require 'dato/site/client'
5
5
  require 'dato/account/client'
6
6
  require 'dato/local/site'
7
7
  require 'dato/cli'
8
+ require 'dato/utils/seo_tags_builder'
9
+ require 'dato/utils/favicon_tags_builder'
8
10
 
9
11
  module Dato
10
12
  end
@@ -16,6 +16,8 @@ module Dato
16
16
 
17
17
  def perform
18
18
  complete_path = File.join(context.path, path)
19
+ FileUtils.mkdir_p(File.dirname(complete_path))
20
+
19
21
  content_to_add = Format.dump(format, value)
20
22
 
21
23
  old_content = if File.exist? complete_path
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'fileutils'
2
3
  require 'dato/dump/format'
3
4
 
4
5
  module Dato
@@ -15,6 +16,8 @@ module Dato
15
16
  end
16
17
 
17
18
  def perform
19
+ FileUtils.mkdir_p(File.dirname(path))
20
+
18
21
  File.open(File.join(context.path, path), 'w') do |file|
19
22
  file.write Format.dump(format, value)
20
23
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'fileutils'
2
3
  require 'dato/dump/format'
3
4
 
4
5
  module Dato
@@ -16,6 +17,8 @@ module Dato
16
17
  end
17
18
 
18
19
  def perform
20
+ FileUtils.mkdir_p(File.dirname(path))
21
+
19
22
  File.open(File.join(context.path, path), 'w') do |file|
20
23
  file.write Format.frontmatter_dump(
21
24
  frontmatter_format,
@@ -24,7 +24,8 @@ module Dato
24
24
  def file(host = default_host)
25
25
  Imgix::Client.new(
26
26
  host: host,
27
- secure: true
27
+ secure: true,
28
+ include_library_param: false
28
29
  ).path(path)
29
30
  end
30
31
 
@@ -23,8 +23,10 @@ module Dato
23
23
  @height = height
24
24
  end
25
25
 
26
+ alias raw_file file
27
+
26
28
  def file(host = default_host)
27
- super.ch('DPR', 'Width').auto('compress', 'format')
29
+ super.ch('DPR', 'Width').auto('format')
28
30
  end
29
31
 
30
32
  def to_hash
@@ -13,7 +13,7 @@ module Dato
13
13
  extend Forwardable
14
14
 
15
15
  attr_reader :entity
16
- def_delegators :entity, :id, :type, :item_type
16
+ def_delegators :entity, :id
17
17
 
18
18
  def initialize(entity, items_repo)
19
19
  @entity = entity
@@ -52,6 +52,10 @@ module Dato
52
52
  end
53
53
  end
54
54
 
55
+ def seo_meta_tags
56
+ Utils::SeoTagsBuilder.new(self, @items_repo.site).meta_tags
57
+ end
58
+
55
59
  def singleton?
56
60
  item_type.singleton
57
61
  end
@@ -50,9 +50,9 @@ module Dato
50
50
  end
51
51
 
52
52
  def items_of_type(item_type)
53
- method, singleton = item_type_methods[item_type]
53
+ method = item_type_methods[item_type]
54
54
 
55
- if singleton
55
+ if item_type.singleton
56
56
  Array(@collections_by_type[method])
57
57
  else
58
58
  @collections_by_type[method]
@@ -64,6 +64,7 @@ module Dato
64
64
  def build_cache!
65
65
  build_item_type_methods!
66
66
  build_collections_by_type!
67
+ build_singletons_by_type!
67
68
  end
68
69
 
69
70
  def build_item_type_methods!
@@ -76,24 +77,27 @@ module Dato
76
77
  clashing_keys = singleton_keys & collection_keys
77
78
 
78
79
  item_types.each do |item_type|
79
- singleton = item_type.singleton
80
80
  pluralized_api_key = item_type.api_key.pluralize
81
- method = singleton ? item_type.api_key : pluralized_api_key
81
+
82
+ method = if item_type.singleton
83
+ item_type.api_key
84
+ else
85
+ pluralized_api_key
86
+ end
82
87
 
83
88
  if clashing_keys.include?(pluralized_api_key)
84
- suffix = singleton ? 'instance' : 'collection'
89
+ suffix = item_type.singleton ? 'instance' : 'collection'
85
90
  method = "#{method}_#{suffix}"
86
91
  end
87
92
 
88
- @item_type_methods[item_type] = [method.to_sym, singleton]
93
+ @item_type_methods[item_type] = method.to_sym
89
94
  end
90
95
  end
91
96
 
92
97
  def build_collections_by_type!
93
98
  item_types.each do |item_type|
94
- method, singleton = item_type_methods[item_type]
95
-
96
- @collections_by_type[method] = if singleton
99
+ method = item_type_methods[item_type]
100
+ @collections_by_type[method] = if item_type.singleton
97
101
  nil
98
102
  else
99
103
  ItemCollection.new
@@ -102,16 +106,30 @@ module Dato
102
106
 
103
107
  item_entities.each do |item_entity|
104
108
  item = Item.new(item_entity, self)
105
- method, singleton = item_type_methods[item_entity.item_type]
109
+ method = item_type_methods[item_entity.item_type]
106
110
 
107
- if singleton
108
- @collections_by_type[method] = item
109
- else
111
+ unless item_entity.item_type.singleton
110
112
  @collections_by_type[method].push item
111
113
  end
112
114
 
113
115
  @items_by_id[item.id] = item
114
116
  end
117
+
118
+ item_types.each do |item_type|
119
+ method = item_type_methods[item_type]
120
+ if !item_type.singleton && item_type.sortable
121
+ @collections_by_type[method].sort_by!(&:position)
122
+ end
123
+ end
124
+ end
125
+
126
+ def build_singletons_by_type!
127
+ item_types.each do |item_type|
128
+ method = item_type_methods[item_type]
129
+ if item_type.singleton
130
+ @collections_by_type[method] = @items_by_id[item_type.singleton_item.id]
131
+ end
132
+ end
115
133
  end
116
134
 
117
135
  def item_entities
@@ -25,10 +25,14 @@ module Dato
25
25
  end
26
26
 
27
27
  def to_s
28
- "#<Site id=#{id} site_name=#{site_name}>"
28
+ "#<Site id=#{id} site_name=#{name}>"
29
29
  end
30
30
  alias inspect to_s
31
31
 
32
+ def favicon_meta_tags(theme_color = nil)
33
+ Utils::FaviconTagsBuilder.new(self, theme_color).meta_tags
34
+ end
35
+
32
36
  def to_hash
33
37
  attributes = [
34
38
  :id, :name, :locales, :theme_hue, :domain, :internal_domain,
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+ module Dato
3
+ module Utils
4
+ class FaviconTagsBuilder
5
+ attr_reader :theme_color, :site
6
+
7
+ APPLE_TOUCH_ICON_SIZES = [57, 60, 72, 76, 114, 120, 144, 152, 180].freeze
8
+ ICON_SIZES = [16, 32, 96, 192].freeze
9
+ WINDOWS_SIZES = [[70, 70], [150, 150], [310, 310], [310, 150]].freeze
10
+
11
+ def initialize(site, theme_color)
12
+ @site = site
13
+ @theme_color = theme_color
14
+ end
15
+
16
+ def meta_tags
17
+ [
18
+ build_icon_tags,
19
+ build_apple_icon_tags,
20
+ build_windows_tags,
21
+ build_color_tags,
22
+ build_app_name_tag
23
+ ].flatten.compact
24
+ end
25
+
26
+ def build_apple_icon_tags
27
+ return unless site.favicon
28
+
29
+ APPLE_TOUCH_ICON_SIZES.map do |size|
30
+ link_tag(
31
+ 'apple-touch-icon',
32
+ url(size),
33
+ sizes: "#{size}x#{size}"
34
+ )
35
+ end
36
+ end
37
+
38
+ def build_icon_tags
39
+ return unless site.favicon
40
+
41
+ ICON_SIZES.map do |size|
42
+ link_tag(
43
+ 'icon',
44
+ url(size),
45
+ sizes: "#{size}x#{size}",
46
+ type: "image/#{site.favicon.format}"
47
+ )
48
+ end
49
+ end
50
+
51
+ def build_windows_tags
52
+ return unless site.favicon
53
+
54
+ WINDOWS_SIZES.map do |(w, h)|
55
+ meta_tag("msapplication-square#{w}x#{h}logo", url(w, h))
56
+ end
57
+ end
58
+
59
+ def build_app_name_tag
60
+ meta_tag('application-name', site.name)
61
+ end
62
+
63
+ def build_color_tags
64
+ return unless theme_color
65
+
66
+ [
67
+ meta_tag('theme-color', theme_color),
68
+ meta_tag('msapplication-TileColor', theme_color)
69
+ ]
70
+ end
71
+
72
+ def url(width, height = width)
73
+ site.favicon.url(w: width, h: height)
74
+ end
75
+
76
+ def meta_tag(name, value)
77
+ { tag_name: 'meta', attributes: { name: name, content: value } }
78
+ end
79
+
80
+ def link_tag(rel, href, attrs = {})
81
+ { tag_name: 'link', attributes: attrs.merge(rel: rel, href: href) }
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+ require 'time'
4
+
5
+ module Dato
6
+ module Utils
7
+ module MetaTags
8
+ class ArticleModifiedTime < Base
9
+ def build
10
+ og_tag('article:modified_time', item.updated_at.iso8601) if item
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class ArticlePublisher < Base
8
+ def build
9
+ og_tag('article:publisher', facebook_page_url) if facebook_page_url
10
+ end
11
+
12
+ def facebook_page_url
13
+ site.global_seo && site.global_seo.facebook_page_url
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ require 'forwardable'
3
+ require 'dato/local/field_type/seo'
4
+ require 'active_support/core_ext/object/blank'
5
+
6
+ module Dato
7
+ module Utils
8
+ module MetaTags
9
+ class Base
10
+ attr_reader :site, :item
11
+
12
+ def initialize(item, site)
13
+ @item = item
14
+ @site = site
15
+ end
16
+
17
+ def seo_field_with_fallback(attribute, alternative)
18
+ fallback_seo = site.global_seo && site.global_seo.fallback_seo
19
+
20
+ seo_field = item &&
21
+ item.fields.detect { |f| f.field_type == 'seo' }
22
+
23
+ item_seo_value = seo_field &&
24
+ item.send(seo_field.api_key) &&
25
+ item.send(seo_field.api_key).send(attribute)
26
+
27
+ fallback_seo_value = fallback_seo &&
28
+ fallback_seo.send(attribute)
29
+
30
+ item_seo_value || alternative || fallback_seo_value
31
+ end
32
+
33
+ def tag(tag_name, attributes)
34
+ { tag_name: tag_name, attributes: attributes }
35
+ end
36
+
37
+ def meta_tag(name, content)
38
+ tag('meta', name: name, content: content)
39
+ end
40
+
41
+ def og_tag(property, content)
42
+ tag('meta', property: property, content: content)
43
+ end
44
+
45
+ def card_tag(name, content)
46
+ meta_tag(name, content)
47
+ end
48
+
49
+ def content_tag(tag_name, content)
50
+ { tag_name: tag_name, content: content }
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class Description < Base
8
+ def build
9
+ return unless description.present?
10
+
11
+ [
12
+ meta_tag('description', description),
13
+ og_tag('og:description', description),
14
+ card_tag('twitter:description', description)
15
+ ]
16
+ end
17
+
18
+ def description
19
+ @description ||= seo_field_with_fallback(:description, nil)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class Image < Base
8
+ def build
9
+ return unless image
10
+
11
+ [
12
+ og_tag('og:image', image.url),
13
+ card_tag('twitter:image', image.url)
14
+ ]
15
+ end
16
+
17
+ def image
18
+ @image ||= seo_field_with_fallback(:image, item_image)
19
+ end
20
+
21
+ def item_image
22
+ item && item.fields
23
+ .select { |field| field.field_type == 'image' }
24
+ .map { |field| item.send(field.api_key) }
25
+ .compact
26
+ .find do |image|
27
+ image.width >= 200 && image.height >= 200
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class OgLocale < Base
8
+ def build
9
+ locale = I18n.locale
10
+ og_tag('og:locale', "#{locale}_#{locale.upcase}")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class OgSiteName < Base
8
+ def build
9
+ card_tag('og:site_name', site_name) if site_name
10
+ end
11
+
12
+ def site_name
13
+ site.global_seo && site.global_seo.site_name
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class OgType < Base
8
+ def build
9
+ if !item || item.singleton?
10
+ og_tag('og:type', 'website')
11
+ else
12
+ og_tag('og:type', 'article')
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class Robots < Base
8
+ def build
9
+ meta_tag('robots', 'noindex') if site.no_index
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class Title < Base
8
+ def build
9
+ return unless item_title
10
+
11
+ [
12
+ content_tag('title', item_title_with_suffix),
13
+ og_tag('og:title', item_title),
14
+ card_tag('twitter:title', item_title)
15
+ ]
16
+ end
17
+
18
+ def title_field
19
+ item && item.fields.find do |field|
20
+ field.field_type == 'string' &&
21
+ field.appeareance[:type] == 'title'
22
+ end
23
+ end
24
+
25
+ def item_title
26
+ @item_title ||= seo_field_with_fallback(
27
+ :title,
28
+ title_field && item.send(title_field.api_key)
29
+ )
30
+ end
31
+
32
+ def suffix
33
+ (site.global_seo && site.global_seo.title_suffix) || ''
34
+ end
35
+
36
+ def item_title_with_suffix
37
+ if (item_title + suffix).size <= 60
38
+ item_title + suffix
39
+ else
40
+ item_title
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class TwitterCard < Base
8
+ def build
9
+ card_tag('twitter:card', 'summary')
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/base'
3
+
4
+ module Dato
5
+ module Utils
6
+ module MetaTags
7
+ class TwitterSite < Base
8
+ def build
9
+ card_tag('twitter:site', twitter_account) if twitter_account
10
+ end
11
+
12
+ def twitter_account
13
+ site.global_seo && site.global_seo.twitter_account
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+ require 'dato/utils/meta_tags/title'
3
+ require 'dato/utils/meta_tags/description'
4
+ require 'dato/utils/meta_tags/image'
5
+ require 'dato/utils/meta_tags/robots'
6
+ require 'dato/utils/meta_tags/og_locale'
7
+ require 'dato/utils/meta_tags/og_type'
8
+ require 'dato/utils/meta_tags/og_site_name'
9
+ require 'dato/utils/meta_tags/article_modified_time'
10
+ require 'dato/utils/meta_tags/article_publisher'
11
+ require 'dato/utils/meta_tags/twitter_card'
12
+ require 'dato/utils/meta_tags/twitter_site'
13
+
14
+ module Dato
15
+ module Utils
16
+ class SeoTagsBuilder
17
+ META_TAGS = [
18
+ MetaTags::Title,
19
+ MetaTags::Description,
20
+ MetaTags::Image,
21
+ MetaTags::Robots,
22
+ MetaTags::OgLocale,
23
+ MetaTags::OgType,
24
+ MetaTags::OgSiteName,
25
+ MetaTags::ArticleModifiedTime,
26
+ MetaTags::ArticlePublisher,
27
+ MetaTags::TwitterCard,
28
+ MetaTags::TwitterSite
29
+ ].freeze
30
+
31
+ attr_reader :site, :item
32
+
33
+ def initialize(item, site)
34
+ @item = item
35
+ @site = site
36
+ end
37
+
38
+ def meta_tags
39
+ META_TAGS.map do |klass|
40
+ klass.new(item, site).build
41
+ end.flatten.compact
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Dato
3
- VERSION = '0.2.7'
3
+ VERSION = '0.3.0'
4
4
  end
@@ -0,0 +1,36 @@
1
+ require 'pusher-client'
2
+
3
+ module Dato
4
+ module Watch
5
+ class SiteChangeWatcher
6
+ attr_reader :site_id
7
+
8
+ PUSHER_API_KEY = '75e6ef0fe5d39f481626'
9
+
10
+ def initialize(site_id)
11
+ PusherClient.logger.level = Logger::WARN
12
+ @site_id = site_id
13
+ @socket = nil
14
+ end
15
+
16
+ def connect(&block)
17
+ return if connected?
18
+
19
+ @socket = PusherClient::Socket.new(PUSHER_API_KEY, secure: true)
20
+ @socket.subscribe("site-#{site_id}")
21
+ @socket.bind('site:change', &block)
22
+ @socket.connect(true)
23
+
24
+ self
25
+ end
26
+
27
+ def connected?
28
+ @socket && @socket.connected
29
+ end
30
+
31
+ def disconnect!
32
+ connected? && @socket.disconnect
33
+ end
34
+ end
35
+ end
36
+ 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.2.7
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Verna
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-11-22 00:00:00.000000000 Z
11
+ date: 2016-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -318,6 +318,20 @@ dependencies:
318
318
  - - ">="
319
319
  - !ruby/object:Gem::Version
320
320
  version: '0'
321
+ - !ruby/object:Gem::Dependency
322
+ name: dotenv
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ type: :runtime
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
321
335
  description: Ruby client for DatoCMS API
322
336
  email:
323
337
  - s.verna@cantierecreativo.net
@@ -403,7 +417,22 @@ files:
403
417
  - lib/dato/site/repo/user.rb
404
418
  - lib/dato/upload/file.rb
405
419
  - lib/dato/upload/image.rb
420
+ - lib/dato/utils/favicon_tags_builder.rb
421
+ - lib/dato/utils/meta_tags/article_modified_time.rb
422
+ - lib/dato/utils/meta_tags/article_publisher.rb
423
+ - lib/dato/utils/meta_tags/base.rb
424
+ - lib/dato/utils/meta_tags/description.rb
425
+ - lib/dato/utils/meta_tags/image.rb
426
+ - lib/dato/utils/meta_tags/og_locale.rb
427
+ - lib/dato/utils/meta_tags/og_site_name.rb
428
+ - lib/dato/utils/meta_tags/og_type.rb
429
+ - lib/dato/utils/meta_tags/robots.rb
430
+ - lib/dato/utils/meta_tags/title.rb
431
+ - lib/dato/utils/meta_tags/twitter_card.rb
432
+ - lib/dato/utils/meta_tags/twitter_site.rb
433
+ - lib/dato/utils/seo_tags_builder.rb
406
434
  - lib/dato/version.rb
435
+ - lib/dato/watch/site_change_watcher.rb
407
436
  homepage: https://github.com/datocms/ruby-datocms-client
408
437
  licenses:
409
438
  - MIT
@@ -424,7 +453,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
424
453
  version: '0'
425
454
  requirements: []
426
455
  rubyforge_project:
427
- rubygems_version: 2.4.5
456
+ rubygems_version: 2.5.1
428
457
  signing_key:
429
458
  specification_version: 4
430
459
  summary: Ruby client for DatoCMS API