ssm_config 1.1.0 → 1.2.1
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.
- checksums.yaml +4 -4
- data/README.md +46 -12
- data/lib/ssm_config/migration_helper.rb +61 -0
- data/lib/ssm_config/ssm_storage/db.rb +2 -2
- data/lib/ssm_config.rb +6 -5
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc2240e68acd1bb76a701e1101dfb2a457e33fdbad0e444a134284746e9fd2fa
|
4
|
+
data.tar.gz: a993b5e09f224a107e44dc5a612bf49fcd6455e604d9a1613d6485f589a6271e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fe7b998ecc23dffdba9c74ecd7c8ac9b3d54f02e8a7efec6d8692e2ef9dbab56b904d320fce5b284c2fa2fb8f5a95a5be81d1fdab99367390bac22500b428d7
|
7
|
+
data.tar.gz: 952104e797a51ad680b80f0f4f5745f5f946583cbca450041d1fbfd58188c9d0bc9bc8f188795ebf068ac62b8549d7f34d621eb27a8a5191b399a139bd5c6e18
|
data/README.md
CHANGED
@@ -31,9 +31,11 @@ To utilize ActiveRecords, create the following model:
|
|
31
31
|
rails generate model SsmConfigRecord file:string:index accessor_keys:string value:string datatype:string
|
32
32
|
```
|
33
33
|
|
34
|
-
The supported datatypes are `[string, integer, boolean, float]`. The field `datatype` should
|
34
|
+
The supported datatypes are `[string, integer, boolean, float]`. The first character entered in the field `datatype` should be the character that corresponds to the first character of the datatype (so one of `[s, i, b, f]`). This field is not case-sensitive.
|
35
35
|
|
36
|
-
|
36
|
+
Booleans should also be one of `[t, f]`, corresponding to `true` and `false`. Similarly, this is not case-sensitive and only the first character of the value entered (given the datatype is a boolean) will be checked.
|
37
|
+
|
38
|
+
An invalid `datatype` or boolean entry will throw an exception.
|
37
39
|
|
38
40
|
When migrating a file to the ActiveRecord, it is important to correctly input the accessor keys. The field `accessor_keys` represents a hashkey corresponding to a value in the hash: for the sequence of keys used to access a value, the corresponding accessor key will be the keys concatentated with a comma delimiter. For example, if `hash[:key1][:key2][:key3] = value`, the corresponding accessor key would be the string `"key1,key2,key3"`. In the case that there is an array, we include the index embraced by brackets. Consider the following hash:
|
39
41
|
|
@@ -51,19 +53,20 @@ The accessor keys for `value1`, `value2`, and `value3` would be `"build,docker,[
|
|
51
53
|
⚠️ **NOTE:** ⚠️ There should be no file name called `cache`, as this will call a method of the `SsmConfig` class. Also, all values read from the table will be strings.
|
52
54
|
## Usage
|
53
55
|
|
54
|
-
|
55
56
|
Given the following rows in `SsmConfigRecord`:
|
56
57
|
|
57
|
-
| file | accessor_keys | value |
|
58
|
-
| :---: | :------------: | :---: |
|
59
|
-
| eft | days_to_enter_bank_account,default | 3 |
|
60
|
-
| eft | days_to_enter_bank_account,company1,[0] | 2 |
|
61
|
-
| eft | days_to_enter_bank_account,company2 |
|
58
|
+
| file | accessor_keys | value | datatype |
|
59
|
+
| :---: | :------------: | :---: | :---: |
|
60
|
+
| eft | days_to_enter_bank_account,default | 3 | 'i' |
|
61
|
+
| eft | days_to_enter_bank_account,company1,[0] | 2 | 'Integer'
|
62
|
+
| eft | days_to_enter_bank_account,company2 | true| 'boolean'
|
62
63
|
|
63
64
|
```ruby
|
64
65
|
SsmConfig.eft
|
65
|
-
=> {"days_to_enter_bank_account"=>{"default"=>3, "company1"=>[2], "company2"=>
|
66
|
+
=> {"days_to_enter_bank_account"=>{"default"=>3, "company1"=>[2], "company2"=>true}}
|
66
67
|
```
|
68
|
+
To reiterate, only the first character of the datatype is processed, and it is not case sensitive.
|
69
|
+
|
67
70
|
`SsmConfig` will always reconstruct the hash using all the rows with the corresponding file name. In the case that no such row exists, `SsmConfig` will look for `config/foo.yml`. For example, given `config/eft.yml`,
|
68
71
|
|
69
72
|
```yml
|
@@ -72,14 +75,45 @@ any:
|
|
72
75
|
default: 3
|
73
76
|
company1:
|
74
77
|
- 2
|
75
|
-
company2:
|
78
|
+
company2: true
|
76
79
|
```
|
77
80
|
```ruby
|
78
81
|
SsmConfig.eft
|
79
|
-
=> {"days_to_enter_bank_account"=>{"default"=>3, "company1"=>[2], "company2"=>
|
82
|
+
=> {"days_to_enter_bank_account"=>{"default"=>3, "company1"=>[2], "company2"=>true}}
|
80
83
|
```
|
81
|
-
|
82
84
|
This search will be exclusive: i.e., if any row exists in the table then the gem will not look in `config`.
|
85
|
+
|
86
|
+
## Migrations
|
87
|
+
|
88
|
+
To migrate a YAML file in the `config` directory into `SsmConfigRecord`, the class `SsmConfig::MigrationHelper` can be used. `MigrationHelper` takes in the file name, and has `up` and `down` methods.
|
89
|
+
|
90
|
+
The `up` method will migrate the file into the table: if any validations are violated, then all rows that were added in the current call will be deleted, returning the table to the initial state. The following is a custom validation for datatype (which can be added in the corresponding model file):
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
class SsmConfigRecord < ApplicationRecord
|
94
|
+
validate :datatype_support
|
95
|
+
|
96
|
+
def datatype_support
|
97
|
+
errors.add(:datatype, "is not a valid datatype (#{datatype})") unless SsmConfig::SsmStorage::Db::VALID_DATATYPES.include? datatype.downcase[0]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
|
103
|
+
The `down` method will remove _all_ rows in the table that match the file name. A sample migration is as follows:
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
class AddFileToSsmconfigrecord < ActiveRecord::Migration[5.2]
|
107
|
+
def up
|
108
|
+
SsmConfig::MigrationHelper.new('file').up
|
109
|
+
end
|
110
|
+
|
111
|
+
def down
|
112
|
+
SsmConfig::MigrationHelper.new('file').down
|
113
|
+
end
|
114
|
+
end
|
115
|
+
```
|
116
|
+
|
83
117
|
## Development
|
84
118
|
|
85
119
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module SsmConfig
|
2
|
+
class MigrationHelper
|
3
|
+
def initialize(file_name)
|
4
|
+
@file_name = file_name
|
5
|
+
@model_name = SsmConfig::SsmStorage::Db::ACTIVE_RECORD_MODEL
|
6
|
+
end
|
7
|
+
|
8
|
+
def up
|
9
|
+
added = []
|
10
|
+
keys_hash = accessor_key_hash(hash) # starting layer is always hash
|
11
|
+
last = nil
|
12
|
+
keys_hash.each do |accessor_key, value|
|
13
|
+
last = accessor_key
|
14
|
+
added.push(@model_name.constantize.create!(:file => @file_name, :accessor_keys => accessor_key, :value => value.to_s, :datatype => determine_class(value)))
|
15
|
+
end
|
16
|
+
rescue ActiveRecord::RecordInvalid => e
|
17
|
+
Rails.logger.error("#{e.message} was raised because of faulty data with accessor_key #{last}")
|
18
|
+
added.each(&:delete)
|
19
|
+
end
|
20
|
+
|
21
|
+
def down
|
22
|
+
@model_name.constantize.where(:file => @file_name).destroy_all
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def accessor_key_recurse(value, curr, res)
|
28
|
+
case value
|
29
|
+
when Hash
|
30
|
+
res.merge!(accessor_key_hash(value, curr))
|
31
|
+
when Array
|
32
|
+
res.merge!(accessor_key_array(value, curr))
|
33
|
+
else
|
34
|
+
res[curr[1..-1]] = value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def accessor_key_hash(hash, curr = '')
|
39
|
+
hash.each_with_object({}) do |(key, value), res|
|
40
|
+
updated_hash = "#{curr},#{key}"
|
41
|
+
accessor_key_recurse(value, updated_hash, res)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def accessor_key_array(arr, curr = '')
|
46
|
+
arr.each_with_object({}).with_index do |(value, res), index|
|
47
|
+
updated_hash = "#{curr},[#{index}]"
|
48
|
+
accessor_key_recurse(value, updated_hash, res)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def determine_class(value)
|
53
|
+
return 'boolean' if (value == false) || (value == true)
|
54
|
+
return value.class
|
55
|
+
end
|
56
|
+
|
57
|
+
def hash
|
58
|
+
SsmConfig::SsmStorage::Yml.new(@file_name).hash
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -3,6 +3,7 @@ module SsmConfig
|
|
3
3
|
class Db
|
4
4
|
TABLE_NAME = 'ssm_config_records'.freeze
|
5
5
|
ACTIVE_RECORD_MODEL = 'SsmConfigRecord'.freeze
|
6
|
+
VALID_DATATYPES = ['s', 'i', 'b', 'f'].freeze
|
6
7
|
def initialize(file_name)
|
7
8
|
@file_name = file_name
|
8
9
|
end
|
@@ -40,8 +41,7 @@ module SsmConfig
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def transform_class(value, type)
|
43
|
-
|
44
|
-
raise SsmConfig::UnsupportedDatatype, 'Not a valid class: must be one of string, integer, boolean, or float' unless possible_types.include? type.to_s.downcase[0]
|
44
|
+
raise SsmConfig::UnsupportedDatatype, 'Not a valid class: must be one of string, integer, boolean, or float' unless VALID_DATATYPES.include? type.to_s.downcase[0]
|
45
45
|
return value.send("to_#{type.to_s.downcase[0]}") unless type[0] == 'b'
|
46
46
|
convert_boolean(value)
|
47
47
|
end
|
data/lib/ssm_config.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require '
|
1
|
+
require 'ssm_config/ssm_storage/db.rb'
|
2
|
+
require 'ssm_config/ssm_storage/yml.rb'
|
3
|
+
require 'ssm_config/ssm_storage/empty.rb'
|
4
|
+
require 'ssm_config/errors.rb'
|
5
|
+
require 'ssm_config/migration_helper.rb'
|
4
6
|
require 'active_support/core_ext/hash/indifferent_access'
|
5
7
|
require 'active_support/time'
|
6
|
-
require './lib/ssm_config/errors.rb'
|
7
8
|
|
8
9
|
module SsmConfig
|
9
|
-
VERSION = '1.1
|
10
|
+
VERSION = '1.2.1'.freeze
|
10
11
|
REFRESH_TIME = (30.minutes).freeze
|
11
12
|
|
12
13
|
class << self
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ssm_config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Santiago Herrera
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-07-
|
11
|
+
date: 2023-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -121,6 +121,7 @@ files:
|
|
121
121
|
- bin/setup
|
122
122
|
- lib/ssm_config.rb
|
123
123
|
- lib/ssm_config/errors.rb
|
124
|
+
- lib/ssm_config/migration_helper.rb
|
124
125
|
- lib/ssm_config/ssm_storage/db.rb
|
125
126
|
- lib/ssm_config/ssm_storage/empty.rb
|
126
127
|
- lib/ssm_config/ssm_storage/yml.rb
|