dato 0.3.31 → 0.4.0.pre

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: eafde098e5144f4fc178a6b9619b3e9239100919
4
- data.tar.gz: dfa6a06f8973b7b50333725b7fce6f7b71e8fdc2
3
+ metadata.gz: f85c8c3d4e34d55aa8964841977e367a733be9a6
4
+ data.tar.gz: 5f28df9e2518781045640b7f6cd5a98f4f4cd6c1
5
5
  SHA512:
6
- metadata.gz: 6ea39c71e65dbc8df2dc91112537b6807fef7c23d44ee40eeace71d2b515da94fe6a58ecce38c84a36276ea1b8c2131c7bd7854520f61bf2cc3b444df69d59ca
7
- data.tar.gz: 76a896629e3ab896ea8fd56fd419b37d7c4678d5e0985674c572c300bd35314e936a232bab31fe99fa35ae92076c1b19febc3a2959148caac9cdd2a29634bd07
6
+ metadata.gz: 3e272ffbaccb62c8ce4f738ba2868adbfa6f200af79ae74d36833f10b7ffee3a82008cc7c047331ba097e1262e3debc2ffa9c77a320b29e0f837cc35f47cfd75
7
+ data.tar.gz: 32a7c6185fad31b06d5a2ce34c78c36c7ad287a3ed2dcb1ff23e0b4ee4d249a17e4dac0d4867c32482150a6d56a6064d60e9b41f335caeb241b128b598380574
@@ -14,10 +14,12 @@ module Dato
14
14
  desc 'dump', 'dumps DatoCMS content into local files'
15
15
  option :config, default: 'dato.config.rb'
16
16
  option :token, default: ENV['DATO_API_TOKEN'], required: true
17
+ option :draft, default: false, type: :boolean
17
18
  option :watch, default: false, type: :boolean
18
19
  def dump
19
20
  config_file = File.expand_path(options[:config])
20
21
  watch_mode = options[:watch]
22
+ draft_mode = options[:draft]
21
23
 
22
24
  client = Dato::Site::Client.new(
23
25
  options[:token],
@@ -44,7 +46,7 @@ module Dato
44
46
 
45
47
  sleep
46
48
  else
47
- Dump::Runner.new(config_file, client).run
49
+ Dump::Runner.new(config_file, client, draft_mode).run
48
50
  end
49
51
  end
50
52
 
@@ -69,20 +71,6 @@ module Dato
69
71
  exit 0
70
72
  end
71
73
 
72
- desc 'migrate-slugs', 'migrates a Site so that it uses slug fields'
73
- option :token, default: ENV['DATO_API_TOKEN'], required: true
74
- option :skip_id_prefix, type: :boolean
75
- def migrate_slugs
76
- client = Dato::Site::Client.new(
77
- options[:token],
78
- extra_headers: {
79
- 'X-Reason' => 'migrate-slugs'
80
- }
81
- )
82
-
83
- MigrateSlugs::Runner.new(client, options[:skip_id_prefix]).run
84
- end
85
-
86
74
  no_tasks do
87
75
  def watch_config_file(config_file, &block)
88
76
  Listen.to(
@@ -7,10 +7,11 @@ require 'dato/local/loader'
7
7
  module Dato
8
8
  module Dump
9
9
  class Runner
10
- attr_reader :config_path, :client, :destination_path
10
+ attr_reader :config_path, :client, :destination_path, :draft_mode
11
11
 
12
- def initialize(config_path, client, destination_path = Dir.pwd)
12
+ def initialize(config_path, client, draft_mode, destination_path = Dir.pwd)
13
13
  @config_path = config_path
14
+ @draft_mode = draft_mode
14
15
  @client = client
15
16
  @destination_path = destination_path
16
17
  end
@@ -39,7 +40,7 @@ module Dato
39
40
  end
40
41
 
41
42
  def loader
42
- @loader ||= Dato::Local::Loader.new(client)
43
+ @loader ||= Dato::Local::Loader.new(client, draft_mode)
43
44
  end
44
45
  end
45
46
  end
@@ -13,7 +13,10 @@ module Dato
13
13
 
14
14
  def deserialize_resource(data)
15
15
  result = { id: data[:id] }
16
- result.merge!(data[:attributes])
16
+
17
+ if data[:attributes]
18
+ result.merge!(data[:attributes])
19
+ end
17
20
 
18
21
  relationships = data.delete(:relationships)
19
22
 
@@ -8,9 +8,11 @@ module Dato
8
8
  attr_reader :client
9
9
  attr_reader :entities_repo
10
10
  attr_reader :items_repo
11
+ attr_reader :draft_mode
11
12
 
12
- def initialize(client)
13
+ def initialize(client, draft_mode = false)
13
14
  @client = client
15
+ @draft_mode = draft_mode
14
16
  @entities_repo = EntitiesRepo.new
15
17
  @items_repo = ItemsRepo.new(@entities_repo)
16
18
  end
@@ -23,15 +25,16 @@ module Dato
23
25
  private
24
26
 
25
27
  def site
26
- include = [
27
- 'item_types',
28
- 'item_types.fields'
29
- ]
28
+ include = ['item_types', 'item_types.fields']
30
29
  client.request(:get, '/site', include: include)
31
30
  end
32
31
 
33
32
  def all_items
34
- client.items.all({}, deserialize_response: false, all_pages: true)
33
+ client.items.all(
34
+ { version: draft_mode ? 'current' : 'published' },
35
+ deserialize_response: false,
36
+ all_pages: true
37
+ )
35
38
  end
36
39
  end
37
40
  end
@@ -6,7 +6,7 @@ module Dato
6
6
  end
7
7
 
8
8
  def response
9
- items_per_page = 100
9
+ items_per_page = 500
10
10
 
11
11
  base_response = @client.request(
12
12
  :get, @base_endpoint, @filters.dup.merge('page[limit]' => items_per_page)
@@ -28,7 +28,8 @@ module Dato
28
28
  :created_at,
29
29
  :is_valid,
30
30
  :item_type,
31
- :published_version
31
+ :published_version,
32
+ :current_version
32
33
  )
33
34
 
34
35
  body = JsonApiSerializer.new(
@@ -39,6 +40,14 @@ module Dato
39
40
  put_request "/items/#{item_id}", body
40
41
  end
41
42
 
43
+ def publish(item_id)
44
+ put_request "/items/#{item_id}/publish", {}
45
+ end
46
+
47
+ def unpublish(item_id)
48
+ put_request "/items/#{item_id}/unpublish", {}
49
+ end
50
+
42
51
  def all(filters = {}, options = {})
43
52
  options.symbolize_keys!
44
53
 
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Dato
3
- VERSION = '0.3.31'
3
+ VERSION = '0.4.0.pre'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dato
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.31
4
+ version: 0.4.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Verna
@@ -420,7 +420,6 @@ files:
420
420
  - lib/dato/local/json_api_entity.rb
421
421
  - lib/dato/local/loader.rb
422
422
  - lib/dato/local/site.rb
423
- - lib/dato/migrate_slugs/runner.rb
424
423
  - lib/dato/site/client.rb
425
424
  - lib/dato/site/paginator.rb
426
425
  - lib/dato/site/repo/access_token.rb
@@ -470,9 +469,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
470
469
  version: '0'
471
470
  required_rubygems_version: !ruby/object:Gem::Requirement
472
471
  requirements:
473
- - - ">="
472
+ - - ">"
474
473
  - !ruby/object:Gem::Version
475
- version: '0'
474
+ version: 1.3.1
476
475
  requirements: []
477
476
  rubyforge_project:
478
477
  rubygems_version: 2.5.1
@@ -1,155 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'dato/json_api_deserializer'
3
- require 'active_support/inflector/transliterate'
4
-
5
- module Dato
6
- module MigrateSlugs
7
- class Runner
8
- attr_reader :client, :skip_id_prefix
9
-
10
- def initialize(client, skip_id_prefix)
11
- @client = client
12
- @skip_id_prefix = skip_id_prefix
13
- end
14
-
15
- def run
16
- print 'Fetching site informations... '
17
- title_fields
18
- puts "\e[32m✓\e[0m"
19
-
20
- title_fields.each do |title_field|
21
- item_type = item_types.find do |i|
22
- i['id'] == title_field['item_type']
23
- end
24
-
25
- print "Adding slug field to Item type `#{item_type['name']}`... "
26
- add_slug_field(title_field)
27
- puts "\e[32m✓\e[0m"
28
-
29
- items = items_for(title_field['item_type'])
30
- print "Generating slugs for #{items.count} items"
31
-
32
- items.each do |item|
33
- update_item(title_field, item)
34
- print '.'
35
- end
36
- puts "\e[32m✓\e[0m"
37
-
38
- puts
39
- end
40
- end
41
-
42
- def simple_slugify(item, title, suffix)
43
- return nil unless title
44
-
45
- slug = title.parameterize[0..50].gsub(/(^\-|\-$)/, '')
46
- skip_id_prefix ? "#{slug}#{suffix}" : "#{item['id']}-#{slug}#{suffix}"
47
- end
48
-
49
- def slugify(item, title, suffix)
50
- if title.is_a?(Hash)
51
- Hash[
52
- title.map do |locale, value|
53
- [locale, simple_slugify(item, value, suffix)]
54
- end
55
- ]
56
- else
57
- simple_slugify(item, title, suffix)
58
- end
59
- end
60
-
61
- def update_item(title_field, item)
62
- title = item[title_field['api_key']]
63
- counter = 0
64
-
65
- loop do
66
- begin
67
- slug = slugify(item, title, counter.zero? ? '' : "-#{counter}")
68
- return client.items.update(item['id'], item.merge(slug: slug))
69
- rescue ApiError => e
70
- error = e.body['data'][0]
71
-
72
- if error['id'] == 'INVALID_FIELD' &&
73
- error['attributes']['details']['field'] == 'slug' &&
74
- error['attributes']['details']['code'] == 'VALIDATION_UNIQUE'
75
-
76
- counter += 1
77
- else
78
- raise e
79
- end
80
- end
81
- end
82
- end
83
-
84
- def items_for(item_type_id)
85
- items_per_page = 500
86
- base_response = client.request(
87
- :get,
88
- '/items',
89
- 'page[limit]' => 500,
90
- 'filter[type]' => item_type_id
91
- )
92
-
93
- extra_pages = (
94
- base_response[:meta][:total_count] / items_per_page.to_f
95
- ).ceil - 1
96
-
97
- extra_pages.times do |page|
98
- base_response[:data] += client.request(
99
- :get,
100
- '/items',
101
- 'page[offset]' => items_per_page * (page + 1),
102
- 'page[limit]' => items_per_page
103
- )[:data]
104
- end
105
-
106
- JsonApiDeserializer.new.deserialize(base_response)
107
- end
108
-
109
- def add_slug_field(field)
110
- validators = {
111
- unique: {}
112
- }
113
-
114
- validators[:required] = {} if field['validators']['required']
115
-
116
- slug_field = client.fields.create(
117
- field['item_type'],
118
- field_type: 'slug',
119
- appeareance: { title_field_id: field['id'] },
120
- validators: validators,
121
- position: 99,
122
- api_key: 'slug',
123
- label: 'Slug',
124
- hint: '',
125
- localized: field['localized']
126
- )
127
-
128
- client.fields.update(
129
- slug_field['id'],
130
- position: field['position'] + 1
131
- )
132
- end
133
-
134
- def title_fields
135
- @title_fields ||= item_types.map do |item_type|
136
- fields = client.fields.all(item_type['id'])
137
-
138
- any_slug_present = fields.any? do |f|
139
- f['field_type'] == 'slug' || f['api_key'] == 'slug'
140
- end
141
-
142
- next if any_slug_present
143
- fields.find do |field|
144
- field['field_type'] == 'string' &&
145
- field['appeareance']['type'] == 'title'
146
- end
147
- end.compact
148
- end
149
-
150
- def item_types
151
- @item_types ||= client.item_types.all
152
- end
153
- end
154
- end
155
- end