contentful_bootstrap 1.6.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -0
  3. data/.rubocop_todo.yml +123 -0
  4. data/.travis.yml +6 -0
  5. data/CHANGELOG.md +25 -0
  6. data/Gemfile +1 -0
  7. data/Guardfile +5 -0
  8. data/README.md +40 -14
  9. data/Rakefile +7 -0
  10. data/bin/contentful_bootstrap +33 -22
  11. data/contentful_bootstrap.gemspec +7 -0
  12. data/lib/contentful/bootstrap.rb +7 -5
  13. data/lib/contentful/bootstrap/command_runner.rb +45 -0
  14. data/lib/contentful/bootstrap/commands.rb +3 -168
  15. data/lib/contentful/bootstrap/commands/base.rb +66 -0
  16. data/lib/contentful/bootstrap/commands/create_space.rb +111 -0
  17. data/lib/contentful/bootstrap/commands/generate_json.rb +41 -0
  18. data/lib/contentful/bootstrap/commands/generate_token.rb +52 -0
  19. data/lib/contentful/bootstrap/constants.rb +2 -2
  20. data/lib/contentful/bootstrap/generator.rb +94 -0
  21. data/lib/contentful/bootstrap/server.rb +25 -17
  22. data/lib/contentful/bootstrap/support.rb +3 -2
  23. data/lib/contentful/bootstrap/templates.rb +4 -4
  24. data/lib/contentful/bootstrap/templates/base.rb +51 -30
  25. data/lib/contentful/bootstrap/templates/blog.rb +33 -33
  26. data/lib/contentful/bootstrap/templates/catalogue.rb +103 -103
  27. data/lib/contentful/bootstrap/templates/gallery.rb +55 -56
  28. data/lib/contentful/bootstrap/templates/json_template.rb +22 -16
  29. data/lib/contentful/bootstrap/templates/links.rb +2 -2
  30. data/lib/contentful/bootstrap/templates/links/asset.rb +2 -2
  31. data/lib/contentful/bootstrap/templates/links/base.rb +3 -3
  32. data/lib/contentful/bootstrap/templates/links/entry.rb +2 -2
  33. data/lib/contentful/bootstrap/token.rb +32 -31
  34. data/lib/contentful/bootstrap/version.rb +1 -1
  35. data/spec/contentful/bootstrap/command_runner_spec.rb +111 -0
  36. data/spec/contentful/bootstrap/commands/base_spec.rb +102 -0
  37. data/spec/contentful/bootstrap/commands/create_space_spec.rb +72 -0
  38. data/spec/contentful/bootstrap/commands/generate_json_spec.rb +64 -0
  39. data/spec/contentful/bootstrap/commands/generate_token_spec.rb +82 -0
  40. data/spec/contentful/bootstrap/generator_spec.rb +15 -0
  41. data/spec/contentful/bootstrap/server_spec.rb +154 -0
  42. data/spec/contentful/bootstrap/support_spec.rb +27 -0
  43. data/spec/contentful/bootstrap/templates/base_spec.rb +34 -0
  44. data/spec/contentful/bootstrap/templates/blog_spec.rb +32 -0
  45. data/spec/contentful/bootstrap/templates/catalogue_spec.rb +40 -0
  46. data/spec/contentful/bootstrap/templates/gallery_spec.rb +40 -0
  47. data/spec/contentful/bootstrap/templates/json_template_spec.rb +52 -0
  48. data/spec/contentful/bootstrap/templates/links/asset_spec.rb +23 -0
  49. data/spec/contentful/bootstrap/templates/links/base_spec.rb +31 -0
  50. data/spec/contentful/bootstrap/templates/links/entry_spec.rb +23 -0
  51. data/spec/contentful/bootstrap/token_spec.rb +143 -0
  52. data/spec/fixtures/ini_fixtures/contentfulrc.ini +2 -0
  53. data/spec/fixtures/ini_fixtures/no_global.ini +2 -0
  54. data/spec/fixtures/ini_fixtures/no_token.ini +1 -0
  55. data/spec/fixtures/ini_fixtures/sections.ini +5 -0
  56. data/spec/fixtures/json_fixtures/issue_22.json +77 -0
  57. data/spec/fixtures/json_fixtures/simple.json +34 -0
  58. data/spec/fixtures/json_fixtures/wl1z0pal05vy.json +437 -0
  59. data/spec/fixtures/vcr_fixtures/generate_json.yml +384 -0
  60. data/spec/fixtures/vcr_fixtures/issue_22.yml +2488 -0
  61. data/spec/spec_helper.rb +51 -0
  62. metadata +167 -4
@@ -1,2 +1,2 @@
1
- require "contentful/bootstrap/templates/links/entry"
2
- require "contentful/bootstrap/templates/links/asset"
1
+ require 'contentful/bootstrap/templates/links/entry'
2
+ require 'contentful/bootstrap/templates/links/asset'
@@ -1,5 +1,5 @@
1
- require "contentful/management"
2
- require "contentful/bootstrap/templates/links/base"
1
+ require 'contentful/management'
2
+ require 'contentful/bootstrap/templates/links/base'
3
3
 
4
4
  module Contentful
5
5
  module Bootstrap
@@ -1,4 +1,4 @@
1
- require "contentful/management"
1
+ require 'contentful/management'
2
2
 
3
3
  module Contentful
4
4
  module Bootstrap
@@ -11,7 +11,7 @@ module Contentful
11
11
  end
12
12
 
13
13
  def link_type
14
- self.class.name.split("::").last
14
+ self.class.name.split('::').last
15
15
  end
16
16
 
17
17
  def type
@@ -25,7 +25,7 @@ module Contentful
25
25
  end
26
26
 
27
27
  def management_class
28
- raise "must implement"
28
+ fail 'must implement'
29
29
  end
30
30
  end
31
31
  end
@@ -1,5 +1,5 @@
1
- require "contentful/management"
2
- require "contentful/bootstrap/templates/links/base"
1
+ require 'contentful/management'
2
+ require 'contentful/bootstrap/templates/links/base'
3
3
 
4
4
  module Contentful
5
5
  module Bootstrap
@@ -1,62 +1,63 @@
1
- require "inifile"
1
+ require 'inifile'
2
2
 
3
3
  module Contentful
4
4
  module Bootstrap
5
5
  class Token
6
- CONFIG_ENV = "CONTENTFUL_ENV".freeze
7
- DEFAULT_SECTION = "global".freeze
8
- DEFAULT_PATH = ".contentfulrc".freeze
9
- MANAGEMENT_TOKEN = "CONTENTFUL_MANAGEMENT_ACCESS_TOKEN".freeze
10
- DELIVERY_TOKEN = "CONTENTFUL_DELIVERY_ACCESS_TOKEN".freeze
11
- SPACE_ID = "SPACE_ID".freeze
6
+ CONFIG_ENV = 'CONTENTFUL_ENV'.freeze
7
+ DEFAULT_SECTION = 'global'.freeze
8
+ DEFAULT_PATH = '.contentfulrc'.freeze
9
+ MANAGEMENT_TOKEN = 'CONTENTFUL_MANAGEMENT_ACCESS_TOKEN'.freeze
10
+ DELIVERY_TOKEN = 'CONTENTFUL_DELIVERY_ACCESS_TOKEN'.freeze
11
+ SPACE_ID = 'SPACE_ID'.freeze
12
12
 
13
- def self.set_path!(config_path = "")
14
- @@config_path = config_path
13
+ attr_reader :config_path
14
+
15
+ def initialize(config_path = '')
16
+ @config_path = config_path
17
+ end
18
+
19
+ def ==(other_token)
20
+ return false unless other_token.is_a?(Contentful::Bootstrap::Token)
21
+ other_token.config_path == @config_path
15
22
  end
16
23
 
17
- def self.present?
18
- return false unless File.exists? filename
19
- config_file[config_section].has_key? MANAGEMENT_TOKEN
24
+ def present?
25
+ return false unless ::File.exist? filename
26
+ config_file[config_section].key? MANAGEMENT_TOKEN
20
27
  end
21
28
 
22
- def self.read
23
- begin
24
- config_file[config_section].fetch(MANAGEMENT_TOKEN)
25
- rescue KeyError
26
- fail "Token not found"
27
- end
29
+ def read
30
+ config_file[config_section].fetch(MANAGEMENT_TOKEN)
31
+ rescue KeyError
32
+ raise 'Token not found'
28
33
  end
29
34
 
30
- def self.write(value, section = nil, key = MANAGEMENT_TOKEN)
35
+ def write(value, section = nil, key = MANAGEMENT_TOKEN)
31
36
  file = config_file
32
37
  file[section || config_section][key] = value
33
38
  file.save
34
39
  end
35
40
 
36
- def self.write_access_token(space_name, token)
41
+ def write_access_token(space_name, token)
37
42
  write(token, space_name, DELIVERY_TOKEN)
38
43
  end
39
44
 
40
- def self.write_space_id(space_name, space_id)
45
+ def write_space_id(space_name, space_id)
41
46
  write(space_id, space_name, SPACE_ID)
42
47
  end
43
48
 
44
- def self.filename
45
- return config_path if File.exist?(config_path)
46
- File.join(ENV['HOME'], DEFAULT_PATH)
49
+ def filename
50
+ return config_path unless config_path.empty?
51
+ ::File.join(ENV['HOME'], DEFAULT_PATH)
47
52
  end
48
53
 
49
- def self.config_section
54
+ def config_section
50
55
  return ENV[CONFIG_ENV] if config_file.has_section? ENV[CONFIG_ENV]
51
56
  DEFAULT_SECTION
52
57
  end
53
58
 
54
- def self.config_file
55
- File.exist?(filename) ? IniFile.load(filename) : IniFile.new(filename: filename)
56
- end
57
-
58
- def self.config_path
59
- @@config_path ||= ""
59
+ def config_file
60
+ @file ||= ::File.exist?(filename) ? IniFile.load(filename) : IniFile.new(filename: filename)
60
61
  end
61
62
  end
62
63
  end
@@ -1,5 +1,5 @@
1
1
  module Contentful
2
2
  module Bootstrap
3
- VERSION = "1.6.0"
3
+ VERSION = '2.0.2'
4
4
  end
5
5
  end
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::CommandRunner do
4
+ let(:path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'contentfulrc.ini')) }
5
+ subject { Contentful::Bootstrap::CommandRunner.new(path) }
6
+
7
+ describe 'instance methods' do
8
+ before do
9
+ end
10
+ describe '#create_space' do
11
+ before do
12
+ allow_any_instance_of(Contentful::Bootstrap::Commands::CreateSpace).to receive(:run)
13
+ end
14
+
15
+ it 'default values' do
16
+ expect(Contentful::Bootstrap::Commands::CreateSpace).to receive(:new).with(
17
+ subject.token, 'foo', nil, nil, true
18
+ ).and_call_original
19
+
20
+ subject.create_space('foo')
21
+ end
22
+
23
+ it 'with options' do
24
+ expect(Contentful::Bootstrap::Commands::CreateSpace).to receive(:new).with(
25
+ subject.token, 'foo', 'bar', 'baz', false
26
+ ).and_call_original
27
+
28
+ subject.create_space('foo', template: 'bar', json_template: 'baz', trigger_oauth: false)
29
+ end
30
+
31
+ it 'runs command' do
32
+ expect_any_instance_of(Contentful::Bootstrap::Commands::CreateSpace).to receive(:run)
33
+
34
+ subject.create_space('foo', template: 'bar', json_template: 'baz', trigger_oauth: false)
35
+ end
36
+ end
37
+
38
+ describe '#generate_token' do
39
+ before do
40
+ allow_any_instance_of(Contentful::Bootstrap::Commands::GenerateToken).to receive(:run)
41
+ allow_any_instance_of(Contentful::Bootstrap::Commands::GenerateToken).to receive(:fetch_space)
42
+ end
43
+
44
+ it 'default values' do
45
+ expect(Contentful::Bootstrap::Commands::GenerateToken).to receive(:new).with(
46
+ subject.token, 'foo', 'Bootstrap Token', true
47
+ ).and_call_original
48
+
49
+ subject.generate_token('foo')
50
+ end
51
+
52
+ it 'with options' do
53
+ expect(Contentful::Bootstrap::Commands::GenerateToken).to receive(:new).with(
54
+ subject.token, 'foo', 'bar', false
55
+ ).and_call_original
56
+
57
+ subject.generate_token('foo', name: 'bar', trigger_oauth: false)
58
+ end
59
+
60
+ it 'runs command' do
61
+ expect_any_instance_of(Contentful::Bootstrap::Commands::GenerateToken).to receive(:run)
62
+
63
+ subject.generate_token('foo', name: 'bar', trigger_oauth: false)
64
+ end
65
+ end
66
+
67
+ describe '#generate_json' do
68
+ it 'requires access token to run' do
69
+ expect {
70
+ subject.generate_json('foo')
71
+ }.to raise_error('Access Token required')
72
+ end
73
+
74
+ it 'default values' do
75
+ allow_any_instance_of(Contentful::Bootstrap::Commands::GenerateJson).to receive(:run)
76
+
77
+ expect(Contentful::Bootstrap::Commands::GenerateJson).to receive(:new).with(
78
+ 'foo', 'bar', nil
79
+ ).and_call_original
80
+
81
+ subject.generate_json('foo', access_token: 'bar')
82
+ end
83
+
84
+ it 'with options' do
85
+ allow_any_instance_of(Contentful::Bootstrap::Commands::GenerateJson).to receive(:run)
86
+
87
+ expect(Contentful::Bootstrap::Commands::GenerateJson).to receive(:new).with(
88
+ 'foo', 'bar', 'baz'
89
+ ).and_call_original
90
+
91
+ subject.generate_json('foo', access_token: 'bar', filename: 'baz')
92
+ end
93
+
94
+ it 'runs command' do
95
+ expect_any_instance_of(Contentful::Bootstrap::Commands::GenerateJson).to receive(:run)
96
+
97
+ subject.generate_json('foo', access_token: 'bar', filename: 'baz')
98
+ end
99
+ end
100
+ end
101
+
102
+ describe 'attributes' do
103
+ it ':config_path' do
104
+ expect(subject.config_path).to eq path
105
+ end
106
+
107
+ it ':token' do
108
+ expect(subject.token == Contentful::Bootstrap::Token.new(path)).to be_truthy
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,102 @@
1
+ require 'spec_helper'
2
+ require 'net/http'
3
+ require 'contentful/bootstrap/commands/base'
4
+
5
+ describe Contentful::Bootstrap::Commands::Base do
6
+ let(:path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'contentfulrc.ini')) }
7
+ let(:no_token_path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'no_token.ini')) }
8
+ let(:token) { Contentful::Bootstrap::Token.new path }
9
+ let(:non_management_token) { Contentful::Bootstrap::Token.new no_token_path }
10
+ subject { Contentful::Bootstrap::Commands::Base.new token, 'foo', false }
11
+
12
+ describe 'abstract methods' do
13
+ it '#run' do
14
+ expect { subject.run }.to raise_error 'must implement'
15
+ end
16
+ end
17
+
18
+ describe 'initialize' do
19
+ describe 'configuration' do
20
+ it 'runs configuration when trigger_oauth is true' do
21
+ expect_any_instance_of(subject.class).to receive(:configuration)
22
+ subject.class.new(token, 'foo')
23
+ end
24
+
25
+ it 'doesnt run configuration when trigger_oauth is false' do
26
+ expect_any_instance_of(subject.class).not_to receive(:configuration)
27
+ subject.class.new(token, 'foo', false)
28
+ end
29
+ end
30
+
31
+ describe 'management_client_init' do
32
+ it 'runs management_client_init when trigger_oauth is true' do
33
+ expect_any_instance_of(subject.class).to receive(:management_client_init)
34
+ subject.class.new(token, 'foo')
35
+ end
36
+
37
+ it 'doesnt run management_client_init when trigger_oauth is false' do
38
+ expect_any_instance_of(subject.class).not_to receive(:management_client_init)
39
+ subject.class.new(token, 'foo', false)
40
+ end
41
+ end
42
+ end
43
+
44
+ describe 'instance methods' do
45
+ it '#management_client_init' do
46
+ allow_any_instance_of(subject.class).to receive(:configuration)
47
+ expect(Contentful::Management::Client).to receive(:new).with(token.read, raise_errors: true)
48
+
49
+ subject.class.new(token, 'foo')
50
+ end
51
+
52
+ describe '#configuration' do
53
+ before do
54
+ allow_any_instance_of(subject.class).to receive(:management_client_init)
55
+ end
56
+
57
+ it 'passes if token is found' do
58
+ expect { subject.class.new(token, 'foo') }.to output("OAuth token found, moving on!\n").to_stdout
59
+ end
60
+
61
+ describe 'token not found' do
62
+ it 'exits if answer is no' do
63
+ expect_any_instance_of(subject.class).to receive(:gets) { "n\n" }
64
+ expect { subject.class.new(non_management_token, 'foo') }.to raise_error SystemExit
65
+ end
66
+
67
+ it 'runs token_server if other answer' do
68
+ expect_any_instance_of(subject.class).to receive(:gets) { "y\n" }
69
+ expect_any_instance_of(subject.class).to receive(:token_server)
70
+
71
+ subject.class.new(non_management_token, 'foo')
72
+ end
73
+ end
74
+ end
75
+
76
+ it '#token_server' do
77
+ allow_any_instance_of(subject.class).to receive(:management_client_init)
78
+
79
+ expect_any_instance_of(subject.class).to receive(:gets) { "y\n" }
80
+ expect_any_instance_of(Contentful::Bootstrap::Server).to receive(:start) {}
81
+ expect_any_instance_of(Contentful::Bootstrap::Server).to receive(:running?) { true }
82
+ expect(Net::HTTP).to receive(:get).with(URI('http://localhost:5123')) {}
83
+ expect(non_management_token).to receive(:present?).and_return(false, true)
84
+ expect_any_instance_of(Contentful::Bootstrap::Server).to receive(:stop) {}
85
+
86
+ subject.class.new(non_management_token, 'foo')
87
+ end
88
+ end
89
+
90
+ describe 'attributes' do
91
+ it ':space' do
92
+ expect(subject.space).to eq 'foo'
93
+ end
94
+
95
+ it ':token' do
96
+ expect(subject.token == Contentful::Bootstrap::Token.new(path)).to be_truthy
97
+ end
98
+ end
99
+
100
+ describe '#initialize' do
101
+ end
102
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Commands::CreateSpace do
4
+ let(:path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'contentfulrc.ini')) }
5
+ let(:token) { Contentful::Bootstrap::Token.new path }
6
+ subject { Contentful::Bootstrap::Commands::CreateSpace.new token, 'foo', 'bar', 'baz', false }
7
+ let(:space_double) { SpaceDouble.new }
8
+
9
+ describe 'instance methods' do
10
+ describe '#run' do
11
+ it 'with all non nil attributes' do
12
+ expect(subject).to receive(:fetch_space) { space_double }
13
+ expect(subject).to receive(:create_template).with(space_double)
14
+ expect(subject).to receive(:create_json_template).with(space_double)
15
+ expect(subject).to receive(:generate_token).with(space_double)
16
+
17
+ subject.run
18
+ end
19
+
20
+ it 'does not create template when template_name is nil' do
21
+ create_space_command = subject.class.new(token, 'foo', nil, 'baz', false)
22
+
23
+ expect(create_space_command.template_name).to eq nil
24
+
25
+ expect(create_space_command).to receive(:fetch_space) { space_double }
26
+ expect(create_space_command).not_to receive(:create_template).with(space_double)
27
+ expect(create_space_command).to receive(:create_json_template).with(space_double)
28
+ expect(create_space_command).to receive(:generate_token).with(space_double)
29
+
30
+ create_space_command.run
31
+ end
32
+
33
+ it 'does not create json template when json_template is nil' do
34
+ create_space_command = subject.class.new(token, 'foo', 'bar', nil, false)
35
+
36
+ expect(create_space_command.json_template).to eq nil
37
+
38
+ expect(create_space_command).to receive(:fetch_space) { space_double }
39
+ expect(create_space_command).to receive(:create_template).with(space_double)
40
+ expect(create_space_command).not_to receive(:create_json_template).with(space_double)
41
+ expect(create_space_command).to receive(:generate_token).with(space_double)
42
+
43
+ create_space_command.run
44
+ end
45
+ end
46
+ end
47
+
48
+ describe 'attributes' do
49
+ it ':template_name' do
50
+ expect(subject.template_name).to eq 'bar'
51
+ end
52
+
53
+ it ':json_template' do
54
+ expect(subject.json_template).to eq 'baz'
55
+ end
56
+ end
57
+
58
+ describe 'issues' do
59
+ it 'Importing asset array values does not work #22' do
60
+ json_path = File.expand_path(File.join('spec', 'fixtures', 'json_fixtures', 'issue_22.json'))
61
+
62
+ allow_any_instance_of(subject.class).to receive(:gets).and_return('y')
63
+ allow_any_instance_of(Contentful::Bootstrap::Commands::GenerateToken).to receive(:gets).and_return('n')
64
+
65
+ command = subject.class.new(token, 'issue_22', nil, json_path)
66
+
67
+ vcr('issue_22') {
68
+ command.run
69
+ }
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Commands::GenerateJson do
4
+ subject { Contentful::Bootstrap::Commands::GenerateJson.new('foo', 'bar') }
5
+
6
+ describe 'instance methods' do
7
+ describe '#run' do
8
+ it 'exits if access_token is nil' do
9
+ subject.instance_variable_set(:@access_token, nil)
10
+
11
+ expect { subject.run }.to raise_error SystemExit
12
+ end
13
+
14
+ it 'calls generator' do
15
+ allow(subject).to receive(:write).with('json')
16
+
17
+ expect_any_instance_of(Contentful::Bootstrap::Generator).to receive(:generate_json) { 'json' }
18
+
19
+ subject.run
20
+ end
21
+
22
+ it 'writes json' do
23
+ vcr('generate_json') {
24
+ subject.instance_variable_set(:@space_id, 'wl1z0pal05vy')
25
+ subject.instance_variable_set(:@access_token, '48d7db7d4cd9d09df573c251d456f4acc72141b92f36e57f8684b36cf5cfff6e')
26
+
27
+ json_fixture('wl1z0pal05vy') { |json|
28
+ expect(subject).to receive(:write).with(JSON.pretty_generate(json))
29
+ }
30
+
31
+ subject.run
32
+ }
33
+ end
34
+ end
35
+
36
+ describe '#write' do
37
+ it 'outputs json to stoud if no filename provided' do
38
+ expect { subject.write('json') }.to output("json\n").to_stdout
39
+ end
40
+
41
+ it 'writes to file if filename provided' do
42
+ subject.instance_variable_set(:@filename, 'foo')
43
+
44
+ expect(::File).to receive(:write).with('foo', 'json')
45
+
46
+ expect { subject.write('json') }.to output("Saving JSON template to 'foo'\n").to_stdout
47
+ end
48
+ end
49
+ end
50
+
51
+ describe 'attributes' do
52
+ it ':space_id' do
53
+ expect(subject.space_id).to eq 'foo'
54
+ end
55
+
56
+ it ':access_token' do
57
+ expect(subject.access_token).to eq 'bar'
58
+ end
59
+
60
+ it ':filename' do
61
+ expect(subject.filename).to eq nil
62
+ end
63
+ end
64
+ end