jekyll-contentful-data-import 1.2.1 → 1.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: 16c03521fa21f10014b5e71459b53865e1da9aac
4
- data.tar.gz: 53ef74f05c7123a7af50fb683f6f1c8db943740c
3
+ metadata.gz: 1babd5463d86525723186512d0a5ff1788b032c8
4
+ data.tar.gz: beedb4ade62bd19fa81a27afaf28070113018906
5
5
  SHA512:
6
- metadata.gz: 27be80ec515ad6464e1ef00414a4a9e86c893ba1a535b5823980cce0eaadeb7572ee391125ee56c1f444e31701f351d3c625a029a69899d78aeaf77c663f28e2
7
- data.tar.gz: 228eb4426ad9bd597dff4f064a290683621925ea928b3e1eaae74157743cc13552232991ec144924b4e5004212d1be6aa3c2bb75a95a1cde4fcdae0ca0964128
6
+ metadata.gz: 5757f7558659b94941ac13d42750943c428b0827eac1eb0d5c7465447676d84a8a3bcca25e14ee699d66c2ee620edd31162aeff9ac89551ac2f7b32c5de1aed1
7
+ data.tar.gz: 391ff1027438166c09188e906e334cb04ef99acdd0987e4417a54c5cb1b41d01e8de6511e0a27b351fc7dba7728d9e9fcc8b851025dfb5553dd4411cd5001a9a
@@ -1,6 +1,13 @@
1
1
  # Change Log
2
+
2
3
  ## Unreleased
3
4
 
5
+ ## v1.3.0
6
+ ### Added
7
+ * Added the possibility to use `space` and `access_token` from environment variables [#14](https://github.com/contentful/jekyll-contentful-data-import/issues/14)
8
+ * `all_entries` option to fetch entries over the 1000 limit of a single CDA request
9
+ * `all_entries_page_size` option to customize the size of the request for particularly heavy entries
10
+
4
11
  ## v1.2.1
5
12
  ### Fixed
6
13
  * README showing incorrect configuration [#5](https://github.com/contentful/jekyll-contentful-data-import/issues/5)
data/README.md CHANGED
@@ -42,27 +42,31 @@ To configure the extension, add the following configuration block to Jekyll's `_
42
42
  contentful:
43
43
  spaces:
44
44
  - example: # Jekyll _data folder identifier - Required
45
- space: cfexampleapi # Required
46
- access_token: b4c0n73n7fu1 # Required
47
- cda_query: # Optional
45
+ space: cfexampleapi # Required
46
+ access_token: b4c0n73n7fu1 # Required
47
+ cda_query: # Optional
48
48
  include: 2
49
49
  limit: 100
50
- content_types: # Optional
50
+ all_entries: true # Optional - Defaults to false, only grabbing the amount set on CDA Query
51
+ all_entries_page_size: 1000 # Optional - Defaults to 1000, maximum amount of entries per CDA Request for all_entries
52
+ content_types: # Optional
51
53
  cat: MyCoolMapper
52
- client_options: # Optional
54
+ client_options: # Optional
53
55
  api_url: 'preview.contentful.com' # Defaults to 'api.contentful.com' which is Production
54
- base_path: app_path # Optional - Defaults to Current directory
56
+ base_path: app_path # Optional - Defaults to Current directory
55
57
 
56
58
  ```
57
59
 
58
- Parameter | Description
59
- ---------- | ------------
60
- space | Contentful Space ID
61
- access_token | Contentful Delivery API access token
62
- cda_query | Hash describing query configuration. See [contentful.rb](https://github.com/contentful/contentful.rb) for more info (look for filter options there). Note that by default only 100 entries will be fetched, this can be configured to up to 1000 entries using the `limit` option.
63
- content_types | Hash describing the mapping applied to entries of the imported content types
64
- client_options | Hash describing Contentful::Client configuration. See [contentful.rb](https://github.com/contentful/contentful.rb) for more info.
65
- base_path | String with path to your Jekyll Application, defaults to current directory. Path is relative to your current location.
60
+ Parameter | Description
61
+ ---------- | ------------
62
+ space | Contentful Space ID
63
+ access_token | Contentful Delivery API access token
64
+ cda_query | Hash describing query configuration. See [contentful.rb](https://github.com/contentful/contentful.rb) for more info (look for filter options there). Note that by default only 100 entries will be fetched, this can be configured to up to 1000 entries using the `limit` option.
65
+ all_entries | Boolean, if true will run multiple queries to the API until it fetches all entries for the space
66
+ all_entries_page_size | Integer, the amount of maximum entries per CDA Request when fetching :all_entries
67
+ content_types | Hash describing the mapping applied to entries of the imported content types
68
+ client_options | Hash describing Contentful::Client configuration. See [contentful.rb](https://github.com/contentful/contentful.rb) for more info.
69
+ base_path | String with path to your Jekyll Application, defaults to current directory. Path is relative to your current location.
66
70
 
67
71
  You can add multiple spaces to your configuration
68
72
 
@@ -95,6 +99,27 @@ class MySysMapper < ::Jekyll::Contentful::Mappers::Base
95
99
  end
96
100
  ```
97
101
 
102
+ ### Hiding Space and Access Token in Public Repositories
103
+
104
+ In most cases you may want to avoid including your credentials in publicly available sites,
105
+ therefore you can hide your `space` and `access_token` by replacing them with `ENV_` prepended variables.
106
+
107
+ This will look for the values in your system.
108
+
109
+ For example:
110
+
111
+ ```yaml
112
+ contentful:
113
+ spaces:
114
+ - example:
115
+ space: ENV_CONTENTFUL_SPACE_ID
116
+ access_token: ENV_CONTENTFUL_ACCESS_TOKEN
117
+ ```
118
+
119
+ With this setup, your Space ID will be looked upon on `ENV['CONTENTFUL_SPACE_ID']` and your Access Token
120
+ on `ENV['CONTENTFUL_ACCESS_TOKEN']`. This way it is safe to share your code, without having to worry
121
+ about your credentials.
122
+
98
123
  #### Caveats
99
124
 
100
125
  Jekyll itself only allows you to import code as plugins only for its recognized plugin entry points.
@@ -13,23 +13,49 @@ module Jekyll
13
13
  def run
14
14
  spaces.each do |name, options|
15
15
  space_client = client(
16
- options['space'],
17
- options['access_token'],
16
+ value_for(options, 'space'),
17
+ value_for(options, 'access_token'),
18
18
  client_options(options.fetch('client_options', {}))
19
19
  )
20
20
 
21
21
  Jekyll::Contentful::DataExporter.new(
22
22
  name,
23
- space_client.entries(options.fetch('cda_query', {})),
23
+ get_entries(space_client, options),
24
24
  options
25
25
  ).run
26
26
  end
27
27
  end
28
28
 
29
+ def value_for(options, key)
30
+ potential_value = options[key]
31
+ return ENV[potential_value.gsub('ENV_', '')] if potential_value.start_with?('ENV_')
32
+ potential_value
33
+ end
34
+
29
35
  def spaces
30
36
  config['spaces'].map { |space_data| space_data.first }
31
37
  end
32
38
 
39
+ def get_entries(space_client, options)
40
+ cda_query = options.fetch('cda_query', {})
41
+ return space_client.entries(cda_query) unless options.fetch('all_entries', false)
42
+
43
+ all = []
44
+ query = cda_query.clone
45
+ query[:order] = 'sys.createdAt' unless query.key?(:order)
46
+ num_entries = space_client.entries(limit: 1).total
47
+
48
+ page_size = options.fetch('all_entries_page_size', 1000)
49
+ ((num_entries / page_size) + 1).times do |i|
50
+ query[:limit] = page_size
51
+ query[:skip] = i * page_size
52
+ page = space_client.entries(query)
53
+ page.each { |entry| all << entry }
54
+ end
55
+
56
+ all
57
+ end
58
+
33
59
  def client(space, access_token, options = {})
34
60
  options = {
35
61
  space: space,
@@ -1,5 +1,5 @@
1
1
  module Jekyll
2
2
  module Contentful
3
- VERSION = "1.2.1"
3
+ VERSION = "1.3.0"
4
4
  end
5
5
  end
@@ -8,7 +8,7 @@ module Jekyll
8
8
  c.syntax 'contentful [OPTIONS]'
9
9
  c.description 'Imports data from Contentful'
10
10
 
11
- options.each {|opt| c.option *opt }
11
+ options.each {|opt| c.option(*opt) }
12
12
 
13
13
  c.action do |args, options|
14
14
  contentful_config = Jekyll.configuration['contentful']
@@ -1,8 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
+ class EntryArrayDouble < ::Array
4
+ def total
5
+ size
6
+ end
7
+ end
8
+
3
9
  class ClientDouble
10
+ def initialize(response = EntryArrayDouble.new)
11
+ @response = response
12
+ end
13
+
4
14
  def entries(options = {})
5
- []
15
+ @response
6
16
  end
7
17
  end
8
18
 
@@ -44,9 +54,20 @@ describe Jekyll::Contentful::Importer do
44
54
  end
45
55
  end
46
56
 
57
+ describe '#value_for' do
58
+ it 'returns set value regularly' do
59
+ expect(subject.value_for({'foo' => 'bar'}, 'foo')).to eq 'bar'
60
+ end
61
+
62
+ it 'returns ENV value if prefixed with ENV_' do
63
+ ENV['bar'] = 'bar_from_env'
64
+ expect(subject.value_for({'foo' => 'ENV_bar'}, 'foo')).to eq 'bar_from_env'
65
+ end
66
+ end
67
+
47
68
  describe '#run' do
48
69
  it 'runs exporter for each space' do
49
- allow(subject).to receive(:spaces).and_return([['foo', {}], ['bar', {}]])
70
+ allow(subject).to receive(:spaces).and_return([['foo', {'space' => 'foo', 'access_token' => 'bar'}], ['bar', {'space' => 'bar', 'access_token' => 'foo'}]])
50
71
  allow(subject).to receive(:client).and_return(ClientDouble.new)
51
72
 
52
73
  expect(Jekyll::Contentful::DataExporter).to receive(:new).and_return(ExporterDouble.new).twice
@@ -62,5 +83,28 @@ describe Jekyll::Contentful::Importer do
62
83
  subject.run
63
84
  end
64
85
  end
86
+
87
+ describe '#get_entries' do
88
+ it 'runs a single query by default' do
89
+ client = ClientDouble.new
90
+ expect(client).to receive(:entries).once
91
+
92
+ subject.get_entries(client, {})
93
+ end
94
+
95
+ it 'fetches all entries when all_entries is set' do
96
+ client = ClientDouble.new(EntryArrayDouble.new([1, 2, 3]))
97
+ expect(client).to receive(:entries).and_call_original.twice
98
+
99
+ subject.get_entries(client, {'all_entries' => true})
100
+ end
101
+
102
+ it 'can select page size when all_entries by using all_entries_page_size' do
103
+ client = ClientDouble.new(EntryArrayDouble.new([1, 2, 3]))
104
+ expect(client).to receive(:entries).and_call_original.exactly(3).times
105
+
106
+ subject.get_entries(client, {'all_entries' => true, 'all_entries_page_size' => 2})
107
+ end
108
+ end
65
109
  end
66
110
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-contentful-data-import
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Contentful GmbH
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-02 00:00:00.000000000 Z
11
+ date: 2016-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -223,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
223
  version: '0'
224
224
  requirements: []
225
225
  rubyforge_project:
226
- rubygems_version: 2.5.0
226
+ rubygems_version: 2.5.1
227
227
  signing_key:
228
228
  specification_version: 4
229
229
  summary: Include mangablable content from the Contentful CMS and API into your Jekyll