aaf-gumboot 1.0.0.pre.alpha.2

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 (90) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +15 -0
  5. data/Gemfile +4 -0
  6. data/Guardfile +18 -0
  7. data/LICENSE +202 -0
  8. data/README.md +1069 -0
  9. data/Rakefile +8 -0
  10. data/aaf-gumboot.gemspec +42 -0
  11. data/lib/aaf-gumboot.rb +1 -0
  12. data/lib/gumboot.rb +5 -0
  13. data/lib/gumboot/shared_examples/anonymous_controller.rb +17 -0
  14. data/lib/gumboot/shared_examples/api_constraints.rb +29 -0
  15. data/lib/gumboot/shared_examples/api_controller.rb +206 -0
  16. data/lib/gumboot/shared_examples/api_subjects.rb +44 -0
  17. data/lib/gumboot/shared_examples/application_controller.rb +223 -0
  18. data/lib/gumboot/shared_examples/database_schema.rb +45 -0
  19. data/lib/gumboot/shared_examples/foreign_keys.rb +65 -0
  20. data/lib/gumboot/shared_examples/permissions.rb +45 -0
  21. data/lib/gumboot/shared_examples/roles.rb +15 -0
  22. data/lib/gumboot/shared_examples/subjects.rb +29 -0
  23. data/lib/gumboot/strap.rb +121 -0
  24. data/lib/gumboot/version.rb +3 -0
  25. data/spec/dummy/README.rdoc +28 -0
  26. data/spec/dummy/Rakefile +3 -0
  27. data/spec/dummy/app/assets/images/.keep +0 -0
  28. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  29. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  30. data/spec/dummy/app/controllers/api/api_controller.rb +78 -0
  31. data/spec/dummy/app/controllers/application_controller.rb +64 -0
  32. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  33. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  34. data/spec/dummy/app/mailers/.keep +0 -0
  35. data/spec/dummy/app/models/.keep +0 -0
  36. data/spec/dummy/app/models/api_subject.rb +23 -0
  37. data/spec/dummy/app/models/api_subject_role.rb +6 -0
  38. data/spec/dummy/app/models/concerns/.keep +0 -0
  39. data/spec/dummy/app/models/permission.rb +7 -0
  40. data/spec/dummy/app/models/role.rb +11 -0
  41. data/spec/dummy/app/models/subject.rb +20 -0
  42. data/spec/dummy/app/models/subject_role.rb +6 -0
  43. data/spec/dummy/app/views/dynamic_errors/forbidden.html.erb +0 -0
  44. data/spec/dummy/app/views/dynamic_errors/unauthorized.html.erb +0 -0
  45. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  46. data/spec/dummy/bin/bundle +3 -0
  47. data/spec/dummy/bin/rails +4 -0
  48. data/spec/dummy/bin/rake +4 -0
  49. data/spec/dummy/config.ru +4 -0
  50. data/spec/dummy/config/application.rb +18 -0
  51. data/spec/dummy/config/boot.rb +5 -0
  52. data/spec/dummy/config/database.yml +5 -0
  53. data/spec/dummy/config/environment.rb +5 -0
  54. data/spec/dummy/config/environments/development.rb +32 -0
  55. data/spec/dummy/config/environments/production.rb +37 -0
  56. data/spec/dummy/config/environments/test.rb +33 -0
  57. data/spec/dummy/config/initializers/assets.rb +4 -0
  58. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -0
  59. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  60. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  61. data/spec/dummy/config/initializers/inflections.rb +15 -0
  62. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  63. data/spec/dummy/config/initializers/session_store.rb +3 -0
  64. data/spec/dummy/config/initializers/wrap_parameters.rb +9 -0
  65. data/spec/dummy/config/locales/en.yml +23 -0
  66. data/spec/dummy/config/routes.rb +2 -0
  67. data/spec/dummy/config/secrets.yml +22 -0
  68. data/spec/dummy/db/schema.rb +51 -0
  69. data/spec/dummy/db/test.sqlite3 +0 -0
  70. data/spec/dummy/lib/api_constraints.rb +16 -0
  71. data/spec/dummy/lib/assets/.keep +0 -0
  72. data/spec/dummy/public/404.html +67 -0
  73. data/spec/dummy/public/422.html +67 -0
  74. data/spec/dummy/public/500.html +66 -0
  75. data/spec/dummy/public/favicon.ico +0 -0
  76. data/spec/factories/api_subjects.rb +20 -0
  77. data/spec/factories/permissions.rb +6 -0
  78. data/spec/factories/roles.rb +5 -0
  79. data/spec/factories/subjects.rb +24 -0
  80. data/spec/gumboot/api_constraints_spec.rb +18 -0
  81. data/spec/gumboot/api_controller_spec.rb +7 -0
  82. data/spec/gumboot/api_subjects_spec.rb +7 -0
  83. data/spec/gumboot/application_controller_spec.rb +7 -0
  84. data/spec/gumboot/foreign_keys_spec.rb +7 -0
  85. data/spec/gumboot/permissions_spec.rb +7 -0
  86. data/spec/gumboot/roles_spec.rb +7 -0
  87. data/spec/gumboot/subjects_spec.rb +7 -0
  88. data/spec/lib/gumboot/strap_spec.rb +330 -0
  89. data/spec/spec_helper.rb +45 -0
  90. metadata +387 -0
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ require 'gumboot/shared_examples/subjects'
4
+
5
+ RSpec.describe Subject, type: :model do
6
+ include_examples 'Subjects'
7
+ end
@@ -0,0 +1,330 @@
1
+ require 'spec_helper'
2
+
3
+ require 'mysql2'
4
+ require 'gumboot/strap'
5
+
6
+ RSpec.describe Gumboot::Strap do
7
+ let(:client) { spy(Mysql2::Client) }
8
+ let(:kernel) { double(Kernel) }
9
+
10
+ let(:db_configs) do
11
+ {
12
+ 'one' => {
13
+ 'adapter' => 'mysql2',
14
+ 'database' => 'one_db',
15
+ 'username' => 'one_user',
16
+ 'password' => 'one_password'
17
+ },
18
+ 'two' => {
19
+ 'adapter' => 'mysql2',
20
+ 'database' => 'two_db',
21
+ 'username' => 'two_user',
22
+ 'password' => 'two_password'
23
+ }
24
+ }
25
+ end
26
+
27
+ before do
28
+ opts = {
29
+ default_file: "#{ENV['HOME']}/.my.cnf",
30
+ default_group: 'client',
31
+ host: '127.0.0.1'
32
+ }
33
+
34
+ allow(Mysql2::Client).to receive(:new).with(opts).and_return(client)
35
+ allow(client).to receive(:escape) { |x| x }
36
+ end
37
+
38
+ let(:klass) do
39
+ Class.new do
40
+ include Gumboot::Strap
41
+ attr_reader :kernel
42
+
43
+ def initialize(kernel)
44
+ @kernel = kernel
45
+ end
46
+
47
+ def puts(*); end
48
+
49
+ def system(*args)
50
+ kernel.system(*args)
51
+ end
52
+ end
53
+ end
54
+
55
+ subject { klass.new(kernel) }
56
+
57
+ context '#ensure_activerecord_databases' do
58
+ before do
59
+ allow(ActiveRecord::Base).to receive(:configurations)
60
+ .and_return(db_configs)
61
+ end
62
+
63
+ it 'creates the databases' do
64
+ expect(client).to receive(:query).with(create_db_query('one_db')).once
65
+ expect(client).to receive(:query).with(create_db_query('two_db')).once
66
+
67
+ allow(client).to receive(:query).with(match(/^GRANT ALL.*/))
68
+
69
+ subject.ensure_activerecord_databases(db_configs.keys)
70
+ end
71
+
72
+ it 'sets permissions for database users' do
73
+ expect(client).to receive(:query)
74
+ .with("GRANT ALL PRIVILEGES ON `one_db`.* TO 'one_user'@'localhost' " \
75
+ "IDENTIFIED BY 'one_password'").once
76
+ expect(client).to receive(:query)
77
+ .with("GRANT ALL PRIVILEGES ON `two_db`.* TO 'two_user'@'localhost' " \
78
+ "IDENTIFIED BY 'two_password'").once
79
+
80
+ allow(client).to receive(:query).with(match(/^CREATE DATABASE.*/))
81
+
82
+ subject.ensure_activerecord_databases(db_configs.keys)
83
+ end
84
+ end
85
+
86
+ context '#ensure_database' do
87
+ let(:opts) { { 'adapter' => 'mysql2', 'database' => 'test_db' } }
88
+
89
+ it 'creates the database' do
90
+ expect(client).to receive(:query).with(create_db_query('test_db')).once
91
+
92
+ subject.ensure_database(opts)
93
+ end
94
+
95
+ it 'fails when adapter is not mysql2' do
96
+ expect { subject.ensure_database(opts.merge('adapter' => 'xyz')) }
97
+ .to raise_error(/Only supports mysql2 adapter/)
98
+ end
99
+ end
100
+
101
+ context '#ensure_database_user' do
102
+ let(:opts) do
103
+ { 'adapter' => 'mysql2', 'database' => 'test_db',
104
+ 'username' => 'test_user', 'password' => 'test_password' }
105
+ end
106
+
107
+ it 'sets permission for the database user' do
108
+ expect(client).to receive(:query)
109
+ .with('GRANT ALL PRIVILEGES ON `test_db`.* TO ' \
110
+ "'test_user'@'localhost' IDENTIFIED BY 'test_password'").once
111
+
112
+ subject.ensure_database_user(opts)
113
+ end
114
+
115
+ it 'fails when adapter is not mysql2' do
116
+ expect { subject.ensure_database_user(opts.merge('adapter' => 'xyz')) }
117
+ .to raise_error(/Only supports mysql2 adapter/)
118
+ end
119
+ end
120
+
121
+ context '#maintain_activerecord_schema' do
122
+ let(:tables) { [] }
123
+
124
+ before do
125
+ expect(ActiveRecord::Base).to receive_message_chain(:connection, :execute)
126
+ .with('SHOW TABLES').and_return(tables)
127
+ end
128
+
129
+ context 'when a database already exists' do
130
+ let(:tables) { %w(schema_migrations) }
131
+
132
+ it 'runs the migrations' do
133
+ expect(subject.kernel).to receive(:system).with('rake db:migrate')
134
+ subject.maintain_activerecord_schema
135
+ end
136
+ end
137
+
138
+ it 'loads the schema before running migrations' do
139
+ expect(subject.kernel).to receive(:system).with('rake db:schema:load')
140
+ expect(subject.kernel).to receive(:system).with('rake db:migrate')
141
+ subject.maintain_activerecord_schema
142
+ end
143
+ end
144
+
145
+ context '#load_seeds' do
146
+ it 'loads the seeds' do
147
+ expect(subject.kernel).to receive(:system).with('rake db:seed')
148
+ subject.load_seeds
149
+ end
150
+ end
151
+
152
+ context '#clean_logs' do
153
+ it 'removes the log files' do
154
+ expect(subject.kernel).to receive(:system).with('rm -f log/*')
155
+ subject.clean_logs
156
+ end
157
+ end
158
+
159
+ context '#clean_tempfiles' do
160
+ it 'removes the temp files' do
161
+ expect(subject.kernel).to receive(:system).with('rm -rf tmp/cache')
162
+ subject.clean_tempfiles
163
+ end
164
+ end
165
+
166
+ context '#link_global_configuration' do
167
+ it 'creates a symbolic link to the shared configuration' do
168
+ base = "#{ENV['HOME']}/.aaf"
169
+
170
+ allow(File).to receive(:exist?).with("#{base}/a").and_return(true)
171
+ allow(File).to receive(:exist?).with("#{base}/b").and_return(true)
172
+ allow(File).to receive(:exist?).with("#{base}/c").and_return(true)
173
+
174
+ allow(File).to receive(:exist?).with('config/a').and_return(false)
175
+ allow(File).to receive(:exist?).with('config/b').and_return(false)
176
+ allow(File).to receive(:exist?).with('config/c').and_return(false)
177
+
178
+ expect(FileUtils).to receive(:ln_s).with("#{base}/a", 'config/a')
179
+ expect(FileUtils).to receive(:ln_s).with("#{base}/b", 'config/b')
180
+ expect(FileUtils).to receive(:ln_s).with("#{base}/c", 'config/c')
181
+
182
+ subject.link_global_configuration(%w(a b c))
183
+ end
184
+
185
+ it 'skips an existing file' do
186
+ allow(File).to receive(:exist?).and_return(true)
187
+ expect(FileUtils).not_to receive(:ln_s)
188
+
189
+ subject.link_global_configuration(%w(a))
190
+ end
191
+
192
+ it 'raises an error for a missing file' do
193
+ allow(File).to receive(:exist?).and_return(false)
194
+ expect { subject.link_global_configuration(%w(a)) }
195
+ .to raise_error(/Missing global config file/)
196
+ end
197
+ end
198
+
199
+ context '#update_local_configuration' do
200
+ let(:dist) { YAML.dump('a' => 1, 'b' => 2) }
201
+ let(:target) { nil }
202
+
203
+ let(:file) { 'a.yml' }
204
+ let(:target_file) { "config/#{file}" }
205
+ let(:dist_file) { "config/#{file}.dist" }
206
+ let(:written) { [] }
207
+
208
+ before do
209
+ allow(File).to receive(:exist?).with(target_file).and_return(target)
210
+ allow(File).to receive(:exist?).with(dist_file).and_return(dist)
211
+
212
+ allow(File).to receive(:read).with(target_file).and_return(target)
213
+ allow(File).to receive(:read).with(dist_file).and_return(dist)
214
+
215
+ file = double(File)
216
+ allow(File).to receive(:open).with(target_file, 'w').and_yield(file)
217
+ allow(file).to receive(:write) { |str| written << str }
218
+ end
219
+
220
+ def run
221
+ subject.update_local_configuration([file])
222
+ end
223
+
224
+ def updated_config
225
+ expect(written).not_to be_empty
226
+ YAML.load(written.join)
227
+ end
228
+
229
+ context 'when the target does not exist' do
230
+ it 'creates the target' do
231
+ run
232
+ expect(updated_config).to eq('a' => 1, 'b' => 2)
233
+ end
234
+ end
235
+
236
+ context 'when the target is missing an option' do
237
+ let(:target) { YAML.dump('a' => 2) }
238
+
239
+ it 'merges the new configuration option' do
240
+ run
241
+ expect(updated_config).to eq('a' => 2, 'b' => 2)
242
+ end
243
+ end
244
+
245
+ context 'when the target has an extra option' do
246
+ let(:target) { YAML.dump('a' => 2, 'b' => 2, 'c' => 3) }
247
+
248
+ it 'retains the extra option' do
249
+ run
250
+ expect(updated_config).to eq('a' => 2, 'b' => 2, 'c' => 3)
251
+ end
252
+ end
253
+
254
+ context 'when a deeply nested option is added' do
255
+ let(:dist) { YAML.dump('a' => 1, 'b' => { 'd' => 3, 'e' => 4 }) }
256
+ let(:target) { YAML.dump('a' => 14, 'b' => { 'd' => 30 }) }
257
+
258
+ it 'merges the new configuration option' do
259
+ run
260
+ expect(updated_config).to eq('a' => 14, 'b' => { 'd' => 30, 'e' => 4 })
261
+ end
262
+ end
263
+
264
+ context 'when a deeply nested option is removed' do
265
+ let(:dist) { YAML.dump('a' => 1, 'b' => { 'd' => 3 }) }
266
+ let(:target) { YAML.dump('a' => 14, 'b' => { 'd' => 30, 'e' => 4 }) }
267
+
268
+ it 'retains the option' do
269
+ run
270
+ expect(updated_config).to eq('a' => 14, 'b' => { 'd' => 30, 'e' => 4 })
271
+ end
272
+ end
273
+
274
+ context 'when the filename is not "*.yml"' do
275
+ let(:file) { 'a.txt' }
276
+
277
+ it 'raises an error' do
278
+ expect { run }.to raise_error(/Not a \.yml file/)
279
+ end
280
+ end
281
+
282
+ context 'when the dist file is missing' do
283
+ let(:dist) { nil }
284
+
285
+ it 'raises an error' do
286
+ expect { run }.to raise_error(/Missing dist config file/)
287
+ end
288
+ end
289
+ end
290
+
291
+ describe '#install_dist_template' do
292
+ let(:filename) { Faker::Lorem.words(2).join('.') }
293
+ let(:src) { "config/#{filename}.dist" }
294
+ let(:dest) { "config/#{filename}" }
295
+
296
+ def run
297
+ subject.install_dist_template([filename])
298
+ end
299
+
300
+ before do
301
+ allow(File).to receive(:exist?).with(src).and_return(true)
302
+ end
303
+
304
+ context 'when the target file exists' do
305
+ before do
306
+ allow(File).to receive(:exist?).with(dest).and_return(true)
307
+ end
308
+
309
+ it 'does not copy the file' do
310
+ expect(FileUtils).not_to receive(:copy)
311
+ run
312
+ end
313
+ end
314
+
315
+ context 'when the target file does not exist' do
316
+ before do
317
+ allow(File).to receive(:exist?).with(dest).and_return(false)
318
+ end
319
+
320
+ it 'copies the file' do
321
+ expect(FileUtils).to receive(:copy).with(src, dest)
322
+ run
323
+ end
324
+ end
325
+ end
326
+
327
+ def create_db_query(db)
328
+ "CREATE DATABASE IF NOT EXISTS `#{db}` CHARACTER SET utf8 COLLATE utf8_bin"
329
+ end
330
+ end
@@ -0,0 +1,45 @@
1
+ require 'rubygems'
2
+ require 'factory_girl'
3
+ require 'rails/all'
4
+ require 'faker'
5
+ require 'rspec/rails'
6
+ require 'simplecov'
7
+
8
+ SimpleCov.start do
9
+ add_filter('spec')
10
+ add_filter('sample')
11
+ end
12
+
13
+ ENV['RAILS_ENV'] ||= 'test'
14
+ require File.expand_path('../dummy/config/environment.rb', __FILE__)
15
+
16
+ load Rails.root.join('db/schema.rb')
17
+
18
+ FactoryGirl.find_definitions
19
+
20
+ RSpec.configure do |config|
21
+ config.around do |example|
22
+ ActiveRecord::Base.transaction do
23
+ example.run
24
+ raise ActiveRecord::Rollback
25
+ end
26
+ end
27
+
28
+ config.expect_with :rspec do |expectations|
29
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
30
+ end
31
+
32
+ config.mock_with :rspec do |mocks|
33
+ mocks.verify_partial_doubles = true
34
+ end
35
+
36
+ config.filter_run :focus
37
+ config.run_all_when_everything_filtered = true
38
+ config.disable_monkey_patching!
39
+
40
+ config.default_formatter = 'doc' if config.files_to_run.one?
41
+ config.order = :random
42
+ Kernel.srand config.seed
43
+
44
+ config.include FactoryGirl::Syntax::Methods
45
+ end
metadata ADDED
@@ -0,0 +1,387 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aaf-gumboot
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre.alpha.2
5
+ platform: ruby
6
+ authors:
7
+ - Bradley Beddoes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: accession
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mysql2
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.3.20
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.3.20
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: valhammer
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: factory_girl
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: faker
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec-rails
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: codeclimate-test-reporter
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rails-controller-testing
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: guard
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: guard-rspec
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: guard-rubocop
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: guard-bundler
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: rails
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: 4.2.6
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: 4.2.6
265
+ description: Provides a set of shared specs and base generators to ensure that all
266
+ AAF ruby applications follow the same basic structure and implementation for subjects,
267
+ RESTful APIs and access control.
268
+ email:
269
+ - bradleybeddoes@aaf.edu.au
270
+ executables: []
271
+ extensions: []
272
+ extra_rdoc_files: []
273
+ files:
274
+ - ".gitignore"
275
+ - ".rspec"
276
+ - ".rubocop.yml"
277
+ - Gemfile
278
+ - Guardfile
279
+ - LICENSE
280
+ - README.md
281
+ - Rakefile
282
+ - aaf-gumboot.gemspec
283
+ - lib/aaf-gumboot.rb
284
+ - lib/gumboot.rb
285
+ - lib/gumboot/shared_examples/anonymous_controller.rb
286
+ - lib/gumboot/shared_examples/api_constraints.rb
287
+ - lib/gumboot/shared_examples/api_controller.rb
288
+ - lib/gumboot/shared_examples/api_subjects.rb
289
+ - lib/gumboot/shared_examples/application_controller.rb
290
+ - lib/gumboot/shared_examples/database_schema.rb
291
+ - lib/gumboot/shared_examples/foreign_keys.rb
292
+ - lib/gumboot/shared_examples/permissions.rb
293
+ - lib/gumboot/shared_examples/roles.rb
294
+ - lib/gumboot/shared_examples/subjects.rb
295
+ - lib/gumboot/strap.rb
296
+ - lib/gumboot/version.rb
297
+ - spec/dummy/README.rdoc
298
+ - spec/dummy/Rakefile
299
+ - spec/dummy/app/assets/images/.keep
300
+ - spec/dummy/app/assets/javascripts/application.js
301
+ - spec/dummy/app/assets/stylesheets/application.css
302
+ - spec/dummy/app/controllers/api/api_controller.rb
303
+ - spec/dummy/app/controllers/application_controller.rb
304
+ - spec/dummy/app/controllers/concerns/.keep
305
+ - spec/dummy/app/helpers/application_helper.rb
306
+ - spec/dummy/app/mailers/.keep
307
+ - spec/dummy/app/models/.keep
308
+ - spec/dummy/app/models/api_subject.rb
309
+ - spec/dummy/app/models/api_subject_role.rb
310
+ - spec/dummy/app/models/concerns/.keep
311
+ - spec/dummy/app/models/permission.rb
312
+ - spec/dummy/app/models/role.rb
313
+ - spec/dummy/app/models/subject.rb
314
+ - spec/dummy/app/models/subject_role.rb
315
+ - spec/dummy/app/views/dynamic_errors/forbidden.html.erb
316
+ - spec/dummy/app/views/dynamic_errors/unauthorized.html.erb
317
+ - spec/dummy/app/views/layouts/application.html.erb
318
+ - spec/dummy/bin/bundle
319
+ - spec/dummy/bin/rails
320
+ - spec/dummy/bin/rake
321
+ - spec/dummy/config.ru
322
+ - spec/dummy/config/application.rb
323
+ - spec/dummy/config/boot.rb
324
+ - spec/dummy/config/database.yml
325
+ - spec/dummy/config/environment.rb
326
+ - spec/dummy/config/environments/development.rb
327
+ - spec/dummy/config/environments/production.rb
328
+ - spec/dummy/config/environments/test.rb
329
+ - spec/dummy/config/initializers/assets.rb
330
+ - spec/dummy/config/initializers/backtrace_silencers.rb
331
+ - spec/dummy/config/initializers/cookies_serializer.rb
332
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
333
+ - spec/dummy/config/initializers/inflections.rb
334
+ - spec/dummy/config/initializers/mime_types.rb
335
+ - spec/dummy/config/initializers/session_store.rb
336
+ - spec/dummy/config/initializers/wrap_parameters.rb
337
+ - spec/dummy/config/locales/en.yml
338
+ - spec/dummy/config/routes.rb
339
+ - spec/dummy/config/secrets.yml
340
+ - spec/dummy/db/schema.rb
341
+ - spec/dummy/db/test.sqlite3
342
+ - spec/dummy/lib/api_constraints.rb
343
+ - spec/dummy/lib/assets/.keep
344
+ - spec/dummy/log/.keep
345
+ - spec/dummy/public/404.html
346
+ - spec/dummy/public/422.html
347
+ - spec/dummy/public/500.html
348
+ - spec/dummy/public/favicon.ico
349
+ - spec/factories/api_subjects.rb
350
+ - spec/factories/permissions.rb
351
+ - spec/factories/roles.rb
352
+ - spec/factories/subjects.rb
353
+ - spec/gumboot/api_constraints_spec.rb
354
+ - spec/gumboot/api_controller_spec.rb
355
+ - spec/gumboot/api_subjects_spec.rb
356
+ - spec/gumboot/application_controller_spec.rb
357
+ - spec/gumboot/foreign_keys_spec.rb
358
+ - spec/gumboot/permissions_spec.rb
359
+ - spec/gumboot/roles_spec.rb
360
+ - spec/gumboot/subjects_spec.rb
361
+ - spec/lib/gumboot/strap_spec.rb
362
+ - spec/spec_helper.rb
363
+ homepage: http://www.aaf.edu.au
364
+ licenses:
365
+ - Apache-2.0
366
+ metadata: {}
367
+ post_install_message:
368
+ rdoc_options: []
369
+ require_paths:
370
+ - lib
371
+ required_ruby_version: !ruby/object:Gem::Requirement
372
+ requirements:
373
+ - - ">="
374
+ - !ruby/object:Gem::Version
375
+ version: '0'
376
+ required_rubygems_version: !ruby/object:Gem::Requirement
377
+ requirements:
378
+ - - ">"
379
+ - !ruby/object:Gem::Version
380
+ version: 1.3.1
381
+ requirements: []
382
+ rubyforge_project:
383
+ rubygems_version: 2.6.8
384
+ signing_key:
385
+ specification_version: 4
386
+ summary: Kick off subject and API structure for AAF applications
387
+ test_files: []