maitre_d 0.4.0 → 0.5.0

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/Gemfile +0 -5
  4. data/README.textile +13 -31
  5. data/addon-manifest.json +11 -4
  6. data/lib/maitre_d.rb +4 -1
  7. data/lib/maitre_d/api.rb +30 -0
  8. data/lib/maitre_d/api/authenticated.rb +45 -0
  9. data/lib/maitre_d/api/change_plan.rb +15 -0
  10. data/lib/maitre_d/api/create.rb +10 -0
  11. data/lib/maitre_d/api/delete.rb +13 -0
  12. data/lib/maitre_d/api/sso.rb +65 -0
  13. data/lib/maitre_d/cloud_control.rb +4 -3
  14. data/lib/maitre_d/heroku.rb +4 -4
  15. data/maitre_d.gemspec +7 -4
  16. data/spec/api/cloud_control/provisioning_spec.rb +18 -18
  17. data/spec/api/cloud_control/single_sign_on_spec.rb +13 -13
  18. data/spec/api/heroku/provisioning_spec.rb +31 -23
  19. data/spec/api/heroku/single_sign_on_spec.rb +15 -15
  20. data/spec/internal/app/listeners/cloud_control_listener.rb +1 -1
  21. data/spec/internal/app/listeners/heroku_listener.rb +1 -1
  22. data/spec/internal/config/initializers/heroku.rb +2 -2
  23. data/spec/internal/config/routes.rb +3 -5
  24. data/spec/spec_helper.rb +1 -2
  25. metadata +50 -42
  26. data/lib/maitre_d/broadstack.rb +0 -40
  27. data/lib/maitre_d/broadstack/api.rb +0 -49
  28. data/lib/maitre_d/broadstack/api_helpers.rb +0 -44
  29. data/lib/maitre_d/cloud_control/api.rb +0 -47
  30. data/lib/maitre_d/cloud_control/api_helpers.rb +0 -28
  31. data/lib/maitre_d/heroku/api.rb +0 -47
  32. data/lib/maitre_d/heroku/api_helpers.rb +0 -46
  33. data/lib/maitre_d/heroku/listener.rb +0 -17
  34. data/lib/maitre_d/opperator.rb +0 -25
  35. data/lib/maitre_d/opperator/api.rb +0 -25
  36. data/lib/maitre_d/opperator/api_helpers.rb +0 -11
  37. data/lib/maitre_d/opperator/listener.rb +0 -13
  38. data/spec/api/broadstack/provisioning_spec.rb +0 -94
  39. data/spec/api/broadstack/single_sign_on_spec.rb +0 -49
  40. data/spec/api/opperator/provisioning_spec.rb +0 -55
  41. data/spec/internal/app/listeners/broadstack_listener.rb +0 -30
  42. data/spec/internal/app/listeners/opperator_listener.rb +0 -16
  43. data/spec/internal/config/initializers/broadstack.rb +0 -8
  44. data/spec/internal/config/initializers/opperator.rb +0 -6
@@ -1,49 +1,49 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'CloudControl SSO API' do
3
+ describe 'CloudControl SSO API', :type => :request do
4
4
  let(:timestamp) { Time.now.to_i }
5
5
  let(:nav_data) { 'heroku-nav-data-goes-here' }
6
6
  let(:token) {
7
- pre_token = "789:rock salt:#{timestamp.to_s}"
7
+ pre_token = "789:#{MaitreD::CloudControl.sso_salt}:#{timestamp.to_s}"
8
8
  Digest::SHA1.hexdigest(pre_token).to_s
9
9
  }
10
10
 
11
11
  it "renders a 403 if the token is incorrect" do
12
- get '/cloudcontrol/resources/789', :token => 'foo',
12
+ post '/cloudcontrol/resources/sso', :id => '789', :token => 'foo',
13
13
  :timestamp => timestamp, 'nav-data' => nav_data
14
14
 
15
- response.status.should == 403
15
+ expect(response.status).to eq(403)
16
16
  end
17
17
 
18
18
  it "renders a 403 if the timestamp is older than 5 minutes" do
19
19
  timestamp = 5.minutes.ago.to_i - 1
20
- pre_token = "789:rock salt:#{timestamp.to_s}"
20
+ pre_token = "789:#{MaitreD::CloudControl.sso_salt}:#{timestamp.to_s}"
21
21
  token = Digest::SHA1.hexdigest(pre_token).to_s
22
22
 
23
- get '/cloudcontrol/resources/789', :token => token,
23
+ post '/cloudcontrol/resources/sso', :id => '789', :token => token,
24
24
  :timestamp => timestamp, 'nav-data' => nav_data
25
25
 
26
- response.status.should == 403
26
+ expect(response.status).to eq(403)
27
27
  end
28
28
 
29
29
  it "sets the heroku nav data cookie" do
30
- get '/cloudcontrol/resources/789', :token => token,
30
+ post '/cloudcontrol/resources/sso', :id => '789', :token => token,
31
31
  :timestamp => timestamp, 'nav-data' => nav_data
32
32
 
33
- cookies['heroku-nav-data'].should == nav_data
33
+ expect(cookies['heroku-nav-data']).to eq(nav_data)
34
34
  end
35
35
 
36
36
  it "redirects to the appropriate URL" do
37
- get '/cloudcontrol/resources/789', :token => token,
37
+ post '/cloudcontrol/resources/sso', :id => '789', :token => token,
38
38
  :timestamp => timestamp, 'nav-data' => nav_data
39
39
 
40
- response.should redirect_to('/my/dashboard')
40
+ expect(response).to redirect_to('/my/dashboard')
41
41
  end
42
42
 
43
43
  it "should set the provided session variables" do
44
- get '/cloudcontrol/resources/789', :token => token,
44
+ post '/cloudcontrol/resources/sso', :id => '789', :token => token,
45
45
  :timestamp => timestamp, 'nav-data' => nav_data
46
46
 
47
- session[:app_id].should == '789'
47
+ expect(session[:app_id]).to eq('789')
48
48
  end
49
49
  end
@@ -1,7 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Heroku Provisioning API' do
4
- let(:authorisation) { "Basic #{Base64.encode64('foo:bar')}" }
3
+ describe 'Heroku Provisioning API', :type => :request do
4
+ let(:config) { MaitreD::Heroku }
5
+ let(:authorisation) {
6
+ "Basic #{Base64.encode64("#{config.id}:#{config.password}")}"
7
+ }
5
8
  let(:json_response) { JSON.parse response.body }
6
9
 
7
10
  describe 'Provisioning' do
@@ -14,35 +17,38 @@ describe 'Heroku Provisioning API' do
14
17
  }
15
18
 
16
19
  it "returns a 401 if the HTTP authorisation does not match" do
17
- post '/heroku/resources', params,
20
+ post '/heroku/resources', JSON.dump(params),
18
21
  {'HTTP_AUTHORIZATION' => 'Basic foobarbaz'}
19
22
 
20
- response.status.should == 401
23
+ expect(response.status).to eq(401)
21
24
  end
22
25
 
23
26
  it "returns the resource id" do
24
- post '/heroku/resources', params, {'HTTP_AUTHORIZATION' => authorisation}
27
+ post '/heroku/resources', JSON.dump(params),
28
+ {'HTTP_AUTHORIZATION' => authorisation}
25
29
 
26
- json_response['id'].should == '123'
30
+ expect(json_response['id']).to eq('123')
27
31
  end
28
32
 
29
33
  it "returns the resource configuration" do
30
- post '/heroku/resources', params, {'HTTP_AUTHORIZATION' => authorisation}
34
+ post '/heroku/resources', JSON.dump(params),
35
+ {'HTTP_AUTHORIZATION' => authorisation}
31
36
 
32
- json_response['config'].should == {'FOO_PROVISIONED' => "true"}
37
+ expect(json_response['config']).to eq({'FOO_PROVISIONED' => "true"})
33
38
  end
34
39
 
35
40
  it "returns a custom message" do
36
- post '/heroku/resources', params, {'HTTP_AUTHORIZATION' => authorisation}
41
+ post '/heroku/resources', JSON.dump(params),
42
+ {'HTTP_AUTHORIZATION' => authorisation}
37
43
 
38
- json_response['message'].should == 'Add-on provisioned!'
44
+ expect(json_response['message']).to eq('Add-on provisioned!')
39
45
  end
40
-
46
+
41
47
  it "returns the region if it exists" do
42
- post '/heroku/resources', params.merge(:region => 'us-west'),
48
+ post '/heroku/resources', JSON.dump(params.merge(:region => 'us-west')),
43
49
  {'HTTP_AUTHORIZATION' => authorisation}
44
-
45
- json_response['region'].should == 'us-west'
50
+
51
+ expect(json_response['region']).to eq('us-west')
46
52
  end
47
53
  end
48
54
 
@@ -52,22 +58,24 @@ describe 'Heroku Provisioning API' do
52
58
  }
53
59
 
54
60
  it "returns a 401 if the HTTP authorisation does not match" do
55
- put '/heroku/resources/7', params,
61
+ put '/heroku/resources/7', JSON.dump(params),
56
62
  {'HTTP_AUTHORIZATION' => 'Basic foobarbaz'}
57
63
 
58
- response.status.should == 401
64
+ expect(response.status).to eq(401)
59
65
  end
60
66
 
61
67
  it "returns the new resource configuration" do
62
- put '/heroku/resources/7', params, {'HTTP_AUTHORIZATION' => authorisation}
68
+ put '/heroku/resources/7', JSON.dump(params),
69
+ {'HTTP_AUTHORIZATION' => authorisation}
63
70
 
64
- json_response['config'].should == {'FOO_PROVISIONED' => "false"}
71
+ expect(json_response['config']).to eq({'FOO_PROVISIONED' => "false"})
65
72
  end
66
73
 
67
74
  it "returns a custom message" do
68
- put '/heroku/resources/7', params, {'HTTP_AUTHORIZATION' => authorisation}
75
+ put '/heroku/resources/7', JSON.dump(params),
76
+ {'HTTP_AUTHORIZATION' => authorisation}
69
77
 
70
- json_response['message'].should == 'Add-on upgraded or downgraded.'
78
+ expect(json_response['message']).to eq('Add-on upgraded or downgraded.')
71
79
  end
72
80
  end
73
81
 
@@ -76,19 +84,19 @@ describe 'Heroku Provisioning API' do
76
84
  delete '/heroku/resources/28', {},
77
85
  {'HTTP_AUTHORIZATION' => 'Basic foobarbaz'}
78
86
 
79
- response.status.should == 401
87
+ expect(response.status).to eq(401)
80
88
  end
81
89
 
82
90
  it "returns with a status of 200" do
83
91
  delete '/heroku/resources/28', {}, {'HTTP_AUTHORIZATION' => authorisation}
84
92
 
85
- response.status.should == 200
93
+ expect(response.status).to eq(200)
86
94
  end
87
95
 
88
96
  it "returns a custom message" do
89
97
  delete '/heroku/resources/28', {}, {'HTTP_AUTHORIZATION' => authorisation}
90
98
 
91
- json_response['message'].should == 'Add-on removed.'
99
+ expect(json_response['message']).to eq('Add-on removed.')
92
100
  end
93
101
  end
94
102
  end
@@ -1,49 +1,49 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Heroku SSO API' do
3
+ describe 'Heroku SSO API', :type => :request do
4
4
  let(:timestamp) { Time.now.to_i }
5
5
  let(:nav_data) { 'heroku-nav-data-goes-here' }
6
6
  let(:token) {
7
- pre_token = "789:sea salt:#{timestamp.to_s}"
7
+ pre_token = "789:#{MaitreD::Heroku.sso_salt}:#{timestamp.to_s}"
8
8
  Digest::SHA1.hexdigest(pre_token).to_s
9
9
  }
10
10
 
11
11
  it "renders a 403 if the token is incorrect" do
12
- get '/heroku/resources/789', :token => 'foo',
12
+ post '/heroku/resources/sso', :id => '789', :token => 'foo',
13
13
  :timestamp => timestamp, 'nav-data' => nav_data
14
14
 
15
- response.status.should == 403
15
+ expect(response.status).to eq(403)
16
16
  end
17
17
 
18
18
  it "renders a 403 if the timestamp is older than 5 minutes" do
19
19
  timestamp = 5.minutes.ago.to_i - 1
20
- pre_token = "789:sea salt:#{timestamp.to_s}"
20
+ pre_token = "789:#{MaitreD::Heroku.sso_salt}:#{timestamp.to_s}"
21
21
  token = Digest::SHA1.hexdigest(pre_token).to_s
22
22
 
23
- get '/heroku/resources/789', :token => token,
23
+ post '/heroku/resources/sso', :id => '789', :token => token,
24
24
  :timestamp => timestamp, 'nav-data' => nav_data
25
25
 
26
- response.status.should == 403
26
+ expect(response.status).to eq(403)
27
27
  end
28
28
 
29
29
  it "sets the heroku nav data cookie" do
30
- get '/heroku/resources/789', :token => token,
30
+ post '/heroku/resources/sso', :id => '789', :token => token,
31
31
  :timestamp => timestamp, 'nav-data' => nav_data
32
32
 
33
- cookies['heroku-nav-data'].should == nav_data
33
+ expect(cookies['heroku-nav-data']).to eq(nav_data)
34
34
  end
35
35
 
36
36
  it "redirects to the appropriate URL" do
37
- get '/heroku/resources/789', :token => token,
37
+ post '/heroku/resources/sso', :id => '789', :token => token,
38
38
  :timestamp => timestamp, 'nav-data' => nav_data
39
39
 
40
- response.should redirect_to('/my/dashboard')
40
+ expect(response).to redirect_to('/my/dashboard')
41
41
  end
42
-
42
+
43
43
  it "should set the provided session variables" do
44
- get '/heroku/resources/789', :token => token,
44
+ post '/heroku/resources/sso', :id => '789', :token => token,
45
45
  :timestamp => timestamp, 'nav-data' => nav_data
46
-
47
- session[:app_id].should == '789'
46
+
47
+ expect(session[:app_id]).to eq('789')
48
48
  end
49
49
  end
@@ -1,5 +1,5 @@
1
1
  class CloudControlListener
2
- def provision(cloud_control_id, plan, callback_url, logplex_token, options)
2
+ def provision(cloud_control_id, plan, region, callback_url, logplex_token, options)
3
3
  {
4
4
  :id => '123',
5
5
  :config => {'FOO_PROVISIONED' => 'true'},
@@ -1,4 +1,4 @@
1
- class HerokuListener < MaitreD::Heroku::Listener
1
+ class HerokuListener
2
2
  def provision(heroku_id, plan, region, callback_url, logplex_token, options)
3
3
  {
4
4
  :id => '123',
@@ -2,7 +2,7 @@ require 'maitre_d/heroku'
2
2
 
3
3
  MaitreD::Heroku.configure do |config|
4
4
  config.id = 'foo'
5
- config.password = 'bar'
6
- config.sso_salt = 'sea salt'
5
+ config.password = '056e8ff3d55ea6e1a7cc4aa7afeaf3ac'
6
+ config.sso_salt = 'db0ce73d4bd2dfa1d66c713a9aaf8f76'
7
7
  config.listener = HerokuListener
8
8
  end
@@ -1,8 +1,6 @@
1
1
  Rails.application.routes.draw do
2
- mount MaitreD::Broadstack::API => '/broadstack'
3
- mount MaitreD::Heroku::API => '/heroku'
4
- mount MaitreD::CloudControl::API => '/cloudcontrol'
5
- mount MaitreD::Opperator::API => '/opperator'
2
+ mount MaitreD::API.new(MaitreD::Heroku) => '/heroku'
3
+ mount MaitreD::API.new(MaitreD::CloudControl) => '/cloudcontrol'
6
4
 
7
5
  class Dashboard
8
6
  def self.call(env)
@@ -10,5 +8,5 @@ Rails.application.routes.draw do
10
8
  ['Dashboard']]
11
9
  end
12
10
  end
13
- match '/my/dashboard' => Dashboard
11
+ get '/my/dashboard' => Dashboard
14
12
  end
data/spec/spec_helper.rb CHANGED
@@ -8,6 +8,5 @@ Combustion.initialize! :action_controller
8
8
  require 'rspec/rails'
9
9
 
10
10
  RSpec.configure do |config|
11
- config.include RSpec::Rails::RequestExampleGroup, :type => :request,
12
- :example_group => {:file_path => /spec\/api/}
11
+ config.include RSpec::Rails::RequestExampleGroup, :type => :request
13
12
  end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maitre_d
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pat Allan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-06 00:00:00.000000000 Z
11
+ date: 2015-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sliver
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.0
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: combustion
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -30,42 +58,42 @@ dependencies:
30
58
  requirements:
31
59
  - - '='
32
60
  - !ruby/object:Gem::Version
33
- version: 1.3.0
61
+ version: 2.1.0
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
66
  - - '='
39
67
  - !ruby/object:Gem::Version
40
- version: 1.3.0
68
+ version: 2.1.0
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rails
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
- - - '='
73
+ - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: 3.1.3
75
+ version: 4.1.0
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
- - - '='
80
+ - - "~>"
53
81
  - !ruby/object:Gem::Version
54
- version: 3.1.3
82
+ version: 4.1.0
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: rspec-rails
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
- - - '='
87
+ - - "~>"
60
88
  - !ruby/object:Gem::Version
61
- version: 2.7.0
89
+ version: 3.1.0
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
- - - '='
94
+ - - "~>"
67
95
  - !ruby/object:Gem::Version
68
- version: 2.7.0
96
+ version: 3.1.0
69
97
  description: A Rack API (through Grape) for Heroku add-on providers.
70
98
  email:
71
99
  - pat@freelancing-gods.com
@@ -73,8 +101,8 @@ executables: []
73
101
  extensions: []
74
102
  extra_rdoc_files: []
75
103
  files:
76
- - .gitignore
77
- - .travis.yml
104
+ - ".gitignore"
105
+ - ".travis.yml"
78
106
  - Gemfile
79
107
  - HISTORY
80
108
  - LICENCE
@@ -83,36 +111,23 @@ files:
83
111
  - addon-manifest.json
84
112
  - config.ru
85
113
  - lib/maitre_d.rb
86
- - lib/maitre_d/broadstack.rb
87
- - lib/maitre_d/broadstack/api.rb
88
- - lib/maitre_d/broadstack/api_helpers.rb
114
+ - lib/maitre_d/api.rb
115
+ - lib/maitre_d/api/authenticated.rb
116
+ - lib/maitre_d/api/change_plan.rb
117
+ - lib/maitre_d/api/create.rb
118
+ - lib/maitre_d/api/delete.rb
119
+ - lib/maitre_d/api/sso.rb
89
120
  - lib/maitre_d/cloud_control.rb
90
- - lib/maitre_d/cloud_control/api.rb
91
- - lib/maitre_d/cloud_control/api_helpers.rb
92
121
  - lib/maitre_d/heroku.rb
93
- - lib/maitre_d/heroku/api.rb
94
- - lib/maitre_d/heroku/api_helpers.rb
95
- - lib/maitre_d/heroku/listener.rb
96
- - lib/maitre_d/opperator.rb
97
- - lib/maitre_d/opperator/api.rb
98
- - lib/maitre_d/opperator/api_helpers.rb
99
- - lib/maitre_d/opperator/listener.rb
100
122
  - maitre_d.gemspec
101
- - spec/api/broadstack/provisioning_spec.rb
102
- - spec/api/broadstack/single_sign_on_spec.rb
103
123
  - spec/api/cloud_control/provisioning_spec.rb
104
124
  - spec/api/cloud_control/single_sign_on_spec.rb
105
125
  - spec/api/heroku/provisioning_spec.rb
106
126
  - spec/api/heroku/single_sign_on_spec.rb
107
- - spec/api/opperator/provisioning_spec.rb
108
- - spec/internal/app/listeners/broadstack_listener.rb
109
127
  - spec/internal/app/listeners/cloud_control_listener.rb
110
128
  - spec/internal/app/listeners/heroku_listener.rb
111
- - spec/internal/app/listeners/opperator_listener.rb
112
- - spec/internal/config/initializers/broadstack.rb
113
129
  - spec/internal/config/initializers/cloud_control.rb
114
130
  - spec/internal/config/initializers/heroku.rb
115
- - spec/internal/config/initializers/opperator.rb
116
131
  - spec/internal/config/routes.rb
117
132
  - spec/internal/log/.gitignore
118
133
  - spec/internal/public/favicon.ico
@@ -126,12 +141,12 @@ require_paths:
126
141
  - lib
127
142
  required_ruby_version: !ruby/object:Gem::Requirement
128
143
  requirements:
129
- - - '>='
144
+ - - ">="
130
145
  - !ruby/object:Gem::Version
131
146
  version: '0'
132
147
  required_rubygems_version: !ruby/object:Gem::Requirement
133
148
  requirements:
134
- - - '>='
149
+ - - ">="
135
150
  - !ruby/object:Gem::Version
136
151
  version: '0'
137
152
  requirements: []
@@ -141,21 +156,14 @@ signing_key:
141
156
  specification_version: 4
142
157
  summary: Rack APIs for Heroku add-ons
143
158
  test_files:
144
- - spec/api/broadstack/provisioning_spec.rb
145
- - spec/api/broadstack/single_sign_on_spec.rb
146
159
  - spec/api/cloud_control/provisioning_spec.rb
147
160
  - spec/api/cloud_control/single_sign_on_spec.rb
148
161
  - spec/api/heroku/provisioning_spec.rb
149
162
  - spec/api/heroku/single_sign_on_spec.rb
150
- - spec/api/opperator/provisioning_spec.rb
151
- - spec/internal/app/listeners/broadstack_listener.rb
152
163
  - spec/internal/app/listeners/cloud_control_listener.rb
153
164
  - spec/internal/app/listeners/heroku_listener.rb
154
- - spec/internal/app/listeners/opperator_listener.rb
155
- - spec/internal/config/initializers/broadstack.rb
156
165
  - spec/internal/config/initializers/cloud_control.rb
157
166
  - spec/internal/config/initializers/heroku.rb
158
- - spec/internal/config/initializers/opperator.rb
159
167
  - spec/internal/config/routes.rb
160
168
  - spec/internal/log/.gitignore
161
169
  - spec/internal/public/favicon.ico