dato 0.3.31 → 0.4.0.pre

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