persey 1.0.0 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 537e1c4cbb2a20bc264cd40a30b2864ce8cd6a3d2a93ed0ebd8ff1f2b5d157cb
4
- data.tar.gz: 448810ac0515c59209ba55bfa2084f3747a632f0c9f3ce5415fffa863584e970
3
+ metadata.gz: 25b98a5bf970d30e825aaef946b99786d99c565fe6d38a1ff1cf9f8d5dd820d5
4
+ data.tar.gz: 07c32c8824ec406863b19f534b0ce1254a4d5278fc73d5f9a43fb2dd6043c58f
5
5
  SHA512:
6
- metadata.gz: bf6627bcd2ed0047aa602fded7b0d4b0cc6bdc651fb554912e0aeaac34275e25c86926312db43b9400ccf82242a70418a7ef2b1b8f820f19bfc6abcb7ae1b083
7
- data.tar.gz: fbeb35a77ac225af6a799e3f972c7e72541de066741adf27d7c421c5818c55c6f43820bb726b5b2fffb5a1ce056dc39c3db8b8e9a250405647e1a26a99fb0499
6
+ metadata.gz: 3f82c680006f731c112c87f7a834aa66aea87be293dff1addd23b091e6bd151eac16931af20a1d338ea7c8acf128c34feba0517425424dc6ba524987b42767c8
7
+ data.tar.gz: edc5d2fdc4591fcbc4f2cb56e8b69ed410b6b435e5b02701abc9555b3e8931b3a9714f7a710ff5ee19f26d3993afe6560f70fbb0e9c00fd35246e7d226d20920
data/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM ruby:2.4.1
1
+ FROM ruby:2.7.1
2
2
 
3
3
  ENV APP_HOME /app
4
4
  WORKDIR $APP_HOME
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Persey [![Build Status](https://travis-ci.org/zzet/persey.svg?branch=master)](https://travis-ci.org/zzet/persey) [![Gem Version](https://badge.fury.io/rb/persey.svg)](http://badge.fury.io/rb/persey) [![Dependency Status](https://gemnasium.com/zzet/persey.svg)](https://gemnasium.com/zzet/persey) [![Code Climate](https://codeclimate.com/github/zzet/persey.svg)](https://codeclimate.com/github/zzet/persey) [![Downloads count](https://img.shields.io/gem/dt/persey.svg)](https://img.shields.io/gem/dt/persey.svg)
1
+ # Persey [![Build Status](https://travis-ci.org/zzet/persey.svg?branch=master)](https://travis-ci.org/zzet/persey) [![Gem Version](https://badge.fury.io/rb/persey.svg)](http://badge.fury.io/rb/persey)[![Code Climate](https://codeclimate.com/github/zzet/persey.svg)](https://codeclimate.com/github/zzet/persey) [![Downloads count](https://img.shields.io/gem/dt/persey.svg)](https://img.shields.io/gem/dt/persey.svg)
2
2
 
3
3
 
4
4
  ## Summary
@@ -67,6 +67,8 @@ my_node_js_config = '/rest/u/apps/node/config.json'
67
67
  my_berkshelf_config = File.join(app_path, 'provisioning', '.berkshelf')
68
68
  # And INI
69
69
  my_ini_config = File.join(app_path, 'provisioning', 'php.ini') # lol
70
+ # And AWS SSM secure string (we assume you're using JSON inside)
71
+ my_ssm_config = '/some/ssm/parameter/path.json'
70
72
 
71
73
  # Persey.init ENV["environment"] do # set current environment
72
74
  Persey.init Rails.env do # set current environment
@@ -78,6 +80,7 @@ Persey.init Rails.env do # set current environment
78
80
  source :json, my_node_js_config, :node_js_namespace
79
81
  source :toml, my_berkshelf_config, :berkshelf_namespace
80
82
  source :ini, my_ini_config, :ini_namespace
83
+ source :ssm, my_ssm_config, :ssm_namespace
81
84
 
82
85
  env :production do
83
86
  site_name 'Example'
@@ -181,6 +184,7 @@ end
181
184
  * JSON
182
185
  * TOML
183
186
  * INI
187
+ * AWS SSM Secure string (json inside)
184
188
 
185
189
  ## Similar
186
190
 
@@ -1,18 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Persey
2
4
  module Adapters
3
5
  class Base
4
6
  class << self
5
- def load(file, env)
7
+ def load(file, env, opts)
6
8
  raise NotImplementedError
7
9
  end
8
10
 
9
11
  def symbolize_keys(hash)
10
- hash.inject({}){|res, (k, v)|
12
+ hash.each_with_object({}) do |(k, v), res|
11
13
  n_k = k.is_a?(String) ? k.to_sym : k
12
14
  n_v = v.is_a?(Hash) ? symbolize_keys(v) : v
13
15
  res[n_k] = n_v
14
16
  res
15
- }
17
+ end
18
+ end
19
+
20
+ def config_exists?(path, _opts)
21
+ File.exist?(path)
16
22
  end
17
23
  end
18
24
  end
@@ -1,16 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'inifile'
2
4
 
3
5
  module Persey
4
6
  module Adapters
5
7
  class Ini < Persey::Adapters::Base
6
8
  class << self
7
- def load(file, env)
8
- begin
9
- raw_hash = IniFile.load(file).to_h
10
- symbolize_keys(raw_hash)
11
- rescue
12
- puts "FATAL: Error while process config from file '#{file}'"
13
- end
9
+ def load(file, _env, opts: {})
10
+ raw_hash = IniFile.load(file).to_h
11
+ symbolize_keys(raw_hash)
12
+ rescue
13
+ puts "FATAL: Error while process config from file '#{file}'"
14
14
  end
15
15
  end
16
16
  end
@@ -1,17 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json/stream'
2
4
 
3
5
  module Persey
4
6
  module Adapters
5
7
  class Json < Persey::Adapters::Base
6
8
  class << self
7
- def load(file, env)
8
- begin
9
- json = File.new(file, 'r')
10
- raw_hash = JSON::Stream::Parser.parse(json)
11
- symbolize_keys(raw_hash)
12
- rescue
13
- puts "FATAL: Error while process config from file '#{file}'"
14
- end
9
+ def load(file, _env, opts: {})
10
+ json = File.new(file, 'r')
11
+ raw_hash = JSON::Stream::Parser.parse(json)
12
+ symbolize_keys(raw_hash)
13
+ rescue
14
+ puts "FATAL: Error while process config from file '#{file}'"
15
15
  end
16
16
  end
17
17
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'aws-sdk-ssm'
5
+
6
+ module Persey
7
+ class MissingEnvVariable < RuntimeError; end
8
+
9
+ module Adapters
10
+ class Ssm < Persey::Adapters::Base
11
+ class << self
12
+ def load(path, _env, opts: {})
13
+ ssm = ssm_client(opts)
14
+ param = ssm.get_parameter(name: path, with_decryption: true).parameter
15
+
16
+ res = begin
17
+ JSON.parse(param.value)
18
+ rescue JSON::ParserError
19
+ param.to_h
20
+ end
21
+
22
+ symbolize_keys(res)
23
+ end
24
+
25
+ def config_exists?(path, opts: {})
26
+ ssm = ssm_client(opts)
27
+ ssm.get_parameter(name: path, with_decryption: true).parameter.nil? == false
28
+ end
29
+
30
+ private
31
+
32
+ def ssm_client(opts)
33
+ opts[:client] || Aws::SSM::Client.new
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,16 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'toml'
2
4
 
3
5
  module Persey
4
6
  module Adapters
5
7
  class Toml < Persey::Adapters::Base
6
8
  class << self
7
- def load(file, env)
8
- begin
9
- raw_hash = TOML.load_file(file)
10
- symbolize_keys(raw_hash)
11
- rescue
12
- puts "FATAL: Error while process config from file '#{file}'"
13
- end
9
+ def load(file, _env, opts: {})
10
+ raw_hash = TOML.load_file(file)
11
+ symbolize_keys(raw_hash)
12
+ rescue
13
+ puts "FATAL: Error while process config from file '#{file}'"
14
14
  end
15
15
  end
16
16
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'yaml'
2
4
  require 'erb'
3
5
 
@@ -7,17 +9,15 @@ module Persey
7
9
  module Adapters
8
10
  class Yaml < Persey::Adapters::Base
9
11
  class << self
10
- def load(file, env)
11
- begin
12
- raw_hash = YAML.load(ERB.new(File.read(file)).result)
13
- symbolize_keys(raw_hash)
14
- rescue KeyError => e
15
- _, line, method = /\(erb\):(\d+):in `(.*)'/.match(e.backtrace[0]).to_a
16
- if method == 'fetch'
17
- raise MissingEnvVariable.new("Check line ##{line} in #{file}")
18
- else
19
- raise e
20
- end
12
+ def load(file, _env, opts: {})
13
+ raw_hash = YAML.load(ERB.new(File.read(file)).result)
14
+ symbolize_keys(raw_hash)
15
+ rescue KeyError => e
16
+ _, line, method = /\(erb\):(\d+):in `(.*)'/.match(e.backtrace[0]).to_a
17
+ if method == 'fetch'
18
+ raise MissingEnvVariable.new("Check line ##{line} in #{file}")
19
+ else
20
+ raise e
21
21
  end
22
22
  end
23
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'configus'
2
4
 
3
5
  module Persey
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Configus::Config
2
4
  def method_missing(meth, *args, &blk)
3
5
  if Persey.config.to_hash.has_key?(meth)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/inflector'
2
4
 
3
5
  module Persey
@@ -11,14 +13,17 @@ module Persey
11
13
  @sources
12
14
  end
13
15
 
14
- def source(source_type, config_file, namespace = nil)
15
- raise MissingConfigFile.new("Can't find #{source_type} config: #{config_file}") unless File.exist?(config_file)
16
-
16
+ def source(source_type, config_file, namespace = nil, opts = {})
17
17
  klass = "persey/adapters/#{source_type}".camelize.constantize
18
- @sources << { class: klass, file: config_file, namespace: namespace }
18
+
19
+ unless klass.config_exists?(config_file, opts: opts)
20
+ raise MissingConfigFile, "Can't find #{source_type} config: #{config_file}"
21
+ end
22
+
23
+ @sources << { class: klass, file: config_file, namespace: namespace, opts: opts }
19
24
 
20
25
  override_config_file = config_file + '.override'
21
- @sources << { class: klass, file: override_config_file, namespace: namespace } if File.exist?(override_config_file)
26
+ @sources << { class: klass, file: override_config_file, namespace: namespace, opts: opts } if klass.config_exists?(override_config_file, opts: opts)
22
27
  end
23
28
 
24
29
  def env(*args)
data/lib/persey/loader.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Persey
2
4
  class Loader
3
5
  attr_accessor :configs
@@ -18,7 +20,7 @@ module Persey
18
20
 
19
21
  configs.each do |pdc|
20
22
  klass = pdc[:class]
21
- raw_config = klass.load(pdc[:file], env)
23
+ raw_config = klass.load(pdc[:file], env, opts: pdc[:opts])
22
24
  env_config = raw_config[env].nil? ? raw_config : raw_config[env]
23
25
 
24
26
  n = pdc[:namespace]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Persey
2
- VERSION = "1.0.0"
4
+ VERSION = '2.0.1'
3
5
  end
data/lib/persey.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'persey/version'
2
4
  require 'persey/builder'
3
5
  require 'persey/inspector'
@@ -7,6 +9,7 @@ require 'persey/adapters/yaml'
7
9
  require 'persey/adapters/json'
8
10
  require 'persey/adapters/toml'
9
11
  require 'persey/adapters/ini'
12
+ require 'persey/adapters/ssm'
10
13
  require 'persey/configus_patch'
11
14
 
12
15
  module Persey
@@ -19,7 +22,7 @@ module Persey
19
22
  end
20
23
 
21
24
  def config
22
- raise RuntimeError, "Please, init config before usage" if @config.nil?
25
+ raise 'Please, init config before usage' if @config.nil?
23
26
 
24
27
  @config
25
28
  end
data/persey.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_runtime_dependency 'json-stream'
24
24
  spec.add_runtime_dependency 'toml', '~> 0.1.0'
25
25
  spec.add_runtime_dependency 'inifile'
26
+ spec.add_runtime_dependency 'aws-sdk-ssm', '~> 1.120'
26
27
 
27
28
  spec.add_development_dependency 'simplecov'
28
29
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Persey do
@@ -8,6 +10,7 @@ describe Persey do
8
10
  plain_json_config = File.join(fixtures_path, 'json_config.json')
9
11
  plain_toml_config = File.join(fixtures_path, 'toml_config.toml')
10
12
  plain_ini_config = File.join(fixtures_path, 'ini_config.ini')
13
+ plain_ssm_config = '/some/ssm/parameter/path.json'
11
14
 
12
15
  Persey.init :production do
13
16
  source :yaml, plain_config
@@ -15,11 +18,12 @@ describe Persey do
15
18
  source :json, plain_json_config, :json_config
16
19
  source :toml, plain_toml_config, :toml_config
17
20
  source :ini, plain_ini_config, :ini_config
21
+ source :ssm, plain_ssm_config, :ssm_config, { client: Aws::SSM::Client.new(stub_responses: true) }
18
22
 
19
23
  env :production do
20
24
  option do
21
- first "first value"
22
- second "second value"
25
+ first 'first value'
26
+ second 'second value'
23
27
  end
24
28
 
25
29
  first do
@@ -44,6 +48,7 @@ describe Persey do
44
48
  expect(@config.json_config.owner.name).to eq('John Doe')
45
49
  expect(@config.toml_config.owner.name).to eq('Tom Preston-Werner')
46
50
  expect(@config.ini_config.section1.var1).to eq('foo')
51
+ expect(@config.ssm_config.value).to eq('PSParameterValue')
47
52
  end
48
53
  end
49
54
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: persey
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Kumanyaev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-29 00:00:00.000000000 Z
11
+ date: 2021-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: aws-sdk-ssm
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.120'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.120'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: simplecov
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +130,7 @@ files:
116
130
  - lib/persey/adapters/base.rb
117
131
  - lib/persey/adapters/ini.rb
118
132
  - lib/persey/adapters/json.rb
133
+ - lib/persey/adapters/ssm.rb
119
134
  - lib/persey/adapters/toml.rb
120
135
  - lib/persey/adapters/yaml.rb
121
136
  - lib/persey/builder.rb
@@ -151,8 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
166
  - !ruby/object:Gem::Version
152
167
  version: '0'
153
168
  requirements: []
154
- rubyforge_project:
155
- rubygems_version: 2.7.3
169
+ rubygems_version: 3.1.2
156
170
  signing_key:
157
171
  specification_version: 4
158
172
  summary: Helps you easily manage environment specific settings