dato 0.2.7 → 0.3.0

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
  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