specify_cli 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +117 -0
- data/LICENSE.txt +21 -0
- data/README.rdoc +43 -0
- data/Rakefile +15 -0
- data/bin/specify_cli +248 -0
- data/lib/specify.rb +45 -0
- data/lib/specify/branch_parser.rb +85 -0
- data/lib/specify/cli.rb +11 -0
- data/lib/specify/cli/database_setup.rb +46 -0
- data/lib/specify/cli/stubs.rb +63 -0
- data/lib/specify/cli/viewset.rb +21 -0
- data/lib/specify/configuration.rb +12 -0
- data/lib/specify/configuration/config.rb +120 -0
- data/lib/specify/configuration/db_config.rb +162 -0
- data/lib/specify/configuration/host_config.rb +37 -0
- data/lib/specify/database.rb +140 -0
- data/lib/specify/models.rb +43 -0
- data/lib/specify/models/accession.rb +33 -0
- data/lib/specify/models/agent.rb +138 -0
- data/lib/specify/models/app_resource_data.rb +32 -0
- data/lib/specify/models/app_resource_dir.rb +43 -0
- data/lib/specify/models/auto_numbering_scheme.rb +94 -0
- data/lib/specify/models/collecting_event.rb +38 -0
- data/lib/specify/models/collection.rb +67 -0
- data/lib/specify/models/collection_object.rb +127 -0
- data/lib/specify/models/createable.rb +21 -0
- data/lib/specify/models/determination.rb +63 -0
- data/lib/specify/models/discipline.rb +61 -0
- data/lib/specify/models/division.rb +26 -0
- data/lib/specify/models/geography.rb +5 -0
- data/lib/specify/models/geography/administrative_division.rb +32 -0
- data/lib/specify/models/geography/geographic_name.rb +66 -0
- data/lib/specify/models/geography/geography.rb +23 -0
- data/lib/specify/models/institution.rb +13 -0
- data/lib/specify/models/locality.rb +50 -0
- data/lib/specify/models/preparation.rb +53 -0
- data/lib/specify/models/preparation_type.rb +30 -0
- data/lib/specify/models/record_set.rb +55 -0
- data/lib/specify/models/record_set_item.rb +29 -0
- data/lib/specify/models/taxonomy.rb +6 -0
- data/lib/specify/models/taxonomy/common_name.rb +14 -0
- data/lib/specify/models/taxonomy/rank.rb +31 -0
- data/lib/specify/models/taxonomy/taxon.rb +54 -0
- data/lib/specify/models/taxonomy/taxonomy.rb +21 -0
- data/lib/specify/models/tree_queryable.rb +55 -0
- data/lib/specify/models/updateable.rb +20 -0
- data/lib/specify/models/user.rb +104 -0
- data/lib/specify/models/view_set_object.rb +32 -0
- data/lib/specify/number_format.rb +60 -0
- data/lib/specify/services.rb +18 -0
- data/lib/specify/services/service.rb +51 -0
- data/lib/specify/services/stub_generator.rb +291 -0
- data/lib/specify/services/view_loader.rb +177 -0
- data/lib/specify/session.rb +77 -0
- data/lib/specify/user_type.rb +61 -0
- data/lib/specify/version.rb +19 -0
- data/man/specify_cli-database.1 +60 -0
- data/man/specify_cli-database.1.html +137 -0
- data/man/specify_cli-database.1.ronn +53 -0
- data/man/specify_cli-repository.1 +55 -0
- data/man/specify_cli-repository.1.html +128 -0
- data/man/specify_cli-repository.1.ronn +42 -0
- data/man/specify_cli-stubs.1 +177 -0
- data/man/specify_cli-stubs.1.html +239 -0
- data/man/specify_cli-stubs.1.ronn +147 -0
- data/man/specify_cli-viewset.1 +92 -0
- data/man/specify_cli-viewset.1.html +154 -0
- data/man/specify_cli-viewset.1.ronn +72 -0
- data/man/specify_cli.1 +213 -0
- data/man/specify_cli.1.html +252 -0
- data/man/specify_cli.1.ronn +157 -0
- data/spec/branch_parser_spec.rb +94 -0
- data/spec/cli/stubs_spec.rb +44 -0
- data/spec/configuration/config_spec.rb +269 -0
- data/spec/configuration/db_config_spec.rb +299 -0
- data/spec/configuration/host_config_spec.rb +64 -0
- data/spec/database_spec.rb +83 -0
- data/spec/examples.txt +217 -0
- data/spec/helpers.rb +15 -0
- data/spec/models/app_resource_data_spec.rb +38 -0
- data/spec/models/app_resource_dir_spec.rb +8 -0
- data/spec/models/auto_numbering_scheme_spec.rb +78 -0
- data/spec/models/collection_object_spec.rb +92 -0
- data/spec/models/collection_spec.rb +32 -0
- data/spec/models/discipline_spec.rb +31 -0
- data/spec/models/record_set_spec.rb +18 -0
- data/spec/models/user_spec.rb +182 -0
- data/spec/models/view_set_object_spec.rb +70 -0
- data/spec/number_format_spec.rb +43 -0
- data/spec/services/stub_generator_spec.rb +635 -0
- data/spec/services/view_loader_spec.rb +436 -0
- data/spec/session_spec.rb +105 -0
- data/spec/spec_helper.rb +116 -0
- data/spec/support/db.yml +12 -0
- data/spec/support/stub.yaml +17 -0
- data/spec/support/stub_locality.yaml +19 -0
- data/spec/support/viewsets/paleo.views.xml +30 -0
- data/spec/support/viewsets/paleo.xml +30 -0
- data/spec/user_type_spec.rb +79 -0
- data/specify_cli.gemspec +27 -0
- data/specify_cli.rdoc +1 -0
- metadata +246 -0
@@ -0,0 +1,157 @@
|
|
1
|
+
specify_cli(1) -- A command line interface for Specify
|
2
|
+
===============================================================================
|
3
|
+
|
4
|
+
## SYNOPSIS
|
5
|
+
|
6
|
+
`specify_cli` [**-D**|**--database** <name>]
|
7
|
+
[**-H**|**--host** <name>]
|
8
|
+
[**-P**|**--password** <password>]
|
9
|
+
[**-U**|**--specify_user** <name>]
|
10
|
+
[**-c**|**--db_config** <file>]
|
11
|
+
[**-p**|**--port** <number>]
|
12
|
+
[**-u**|**--user** <name>]
|
13
|
+
<command> [<options>] [<args>]
|
14
|
+
|
15
|
+
## DESCRIPTION
|
16
|
+
**specify_cli** is a tool that allows certain tasks in a Specify database to be
|
17
|
+
carried out from the command line.
|
18
|
+
Specify is a management system for biological collections developed by the
|
19
|
+
Specify Collections Consortium (http://www.sustain.specifysoftware.org).
|
20
|
+
|
21
|
+
**specify_cli** is an independent development that is not supported by the
|
22
|
+
Specify Collections Consortium. It operates directly on the MySQL/MariaDB
|
23
|
+
backend used by Specify. **Use at your own risk**.
|
24
|
+
|
25
|
+
Tasks currently supported:
|
26
|
+
|
27
|
+
* upload of user interface form definitions (*.views.xml* files) to the database
|
28
|
+
* generation of collection object stub records
|
29
|
+
|
30
|
+
## FILES
|
31
|
+
|
32
|
+
`~/.specify_dbs.rc.yaml` is a YAML file that stores information about
|
33
|
+
Specify databases and directories containing *.views.xml* files.
|
34
|
+
The file has the general structure:
|
35
|
+
|
36
|
+
---
|
37
|
+
:dir_names:
|
38
|
+
<view_file_directory>: <hostname>
|
39
|
+
...
|
40
|
+
:hosts:
|
41
|
+
<hostname>:
|
42
|
+
:port: <port_number>
|
43
|
+
:databases:
|
44
|
+
<database_name>:
|
45
|
+
:db_user:
|
46
|
+
:name: <mysql_username>
|
47
|
+
:password: <password>
|
48
|
+
:sp_user: <specify_username>
|
49
|
+
...
|
50
|
+
...
|
51
|
+
|
52
|
+
The section `dir_names` contains directory-host-mappings. A directory-host-
|
53
|
+
mapping is a key-value-pair, where the key is the path of a directory on your
|
54
|
+
hard drive, the value is a host name. This is used to automatically resolve the
|
55
|
+
correct host for a *.views.xml* file based on the directory it is in. Add
|
56
|
+
mappings here by editing the file or using the **specify_cli-repository(1)**
|
57
|
+
command.
|
58
|
+
|
59
|
+
The section `hosts` contains settings for Specify databases by grouped by
|
60
|
+
`<hostname>`. For each host, the `port` and any `databases` can be configured in
|
61
|
+
this file by editing it or by using the **specify_cli-database(1)** command. The `databases` section contains connection settings for the individual databases by
|
62
|
+
`<database_name>`. The `db_user` is the MySQL/MariaDB user used to connect to
|
63
|
+
the database and will typically be the Specify *master user*. Leave `password`
|
64
|
+
blank to be prompted for the password when you run the command (this will not
|
65
|
+
work when triggered as a bash script from another application, e.g. a text
|
66
|
+
editor). Apart from the `db_user` `specify_cli` also needs a Specify user (a
|
67
|
+
user that Specify uses internally), which is provided under `sp_user`. Every
|
68
|
+
command (except the configuration commands **specify_cli-database(1)** and **specify_cli-repository(1)**) will start a session in Specify where the Specify
|
69
|
+
user will be logged in to the collection. Any records created or modified during
|
70
|
+
this session will be marked as created by or modified by the `sp_user`.
|
71
|
+
|
72
|
+
## COMMANDS
|
73
|
+
|
74
|
+
* `specify_cli-database`(1)
|
75
|
+
Add a database configuration.
|
76
|
+
* `specify_cli-stubs`(1)
|
77
|
+
Create stub records
|
78
|
+
* `specify_cli-repository`(1)
|
79
|
+
Map a git repository to a host for automatic target resolution.
|
80
|
+
* `specify_cli-viewset`(1)
|
81
|
+
Upload a view to the database.
|
82
|
+
|
83
|
+
## OPTIONS
|
84
|
+
|
85
|
+
* `-D`, `--database` <name>:
|
86
|
+
The name of the Specify database to connect to.
|
87
|
+
* `-H`, `--host` <name>:
|
88
|
+
The name or IP address of the host. Default: `localhost`
|
89
|
+
* `-P`, `--password` <password>:
|
90
|
+
The password for the MySQL/MariaDB user. Leave blank to be prompted.
|
91
|
+
* `-U`, `--specify_user` <name>:
|
92
|
+
The name of the Specify user.
|
93
|
+
* `-c`, `--db_config` <file>:
|
94
|
+
A database configuration file (if other than the default
|
95
|
+
`~/.specify_dbs.rc.yaml`)
|
96
|
+
* `-p`, `--port` <number>:
|
97
|
+
The port for the MySQL/MariaDB host.
|
98
|
+
* `-u`, `--user` <name>:
|
99
|
+
The MySQL/MariaDB user name.
|
100
|
+
|
101
|
+
## EXAMPLES
|
102
|
+
|
103
|
+
Configure a database `Specify` on the host `specify.example.org`:
|
104
|
+
|
105
|
+
$ specify_cli --host=specify.example.org database specify
|
106
|
+
|
107
|
+
Map the current directory to the host `specify.example.org`:
|
108
|
+
|
109
|
+
$ specify_cli --host=specify.example.org repository -c
|
110
|
+
|
111
|
+
Map `~/specify_forms/invertpaleo` to `localhost`:
|
112
|
+
|
113
|
+
$ specify_cli repository ~/specify_forms/invertpaleo
|
114
|
+
|
115
|
+
Create 10 blank stub records in the collection `Triloites` in the database
|
116
|
+
`Specify` on localhost:
|
117
|
+
|
118
|
+
$ specify_cli -D Specify stubs Trilobites 10
|
119
|
+
|
120
|
+
Create 10 stub records for herbarium sheets in the collection `Orchids` in the
|
121
|
+
database `Specify` on localhost, determined to taxon `Orchidaceae`:
|
122
|
+
|
123
|
+
$ specify_cli -D Specify stubs --taxon='Family: Orchidaceae'\n
|
124
|
+
--preptype=Sheet --perpcount=1 Orchids 10
|
125
|
+
|
126
|
+
Upload `invertpaleo.views.xml` to discipline level for collection `Trilobites`
|
127
|
+
in the database `Specify` on localhost:
|
128
|
+
|
129
|
+
$ specify_cli -D Specify viewset -d Trilobites invertpaleo.views.xml
|
130
|
+
|
131
|
+
Upload `invertpaleo.views.xml` auto-resolving target from current Git branch:
|
132
|
+
|
133
|
+
$ specify_cli viewset -b invertpaleo.views.xml
|
134
|
+
|
135
|
+
## LICENSE
|
136
|
+
|
137
|
+
MIT License
|
138
|
+
|
139
|
+
Copyright (c) 2018 Martin Stein
|
140
|
+
|
141
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
142
|
+
of this software and associated documentation files (the "Software"), to deal
|
143
|
+
in the Software without restriction, including without limitation the rights
|
144
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
145
|
+
copies of the Software, and to permit persons to whom the Software is
|
146
|
+
furnished to do so, subject to the following conditions:
|
147
|
+
|
148
|
+
The above copyright notice and this permission notice shall be included in all
|
149
|
+
copies or substantial portions of the Software.
|
150
|
+
|
151
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
152
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
153
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
154
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
155
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
156
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
157
|
+
SOFTWARE.
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
TEST_BRANCH = 'SPSPEC/TestCollection/user/specuser'
|
3
|
+
|
4
|
+
# Tests for the
|
5
|
+
module Specify
|
6
|
+
RSpec.describe BranchParser do
|
7
|
+
|
8
|
+
|
9
|
+
context 'when creating instances from branch names' do
|
10
|
+
let :config do
|
11
|
+
Pathname.new(Dir.pwd).join('spec', 'support', 'db.yml')
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:path) { 'sp_resource' }
|
15
|
+
|
16
|
+
let(:collection_level) { 'SPSPEC/TestCollection/collection' }
|
17
|
+
let(:discipline_level) { 'SPSPEC/TestCollection/discipline' }
|
18
|
+
let(:user_type_level) { 'SPSPEC/TestCollection/Manager' }
|
19
|
+
let(:user_level) { 'SPSPEC/TestCollection/user/specuser' }
|
20
|
+
|
21
|
+
let :config do
|
22
|
+
Pathname.new(Dir.pwd).join('spec', 'support', 'db.yml')
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when collection' do
|
26
|
+
subject { described_class.new path, collection_level, config }
|
27
|
+
|
28
|
+
it do
|
29
|
+
is_expected.to have_attributes host: 'localhost',
|
30
|
+
database: 'SPSPEC',
|
31
|
+
collection: 'Test Collection',
|
32
|
+
level: :collection
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when discipline' do
|
37
|
+
subject { described_class.new path, discipline_level, config }
|
38
|
+
|
39
|
+
it do
|
40
|
+
is_expected.to have_attributes host: 'localhost',
|
41
|
+
database: 'SPSPEC',
|
42
|
+
collection: 'Test Collection',
|
43
|
+
level: :discipline
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when user type' do
|
48
|
+
subject { described_class.new path, user_type_level, config }
|
49
|
+
|
50
|
+
it do
|
51
|
+
is_expected.to have_attributes host: 'localhost',
|
52
|
+
database: 'SPSPEC',
|
53
|
+
collection: 'Test Collection',
|
54
|
+
level: { user_type: :manager }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when user' do
|
59
|
+
subject { described_class.new path, user_level, config }
|
60
|
+
|
61
|
+
it do
|
62
|
+
is_expected.to have_attributes host: 'localhost',
|
63
|
+
database: 'SPSPEC',
|
64
|
+
collection: 'Test Collection',
|
65
|
+
level: { user: 'specuser' }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when fetching the git branch', skip: true do
|
71
|
+
before :all do
|
72
|
+
@origin = `#{GIT_CURRENT_BRANCH}`.chomp
|
73
|
+
break if TEST_BRANCH == @origin
|
74
|
+
set_branch
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'parses a name from the current branch' do
|
78
|
+
expect(described_class.current_branch)
|
79
|
+
.to have_attributes database: 'SPSPEC',
|
80
|
+
collection: 'Test Collection',
|
81
|
+
level: { user: 'specuser' }
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'exits with an error message if the branch name is not parsable' do
|
85
|
+
expect { described_class.new('master') }
|
86
|
+
.to raise_error ArgumentError, BRANCH_ERROR + 'master'
|
87
|
+
end
|
88
|
+
|
89
|
+
after :all do
|
90
|
+
system("git checkout #{@origin}")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Specify
|
4
|
+
module CLI
|
5
|
+
RSpec.describe 'stubs' do
|
6
|
+
let :opts do
|
7
|
+
geo = 'Continent: North America; Country: United States;'\
|
8
|
+
' locality: Springfield'
|
9
|
+
{
|
10
|
+
accession: "2018-AA-001",
|
11
|
+
cataloger: "specuser",
|
12
|
+
dataset: "Test dataset",
|
13
|
+
geography: geo,
|
14
|
+
locality: "Not transcribed",
|
15
|
+
taxon: "Kingdom: Plantae; Division: Tracheophyta",
|
16
|
+
preptype: "Sheet",
|
17
|
+
prepcount: "1",
|
18
|
+
file: nil
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
let :stub_params do
|
23
|
+
{
|
24
|
+
"dataset_name" => "Test dataset",
|
25
|
+
"cataloger" => "specuser",
|
26
|
+
"accession" => "2018-AA-001",
|
27
|
+
"collecting_data" => { "Continent" => "North America",
|
28
|
+
"Country" => "United States",
|
29
|
+
locality: 'Springfield' },
|
30
|
+
"default_locality_name" => "Not transcribed",
|
31
|
+
"determination" => { "Kingdom" => "Plantae",
|
32
|
+
"Division" => "Tracheophyta" },
|
33
|
+
"preparation" => { type: "Sheet", count: "1" }
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '.stub_parameters' do
|
38
|
+
subject { CLI.stub_parameters opts }
|
39
|
+
|
40
|
+
it { is_expected.to eq stub_params }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,269 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
# Tests for the
|
6
|
+
module Specify
|
7
|
+
module Configuration
|
8
|
+
RSpec.describe Config do
|
9
|
+
subject { described_class.new file }
|
10
|
+
|
11
|
+
let(:config) { described_class.empty empty_file }
|
12
|
+
|
13
|
+
let :file do
|
14
|
+
Pathname.new(Dir.pwd).join('spec', 'support', 'db.yml')
|
15
|
+
end
|
16
|
+
|
17
|
+
let :empty_file do
|
18
|
+
Pathname.new(Dir.pwd).join('spec', 'support', 'empty.yml')
|
19
|
+
end
|
20
|
+
|
21
|
+
let :file_dir_names do
|
22
|
+
a_hash_including('sp_resource' => 'localhost')
|
23
|
+
end
|
24
|
+
|
25
|
+
let :file_hosts do
|
26
|
+
db_user = a_hash_including name: 'specmaster',
|
27
|
+
password: 'masterpass'
|
28
|
+
spspec = a_hash_including db_user: db_user,
|
29
|
+
sp_user: 'specuser'
|
30
|
+
databases = a_hash_including 'SPSPEC' => spspec
|
31
|
+
localhost = a_hash_including port: 3306,
|
32
|
+
databases: databases
|
33
|
+
a_hash_including 'localhost' => localhost
|
34
|
+
end
|
35
|
+
|
36
|
+
let :hosts do
|
37
|
+
a_hash_including 'localhost' => a_hash_including(port: 3600)
|
38
|
+
end
|
39
|
+
|
40
|
+
it do
|
41
|
+
is_expected.to have_attributes dir_names: file_dir_names,
|
42
|
+
hosts: file_hosts
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '.empty' do
|
46
|
+
subject { described_class.empty empty_file }
|
47
|
+
|
48
|
+
before { FileUtils.touch default_file }
|
49
|
+
|
50
|
+
let(:default_file) { File.expand_path('~/.specify_dbs.rc.yaml') }
|
51
|
+
|
52
|
+
let :params do
|
53
|
+
a_hash_including dir_names: an_instance_of(Hash).and(be_empty),
|
54
|
+
hosts: an_instance_of(Hash).and(be_empty)
|
55
|
+
end
|
56
|
+
|
57
|
+
it { is_expected.to have_attributes params: params }
|
58
|
+
|
59
|
+
context 'when passed no file but default file exists' do
|
60
|
+
subject(:make_empty) { described_class.empty file }
|
61
|
+
|
62
|
+
it do
|
63
|
+
error = "#{file} exists, won't overwrite"
|
64
|
+
expect { make_empty }.to raise_error error
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when passed the dafault file path and default file exists' do
|
69
|
+
subject(:make_empty) { described_class.empty default_file }
|
70
|
+
|
71
|
+
it do
|
72
|
+
error = "#{default_file} exists, won't overwrite"
|
73
|
+
expect { make_empty }.to raise_error error
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'when given block mapping dir_names' do
|
78
|
+
subject do
|
79
|
+
described_class.empty(empty_file) do |config|
|
80
|
+
config.dir_names['specify_dir'] = 'localhost'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
let :dir_names do
|
85
|
+
a_hash_including 'specify_dir' => 'localhost'
|
86
|
+
end
|
87
|
+
|
88
|
+
it { is_expected.to have_attributes dir_names: dir_names }
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when given block adding hosts' do
|
92
|
+
subject do
|
93
|
+
described_class.empty(empty_file) do |config|
|
94
|
+
config.add_host 'localhost', 3600
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
it do
|
99
|
+
is_expected.to have_attributes hosts: hosts
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when given block adding databases' do
|
104
|
+
subject do
|
105
|
+
described_class.empty(empty_file) do |config|
|
106
|
+
config.add_database 'SPSPEC', host: 'localhost' do |db|
|
107
|
+
db[:db_user][:name] = 'specmaster'
|
108
|
+
db[:db_user][:password] = 'masterpass'
|
109
|
+
db[:sp_user] = 'specuser'
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
let :hosts do
|
115
|
+
db_user = a_hash_including name: 'specmaster',
|
116
|
+
password: 'masterpass'
|
117
|
+
spspec = a_hash_including db_user: db_user,
|
118
|
+
sp_user: 'specuser'
|
119
|
+
databases = a_hash_including 'SPSPEC' => spspec
|
120
|
+
localhost = a_hash_including databases: databases
|
121
|
+
a_hash_including 'localhost' => localhost
|
122
|
+
end
|
123
|
+
|
124
|
+
it { is_expected.to have_attributes hosts: hosts }
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe '#add_host' do
|
129
|
+
subject(:add_host) { config.add_host 'localhost', 3600 }
|
130
|
+
|
131
|
+
context 'when adding a new host' do
|
132
|
+
it do
|
133
|
+
expect { add_host }
|
134
|
+
.to change(config, :hosts).from(be_empty).to hosts
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'when adding an existing host' do
|
139
|
+
before { config.add_host 'localhost' }
|
140
|
+
|
141
|
+
it do
|
142
|
+
expect { add_host }
|
143
|
+
.to raise_error 'Host \'localhost\' already configured'
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe '#add_database' do
|
149
|
+
subject :add_database do
|
150
|
+
config.add_database 'SPSPEC', host: 'localhost' do |db|
|
151
|
+
db[:db_user][:name] = 'specmaster'
|
152
|
+
db[:db_user][:password] = 'masterpass'
|
153
|
+
db[:sp_user] = 'specuser'
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
let :databases do
|
158
|
+
db_user = a_hash_including name: 'specmaster',
|
159
|
+
password: 'masterpass'
|
160
|
+
spspec = a_hash_including db_user: db_user,
|
161
|
+
sp_user: 'specuser'
|
162
|
+
a_hash_including 'SPSPEC' => spspec
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'when the database is not configured for the host' do
|
166
|
+
let :localhost_db do
|
167
|
+
localhost = a_hash_including port: nil,
|
168
|
+
databases: databases
|
169
|
+
a_hash_including 'localhost' => localhost
|
170
|
+
end
|
171
|
+
|
172
|
+
it do
|
173
|
+
expect { add_database }
|
174
|
+
.to change(config, :hosts)
|
175
|
+
.from(be_empty).to(localhost_db)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context 'when the database is already configured for the host' do
|
180
|
+
before { config.add_database 'SPSPEC', host: 'localhost' }
|
181
|
+
|
182
|
+
let(:e) { 'Database \'SPSPEC\' on \'localhost\' already configured' }
|
183
|
+
|
184
|
+
it do
|
185
|
+
expect { add_database }
|
186
|
+
.to raise_error e
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#params' do
|
192
|
+
subject { described_class.new(file).params }
|
193
|
+
|
194
|
+
it do
|
195
|
+
is_expected.to be_a(Hash)
|
196
|
+
.and include(dir_names: file_dir_names,
|
197
|
+
hosts: file_hosts)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe '#save' do
|
202
|
+
subject(:save) { config.save }
|
203
|
+
|
204
|
+
let :dir_names do
|
205
|
+
a_hash_including 'specify_dir' => 'localhost'
|
206
|
+
end
|
207
|
+
|
208
|
+
let :hosts do
|
209
|
+
db_user = a_hash_including name: 'specmaster',
|
210
|
+
password: 'masterpass'
|
211
|
+
spspec = a_hash_including db_user: db_user,
|
212
|
+
sp_user: 'specuser'
|
213
|
+
databases = a_hash_including 'SPSPEC' => spspec
|
214
|
+
localhost = a_hash_including databases: databases,
|
215
|
+
port: 3600
|
216
|
+
a_hash_including 'localhost' => localhost
|
217
|
+
end
|
218
|
+
|
219
|
+
before do
|
220
|
+
config.dir_names['specify_dir'] = 'localhost'
|
221
|
+
config.add_host 'localhost', 3600
|
222
|
+
config.add_database 'SPSPEC', host: 'localhost' do |db|
|
223
|
+
db[:db_user][:name] = 'specmaster'
|
224
|
+
db[:db_user][:password] = 'masterpass'
|
225
|
+
db[:sp_user] = 'specuser'
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
it do
|
230
|
+
expect { save }
|
231
|
+
.to change { Psych.load_file(empty_file) }
|
232
|
+
.to include hosts: hosts, dir_names: dir_names
|
233
|
+
end
|
234
|
+
|
235
|
+
it do
|
236
|
+
expect { save }
|
237
|
+
.to change(config, :saved?).from(be_falsey).to be_truthy
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
describe '#saved?' do
|
242
|
+
subject { config.saved? }
|
243
|
+
|
244
|
+
context 'when the instance has not been modified' do
|
245
|
+
it { is_expected.to be_truthy }
|
246
|
+
end
|
247
|
+
|
248
|
+
context 'when the instance has been modified' do
|
249
|
+
before { config.touch }
|
250
|
+
|
251
|
+
it { is_expected.to be_falsey }
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
describe '#touch' do
|
256
|
+
subject(:touch) { config.touch }
|
257
|
+
|
258
|
+
it do
|
259
|
+
expect { touch }
|
260
|
+
.to change(config, :saved?).from(be_truthy).to be_falsey
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
after do
|
265
|
+
File.delete(empty_file) if File.exist?(empty_file)
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|