specify_cli 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +17 -0
  5. data/Gemfile.lock +117 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.rdoc +43 -0
  8. data/Rakefile +15 -0
  9. data/bin/specify_cli +248 -0
  10. data/lib/specify.rb +45 -0
  11. data/lib/specify/branch_parser.rb +85 -0
  12. data/lib/specify/cli.rb +11 -0
  13. data/lib/specify/cli/database_setup.rb +46 -0
  14. data/lib/specify/cli/stubs.rb +63 -0
  15. data/lib/specify/cli/viewset.rb +21 -0
  16. data/lib/specify/configuration.rb +12 -0
  17. data/lib/specify/configuration/config.rb +120 -0
  18. data/lib/specify/configuration/db_config.rb +162 -0
  19. data/lib/specify/configuration/host_config.rb +37 -0
  20. data/lib/specify/database.rb +140 -0
  21. data/lib/specify/models.rb +43 -0
  22. data/lib/specify/models/accession.rb +33 -0
  23. data/lib/specify/models/agent.rb +138 -0
  24. data/lib/specify/models/app_resource_data.rb +32 -0
  25. data/lib/specify/models/app_resource_dir.rb +43 -0
  26. data/lib/specify/models/auto_numbering_scheme.rb +94 -0
  27. data/lib/specify/models/collecting_event.rb +38 -0
  28. data/lib/specify/models/collection.rb +67 -0
  29. data/lib/specify/models/collection_object.rb +127 -0
  30. data/lib/specify/models/createable.rb +21 -0
  31. data/lib/specify/models/determination.rb +63 -0
  32. data/lib/specify/models/discipline.rb +61 -0
  33. data/lib/specify/models/division.rb +26 -0
  34. data/lib/specify/models/geography.rb +5 -0
  35. data/lib/specify/models/geography/administrative_division.rb +32 -0
  36. data/lib/specify/models/geography/geographic_name.rb +66 -0
  37. data/lib/specify/models/geography/geography.rb +23 -0
  38. data/lib/specify/models/institution.rb +13 -0
  39. data/lib/specify/models/locality.rb +50 -0
  40. data/lib/specify/models/preparation.rb +53 -0
  41. data/lib/specify/models/preparation_type.rb +30 -0
  42. data/lib/specify/models/record_set.rb +55 -0
  43. data/lib/specify/models/record_set_item.rb +29 -0
  44. data/lib/specify/models/taxonomy.rb +6 -0
  45. data/lib/specify/models/taxonomy/common_name.rb +14 -0
  46. data/lib/specify/models/taxonomy/rank.rb +31 -0
  47. data/lib/specify/models/taxonomy/taxon.rb +54 -0
  48. data/lib/specify/models/taxonomy/taxonomy.rb +21 -0
  49. data/lib/specify/models/tree_queryable.rb +55 -0
  50. data/lib/specify/models/updateable.rb +20 -0
  51. data/lib/specify/models/user.rb +104 -0
  52. data/lib/specify/models/view_set_object.rb +32 -0
  53. data/lib/specify/number_format.rb +60 -0
  54. data/lib/specify/services.rb +18 -0
  55. data/lib/specify/services/service.rb +51 -0
  56. data/lib/specify/services/stub_generator.rb +291 -0
  57. data/lib/specify/services/view_loader.rb +177 -0
  58. data/lib/specify/session.rb +77 -0
  59. data/lib/specify/user_type.rb +61 -0
  60. data/lib/specify/version.rb +19 -0
  61. data/man/specify_cli-database.1 +60 -0
  62. data/man/specify_cli-database.1.html +137 -0
  63. data/man/specify_cli-database.1.ronn +53 -0
  64. data/man/specify_cli-repository.1 +55 -0
  65. data/man/specify_cli-repository.1.html +128 -0
  66. data/man/specify_cli-repository.1.ronn +42 -0
  67. data/man/specify_cli-stubs.1 +177 -0
  68. data/man/specify_cli-stubs.1.html +239 -0
  69. data/man/specify_cli-stubs.1.ronn +147 -0
  70. data/man/specify_cli-viewset.1 +92 -0
  71. data/man/specify_cli-viewset.1.html +154 -0
  72. data/man/specify_cli-viewset.1.ronn +72 -0
  73. data/man/specify_cli.1 +213 -0
  74. data/man/specify_cli.1.html +252 -0
  75. data/man/specify_cli.1.ronn +157 -0
  76. data/spec/branch_parser_spec.rb +94 -0
  77. data/spec/cli/stubs_spec.rb +44 -0
  78. data/spec/configuration/config_spec.rb +269 -0
  79. data/spec/configuration/db_config_spec.rb +299 -0
  80. data/spec/configuration/host_config_spec.rb +64 -0
  81. data/spec/database_spec.rb +83 -0
  82. data/spec/examples.txt +217 -0
  83. data/spec/helpers.rb +15 -0
  84. data/spec/models/app_resource_data_spec.rb +38 -0
  85. data/spec/models/app_resource_dir_spec.rb +8 -0
  86. data/spec/models/auto_numbering_scheme_spec.rb +78 -0
  87. data/spec/models/collection_object_spec.rb +92 -0
  88. data/spec/models/collection_spec.rb +32 -0
  89. data/spec/models/discipline_spec.rb +31 -0
  90. data/spec/models/record_set_spec.rb +18 -0
  91. data/spec/models/user_spec.rb +182 -0
  92. data/spec/models/view_set_object_spec.rb +70 -0
  93. data/spec/number_format_spec.rb +43 -0
  94. data/spec/services/stub_generator_spec.rb +635 -0
  95. data/spec/services/view_loader_spec.rb +436 -0
  96. data/spec/session_spec.rb +105 -0
  97. data/spec/spec_helper.rb +116 -0
  98. data/spec/support/db.yml +12 -0
  99. data/spec/support/stub.yaml +17 -0
  100. data/spec/support/stub_locality.yaml +19 -0
  101. data/spec/support/viewsets/paleo.views.xml +30 -0
  102. data/spec/support/viewsets/paleo.xml +30 -0
  103. data/spec/user_type_spec.rb +79 -0
  104. data/specify_cli.gemspec +27 -0
  105. data/specify_cli.rdoc +1 -0
  106. metadata +246 -0
@@ -0,0 +1,436 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Tests for the
4
+ module Specify
5
+ module Service
6
+ RSpec.describe ViewLoader do
7
+ let :config do
8
+ Pathname.new(Dir.pwd).join('spec', 'support', 'db.yml')
9
+ end
10
+
11
+ let(:path) { 'sp_resource' }
12
+
13
+ describe '.from_branch(name, config)' do
14
+ context 'when branch is discipline level' do
15
+ subject do
16
+ bname = 'SPSPEC/TestCollection/discipline'
17
+ described_class.from_branch(path: path,
18
+ name: bname,
19
+ config: config).target
20
+ end
21
+
22
+ it do
23
+ is_expected
24
+ .to be_a(Model::Discipline)
25
+ .and have_attributes Name: 'Test Discipline'
26
+ end
27
+ end
28
+
29
+ context 'when branch is collection level' do
30
+ subject do
31
+ bname = 'SPSPEC/TestCollection/collection'
32
+ described_class.from_branch(path: path,
33
+ name: bname,
34
+ config: config).target
35
+ end
36
+
37
+ it do
38
+ is_expected
39
+ .to be_a(Model::Collection)
40
+ .and have_attributes CollectionName: 'Test Collection'
41
+ end
42
+ end
43
+
44
+ context 'when branch is user type level' do
45
+ subject do
46
+ bname = 'SPSPEC/TestCollection/Manager'
47
+ described_class.from_branch(path: path,
48
+ name: bname,
49
+ config: config).target
50
+ end
51
+
52
+ it do
53
+ is_expected
54
+ .to be_a(UserType)
55
+ .and have_attributes name: :manager
56
+ end
57
+ end
58
+
59
+ context 'when branch is user level' do
60
+ subject do
61
+ bname = 'SPSPEC/TestCollection/user/specuser'
62
+ described_class.from_branch(path: path,
63
+ name: bname,
64
+ config: config).target
65
+ end
66
+
67
+ it do
68
+ is_expected
69
+ .to be_a(Model::User)
70
+ .and have_attributes EMail: 'john.doe@example.com',
71
+ Name: 'specuser'
72
+ end
73
+ end
74
+ end
75
+
76
+ describe '.user_target(hash)' do
77
+ subject { described_class.user_target(user: 'specuser') }
78
+
79
+ it do
80
+ is_expected.to be_a(Model::User)
81
+ .and have_attributes Name: 'specuser'
82
+ end
83
+ end
84
+
85
+ describe '.user_type_target(hash)' do
86
+ subject { described_class.user_type_target(user_type: 'manager') }
87
+
88
+ it do
89
+ is_expected.to be_a(UserType)
90
+ .and have_attributes name: 'manager'
91
+ end
92
+ end
93
+
94
+ describe '#target=(level)' do
95
+ let :view_loader do
96
+ described_class.new host: 'localhost',
97
+ database: 'SPSPEC',
98
+ collection: 'Test Collection',
99
+ config: config
100
+ end
101
+
102
+ context 'when level is :discipline' do
103
+ it do
104
+ expect { view_loader.target = :discipline }
105
+ .to change(view_loader, :target)
106
+ .from(be_nil)
107
+ .to a_kind_of(Model::Discipline)
108
+ .and have_attributes Name: 'Test Discipline'
109
+ end
110
+ end
111
+
112
+ context 'when level is :collection' do
113
+ it do
114
+ expect { view_loader.target = :collection }
115
+ .to change(view_loader, :target)
116
+ .from(be_nil)
117
+ .to a_kind_of(Model::Collection)
118
+ .and have_attributes CollectionName: 'Test Collection'
119
+ end
120
+ end
121
+
122
+ context 'when level is { user_type: :manager }' do
123
+ it do
124
+ expect { view_loader.target = { user_type: 'manager' } }
125
+ .to change(view_loader, :target)
126
+ .from(be_nil)
127
+ .to a_kind_of(UserType)
128
+ .and have_attributes name: 'manager'
129
+ end
130
+ end
131
+
132
+ context 'when level is { user: \'specuser\' }' do
133
+ it do
134
+ expect { view_loader.target = { user: 'specuser' } }
135
+ .to change(view_loader, :target)
136
+ .from(be_nil)
137
+ .to a_kind_of(Model::User)
138
+ .and have_attributes EMail: 'john.doe@example.com',
139
+ Name: 'specuser'
140
+ end
141
+ end
142
+
143
+ context 'when level is nil' do
144
+ it do
145
+ expect { view_loader.target = nil }
146
+ .not_to change(view_loader, :target)
147
+ end
148
+ end
149
+ end
150
+
151
+ describe '#import(file)' do
152
+ let :file do
153
+ Pathname.new(Dir.pwd).join('spec', 'support',
154
+ 'viewsets', 'paleo.views.xml')
155
+ end
156
+
157
+ context 'when the app_resource_dir exists' do
158
+ let :view_loader do
159
+ described_class.new host: 'localhost',
160
+ database: 'SPSPEC',
161
+ collection: 'Test Collection',
162
+ level: :collection,
163
+ config: config
164
+ end
165
+
166
+ context 'when file is not a .views.xml file' do
167
+ let :wrong_file do
168
+ Pathname.new(Dir.pwd).join('spec', 'support',
169
+ 'viewsets', 'paleo.xml')
170
+ end
171
+
172
+ it do
173
+ expect { view_loader.import(wrong_file) }
174
+ .to raise_error ArgumentError, FileError::VIEWS_FILE
175
+ end
176
+ end
177
+
178
+ context 'when file does not exist' do
179
+ it do
180
+ expect { view_loader.import('no_file.xml') }
181
+ .to raise_error ArgumentError, FileError::NO_FILE
182
+ end
183
+ end
184
+
185
+ context 'when file is a .views.xml file' do
186
+ before do
187
+ datadir = view_loader.target.view_set.app_resource_data
188
+ datadir.data = nil
189
+ datadir.save
190
+ end
191
+
192
+ it do
193
+ expect { view_loader.import(file) }
194
+ .to change { view_loader.target.view_set.app_resource_data.data }
195
+ .from(nil).to(Sequel.blob(File.read(file)))
196
+ end
197
+ end
198
+ end
199
+
200
+ context 'when the app_resource_dir does not exist' do
201
+ let :view_loader do
202
+ described_class.new host: 'localhost',
203
+ database: 'SPSPEC',
204
+ collection: 'Another Collection',
205
+ config: config
206
+ end
207
+
208
+ context 'when uploading to the collection' do
209
+ before { view_loader.target = :collection }
210
+
211
+ it do
212
+ expect { view_loader.import(file) }
213
+ .to change { view_loader.target.view_set }
214
+ .from(nil).to(an_instance_of(Model::ViewSetObject))
215
+ .and change { view_loader.target.view_set&.app_resource_data&.data }
216
+ .from(nil).to(Sequel.blob(File.read(file)))
217
+ end
218
+ end
219
+
220
+ context 'when uploading to the user type' do
221
+ before { view_loader.target = { user_type: 'manager' } }
222
+
223
+ let(:collection) { Model::Collection.first(Code: 'NECE') }
224
+
225
+ it do
226
+ expect { view_loader.import(file) }
227
+ .to change { view_loader.target.view_set(collection) }
228
+ .from(nil).to(an_instance_of(Model::ViewSetObject))
229
+ .and change { view_loader.target.view_set(collection)&.app_resource_data&.data }
230
+ .from(nil).to(Sequel.blob(File.read(file)))
231
+ end
232
+ end
233
+ end
234
+ end
235
+
236
+ describe '#view_collection' do
237
+ subject { view_loader.view_collection }
238
+
239
+ let :view_loader do
240
+ described_class.new host: 'localhost',
241
+ database: 'SPSPEC',
242
+ collection: 'Test Collection',
243
+ config: config
244
+ end
245
+
246
+ context 'when level is not discipline' do
247
+ before { view_loader.target = :collection }
248
+
249
+ it do
250
+ is_expected.to be view_loader.session.collection
251
+ end
252
+ end
253
+
254
+ context 'when level is discipline' do
255
+ before { view_loader.target = :discipline }
256
+
257
+ it do
258
+ is_expected.to be_nil
259
+ end
260
+ end
261
+ end
262
+
263
+ describe '#view_discipline' do
264
+ subject { view_loader.view_discipline }
265
+
266
+ let :view_loader do
267
+ described_class.new host: 'localhost',
268
+ database: 'SPSPEC',
269
+ collection: 'Test Collection',
270
+ config: config
271
+ end
272
+
273
+ it do
274
+ is_expected.to be_a(Model::Discipline)
275
+ .and have_attributes Name: 'Test Discipline'
276
+ end
277
+ end
278
+
279
+ describe '#personal?' do
280
+ subject { view_loader.personal? }
281
+
282
+ let :view_loader do
283
+ described_class.new host: 'localhost',
284
+ database: 'SPSPEC',
285
+ collection: 'Test Collection',
286
+ config: config
287
+ end
288
+
289
+ context 'when discipline level' do
290
+ before { view_loader.target = :discipline }
291
+
292
+ it { is_expected.to be_falsey }
293
+ end
294
+
295
+ context 'when collection level' do
296
+ before { view_loader.target = :collection }
297
+
298
+ it { is_expected.to be_falsey }
299
+ end
300
+
301
+ context 'when user type level' do
302
+ before { view_loader.target = { user_type: 'manager' } }
303
+
304
+ it { is_expected.to be_falsey }
305
+ end
306
+
307
+ context 'when user level' do
308
+ before { view_loader.target = { user: 'specguest' } }
309
+
310
+ it { is_expected.to be_truthy }
311
+ end
312
+ end
313
+
314
+ describe '#view_level' do
315
+ subject { view_loader.view_level }
316
+
317
+ let :view_loader do
318
+ described_class.new host: 'localhost',
319
+ database: 'SPSPEC',
320
+ collection: 'Test Collection',
321
+ config: config
322
+ end
323
+
324
+ context 'when discipline level' do
325
+ before { view_loader.target = :discipline }
326
+
327
+ it { is_expected.to be 0 }
328
+ end
329
+
330
+ context 'when collection level' do
331
+ before { view_loader.target = :collection }
332
+
333
+ it { is_expected.to be 2 }
334
+ end
335
+
336
+ context 'when user type level' do
337
+ before { view_loader.target = { user_type: 'manager' } }
338
+
339
+ it { is_expected.to be 0 }
340
+ end
341
+
342
+ context 'when user level' do
343
+ before { view_loader.target = { user: 'specuser' } }
344
+
345
+ it { is_expected.to be 0 }
346
+ end
347
+ end
348
+
349
+ describe '#view_type' do
350
+ subject { view_loader.view_type }
351
+
352
+ let :view_loader do
353
+ described_class.new host: 'localhost',
354
+ database: 'SPSPEC',
355
+ collection: 'Test Collection',
356
+ config: config
357
+ end
358
+
359
+ it { is_expected.to eq 'Test Discipline' }
360
+ end
361
+
362
+ describe '#view_user' do
363
+ subject { view_loader.view_user }
364
+
365
+ let :view_loader do
366
+ described_class.new host: 'localhost',
367
+ database: 'SPSPEC',
368
+ collection: 'Test Collection',
369
+ config: config
370
+ end
371
+
372
+ context 'when discipline level' do
373
+ before { view_loader.target = :discipline }
374
+
375
+ it { is_expected.to be view_loader.session.user }
376
+ end
377
+
378
+ context 'when collection level' do
379
+ before { view_loader.target = :collection }
380
+
381
+ it { is_expected.to be view_loader.session.user }
382
+ end
383
+
384
+ context 'when user type level' do
385
+ before { view_loader.target = { user_type: 'manager' } }
386
+
387
+ it { is_expected.to be view_loader.session.user }
388
+ end
389
+
390
+ context 'when user level' do
391
+ before { view_loader.target = { user: 'specguest' } }
392
+
393
+ it do
394
+ is_expected.to be_a(Model::User)
395
+ .and have_attributes Name: 'specguest'
396
+ end
397
+ end
398
+ end
399
+
400
+ describe '#view_user_type' do
401
+ subject { view_loader.view_user_type }
402
+
403
+ let :view_loader do
404
+ described_class.new host: 'localhost',
405
+ database: 'SPSPEC',
406
+ collection: 'Test Collection',
407
+ config: config
408
+ end
409
+
410
+ context 'when discipline level' do
411
+ before { view_loader.target = :discipline }
412
+
413
+ it { is_expected.to be_nil }
414
+ end
415
+
416
+ context 'when collection level' do
417
+ before { view_loader.target = :collection }
418
+
419
+ it { is_expected.to be_nil }
420
+ end
421
+
422
+ context 'when user type level' do
423
+ before { view_loader.target = { user_type: 'manager' } }
424
+
425
+ it { is_expected.to eq 'manager' }
426
+ end
427
+
428
+ context 'when user level' do
429
+ before { view_loader.target = { user: 'specguest' } }
430
+
431
+ it { is_expected.to eq 'guest' }
432
+ end
433
+ end
434
+ end
435
+ end
436
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Specify
4
+ RSpec.describe Session do
5
+ let :session do
6
+ described_class.new('specuser', 'Test Collection')
7
+ end
8
+
9
+ describe '#close' do
10
+ let :collection do
11
+ Model::Collection.first CollectionName: 'Test Collection'
12
+ end
13
+
14
+ let(:user) { Model::User.first Name: 'specuser' }
15
+
16
+ before { user.log_in(collection) }
17
+
18
+ it do
19
+ expect(session.close)
20
+ .to be_a(described_class)
21
+ .and have_attributes active: false,
22
+ collection: collection,
23
+ user: user
24
+ end
25
+
26
+ it do
27
+ expect { session.close }
28
+ .to change { Model::User.first(Name: 'specuser').IsLoggedIn }
29
+ .from(true).to(false)
30
+ end
31
+
32
+ context 'when observed by a database' do
33
+ before { SPSPEC << session }
34
+
35
+ it do
36
+ expect { session.close }
37
+ .to change(SPSPEC, :sessions)
38
+ .from(including(an_instance_of(described_class)))
39
+ .to be_empty
40
+ end
41
+ end
42
+ end
43
+
44
+ describe '#open' do
45
+ let :collection do
46
+ Model::Collection.first CollectionName: 'Test Collection'
47
+ end
48
+
49
+ let(:user) { Model::User.first Name: 'specuser' }
50
+
51
+ before { user.log_out }
52
+
53
+ it do
54
+ expect(session.open)
55
+ .to be_a(described_class)
56
+ .and have_attributes active: true,
57
+ collection: collection,
58
+ user: user
59
+ end
60
+
61
+ it 'opens a session' do
62
+ expect { session.open }
63
+ .to change { Model::User.first(Name: 'specuser').IsLoggedIn }
64
+ .from(false).to(true)
65
+ end
66
+ end
67
+
68
+ describe '#open?' do
69
+ context 'when the session is open' do
70
+ subject { session.open? }
71
+
72
+ before { session.open }
73
+
74
+ it { is_expected.to be_truthy }
75
+ end
76
+
77
+ context 'when the session is closed' do
78
+ subject { session.open? }
79
+
80
+ before { session.close }
81
+
82
+ it { is_expected.to be_falsey }
83
+ end
84
+ end
85
+
86
+ describe '#session_agent' do
87
+ subject { session.session_agent }
88
+
89
+ let :division do
90
+ Model::Collection.first(CollectionName: 'Test Collection')
91
+ .discipline.division
92
+ end
93
+
94
+ before { session.open }
95
+
96
+ it do
97
+ is_expected.to be_a(Model::Agent)
98
+ .and have_attributes Email: 'john.doe@example.com',
99
+ FirstName: 'John',
100
+ LastName: 'Doe',
101
+ division: division
102
+ end
103
+ end
104
+ end
105
+ end