1
0
Fork 0

Compare commits

...

No commits in common. "v0.0.1" and "master" have entirely different histories.

57 changed files with 1461 additions and 170 deletions

59
.github/workflows/ruby.yml vendored Normal file
View File

@ -0,0 +1,59 @@
name: Ruby
on: [push]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up Ruby 2.7
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7
- name: Build and test with Rake
run: |
gem install bundler
bundle install --jobs 4 --retry 3
bundle exec standardrb
test:
runs-on: ubuntu-latest
strategy:
matrix:
ruby_version: [2.4, 2.5, 2.6, 2.7, 3.0, 3.1]
steps:
- uses: actions/checkout@v1
- name: Set up Ruby ${{ matrix.ruby_version }}
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby_version }}
- name: Build and test with Rake
run: |
gem install bundler
bundle install --jobs 4 --retry 3
bundle exec rspec
rails:
runs-on: ubuntu-latest
strategy:
matrix:
ruby_version: [2.7, 3.0, 3.1]
steps:
- uses: actions/checkout@v1
- name: Set up Ruby ${{ matrix.ruby_version }}
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby_version }}
- name: Test gem in Rails application
run: |
cd spec/rails
gem install bundler
bundle install --jobs 4 --retry 3
bundle exec rails test
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: us-east-2
PARAMETER_STORE_PATH: /psenv/test/

2
.gitignore vendored
View File

@ -9,3 +9,5 @@
# rspec failure tracking
.rspec_status
Gemfile.lock

View File

@ -1,5 +0,0 @@
sudo: false
language: ruby
rvm:
- 2.4.2
before_install: gem install bundler -v 1.16.1

View File

@ -1,8 +1,7 @@
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
# Specify your gem's dependencies in parameter_store_loader.gemspec
gemspec name: "psenv"
gemspec name: "psenv-rails"

View File

@ -1,100 +0,0 @@
PATH
remote: .
specs:
psenv (0.0.1)
aws-sdk-ssm (~> 1)
psenv-rails (0.0.1)
psenv (= 0.0.1)
railties (>= 3.2, < 5.2)
GEM
remote: https://rubygems.org/
specs:
actionpack (5.1.5)
actionview (= 5.1.5)
activesupport (= 5.1.5)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.1.5)
activesupport (= 5.1.5)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activesupport (5.1.5)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (~> 0.7)
minitest (~> 5.1)
tzinfo (~> 1.1)
aws-partitions (1.71.0)
aws-sdk-core (3.17.1)
aws-partitions (~> 1.0)
aws-sigv4 (~> 1.0)
jmespath (~> 1.0)
aws-sdk-ssm (1.8.0)
aws-sdk-core (~> 3)
aws-sigv4 (~> 1.0)
aws-sigv4 (1.0.2)
builder (3.2.3)
concurrent-ruby (1.0.5)
crass (1.0.3)
diff-lcs (1.3)
erubi (1.7.1)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
jmespath (1.3.1)
loofah (2.2.2)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
method_source (0.9.0)
mini_portile2 (2.3.0)
minitest (5.11.3)
nokogiri (1.8.2)
mini_portile2 (~> 2.3.0)
rack (2.0.4)
rack-test (0.8.3)
rack (>= 1.0, < 3)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.0.4)
loofah (~> 2.2, >= 2.2.2)
railties (5.1.5)
actionpack (= 5.1.5)
activesupport (= 5.1.5)
method_source
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (10.5.0)
rspec (3.7.0)
rspec-core (~> 3.7.0)
rspec-expectations (~> 3.7.0)
rspec-mocks (~> 3.7.0)
rspec-core (3.7.1)
rspec-support (~> 3.7.0)
rspec-expectations (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.7.0)
rspec-mocks (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.7.0)
rspec-support (3.7.1)
thor (0.20.0)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)
PLATFORMS
ruby
DEPENDENCIES
bundler (~> 1.16)
psenv!
psenv-rails!
rake (~> 10.0)
rspec (~> 3.0)
BUNDLED WITH
1.16.1

View File

@ -1,10 +1,8 @@
# Psenv
**Work in progress**
Shim to load environment variables from [AWS Systems Manager Parameter Store](https://aws.amazon.com/systems-manager/features/#Parameter_Store) into ENV.
Psenv currently heavily borrows from [Dotenv](https://github.com/bkeepers/dotenv), mainly because I use it in roughly every project so it made since for the APIs to match.
Psenv currently heavily borrows from [Dotenv](https://github.com/bkeepers/dotenv), mainly because I use it in roughly every project so it made sense for the APIs to match.
## Installation
@ -23,6 +21,26 @@ And then execute:
Set the `PARAMETER_STORE_PATH` environment variable with the AWS Parameter
Store path that you wish to load.
#### Spring preloader
The Spring preloader does not detect environment variable changes as
application changes. This means that when using Spring, new or changed
environment variables from AWS SSM Parameter Store will not become available
immediately. This also applies to any change to `PARAMETER_STORE_PATH`.
There are two work-arounds. You can force Spring to restart by killing it with
`bundle exec spring stop`.
Alternatively, you can update your Spring configuration to reload variables
using Psenv after the process forks. To do this, add the following configuration
to `config/spring.rb`:
```
Spring.after_fork do
Psenv.load
end
```
### Plain Ruby
Add this line to your application's Gemfile:

View File

@ -1,17 +1,20 @@
require "bundler/gem_helper"
require "rspec/core/rake_task"
require "rubocop/rake_task"
class ParameterStoreEnvRailsGemHelper < Bundler::GemHelper
def guard_already_tagged
end
def tag_version
end
end
namespace "psenv" do
Bundler::GemHelper.install_tasks name: "psenv"
end
namespace "psenv-rails" do
class ParameterStoreEnvRailsGemHelper < Bundler::GemHelper
def guard_already_tagged; end # noop
def tag_version; end # noop
end
ParameterStoreEnvRailsGemHelper.install_tasks name: "psenv-rails"
end
@ -20,5 +23,6 @@ task install: ["psenv:install", "psenv-rails:install"]
task release: ["psenv:release", "psenv-rails:release"]
RSpec::Core::RakeTask.new(:spec)
RuboCop::RakeTask.new(:rubocop)
task :default => :spec
task default: %i[rubocop spec]

View File

@ -6,15 +6,15 @@ if defined?(Rake.application)
end
module Psenv
class Railtie < Rails::Railtie
def load
Psenv.load
end
class Railtie < Rails::Railtie
def load
Psenv.load
end
def self.load
instance.load
end
def self.load
instance.load
end
config.before_configuration { load }
end
end
end

View File

@ -1,3 +1,5 @@
require "psenv/environment"
require "psenv/retriever"
require "psenv/version"
require "aws-sdk-ssm"
@ -5,19 +7,17 @@ require "aws-sdk-ssm"
module Psenv
module_function
def load
if ENV["PARAMETER_STORE_PATH"] != nil
ssm = Aws::SSM::Client.new
def load(*paths)
paths.unshift(ENV["PARAMETER_STORE_PATH"]) if ENV["PARAMETER_STORE_PATH"]
Environment.new(*paths.map { |path| retrieve_variables(path) }).apply
end
ssm.
get_parameters_by_path(
path: ENV["PARAMETER_STORE_PATH"],
with_decryption: true,
).
parameters.
each do |param|
ENV.store(param.name.split("/").last, param.value)
end
end
def overload(*paths)
paths.unshift(ENV["PARAMETER_STORE_PATH"]) if ENV["PARAMETER_STORE_PATH"]
Environment.new(*paths.map { |path| retrieve_variables(path) }).apply!
end
def retrieve_variables(path)
Retriever.new(path).call
end
end

17
lib/psenv/environment.rb Normal file
View File

@ -0,0 +1,17 @@
module Psenv
class Environment
def initialize(*variables)
@variables = variables.reverse.reduce({}, :merge)
end
def apply
@variables.each do |k, v|
ENV.store(k.to_s, v) unless ENV.key?(k.to_s)
end
end
def apply!
@variables.each { |k, v| ENV.store(k.to_s, v) }
end
end
end

54
lib/psenv/retriever.rb Normal file
View File

@ -0,0 +1,54 @@
require "aws-sdk-ssm"
module Psenv
class RetrieveError < StandardError; end
class Parameter
attr_reader :name, :value
def initialize(parameter)
@name = parameter[:name].split("/").last
@value = parameter[:value]
@type = parameter[:type]
@version = parameter[:version]
end
end
class Retriever
def initialize(path)
@path = path
end
def call
parameters
.map { |parameter| Parameter.new(parameter) }
.map { |parameter| [parameter.name, parameter.value] }
.to_h
end
def self.call(path)
new(path).call
end
private
def ssm
@ssm ||= Aws::SSM::Client.new
end
def parameters
parameters = []
response = ssm.get_parameters_by_path(path: @path, with_decryption: true)
parameters << response.parameters
while response.next_page?
response = response.next_page
parameters << response.parameters
end
parameters.flatten
rescue => error
raise RetrieveError, error
end
end
end

View File

@ -1,3 +1,3 @@
module Psenv
VERSION = "0.0.1"
VERSION = "0.9.1".freeze
end

View File

@ -1,27 +1,26 @@
lib = File.expand_path("../lib", __FILE__)
lib = File.expand_path("lib", __dir__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "psenv/version"
Gem::Specification.new do |spec|
spec.name = "psenv-rails"
spec.version = Psenv::VERSION
spec.authors = ["Andrew Tomaka"]
spec.email = ["atomaka@gmail.com"]
spec.name = "psenv-rails"
spec.version = Psenv::VERSION
spec.authors = ["Andrew Tomaka"]
spec.email = ["atomaka@gmail.com"]
spec.summary = %q{Load AWS SSM Parameter Store values into your Rails environment.}
spec.homepage = "https://github.com/atomaka/psenv"
spec.license = "MIT"
spec.summary = "Load AWS SSM Parameter Store values into your Rails environment."
spec.homepage = "https://github.com/atomaka/psenv"
spec.license = "MIT"
spec.files = `git ls-files lib | grep rails`.
split($OUTPUT_RECORD_SEPARATOR).
reject do |f|
spec.files = `git ls-files lib | grep rails`
.split($OUTPUT_RECORD_SEPARATOR)
.reject do |f|
f.match(%r{^(test|spec|features)/})
end + ["README.md", "LICENSE.txt"]
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
spec.add_dependency "psenv", Psenv::VERSION
spec.add_dependency "railties", ">= 3.2", "< 5.2"
spec.add_dependency "railties", ">= 3.2", "< 7.1"
end

View File

@ -1,28 +1,29 @@
lib = File.expand_path("../lib", __FILE__)
lib = File.expand_path("lib", __dir__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "psenv/version"
Gem::Specification.new do |spec|
spec.name = "psenv"
spec.version = Psenv::VERSION
spec.authors = ["Andrew Tomaka"]
spec.email = ["atomaka@gmail.com"]
spec.name = "psenv"
spec.version = Psenv::VERSION
spec.authors = ["Andrew Tomaka"]
spec.email = ["atomaka@gmail.com"]
spec.summary = %q{Load AWS SSM Parameter Store values into your environment.}
spec.homepage = "https://github.com/atomaka/psenv"
spec.license = "MIT"
spec.summary = "Load AWS SSM Parameter Store values into your environment."
spec.homepage = "https://github.com/atomaka/psenv"
spec.license = "MIT"
spec.files = `git ls-files -z`.split("\x0").reject do |f|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
f.match(%r{^(test|spec|features)/})
end
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.16"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency "rspec", "~> 3.0"
spec.add_development_dependency "pry"
spec.add_development_dependency "rake", ">= 12.3.3"
spec.add_development_dependency "rspec", "~> 3"
spec.add_development_dependency "standard"
spec.add_development_dependency "webmock", "~> 3.3"
spec.add_dependency "aws-sdk-ssm", "~> 1"
end

54
spec/environment_spec.rb Normal file
View File

@ -0,0 +1,54 @@
require "spec_helper"
RSpec.describe Psenv::Environment do
let(:environment1) { {A: "1", B: "1"} }
let(:environment2) { {B: "2", C: "2"} }
context ".new" do
subject { Psenv::Environment.new(environment1, environment2) }
it "returns an environment object" do
expect(subject).to be_kind_of(Psenv::Environment)
end
end
context "#apply" do
before(:each) do
ENV.store("A", "0")
environment = Psenv::Environment.new(environment1, environment2)
environment.apply
end
it "does not overwrite existing environment" do
expect(ENV["A"]).to eq("0")
end
it "applies unique variables as expected" do
expect(ENV["C"]).to eq("2")
end
it "applies duplicates based on the first provided" do
expect(ENV["B"]).to eq("1")
end
end
context "#apply!" do
before(:each) do
ENV.store("A", "0")
environment = Psenv::Environment.new(environment1, environment2)
environment.apply!
end
it "does overwrite existing environment" do
expect(ENV["A"]).to eq("1")
end
it "applies unique variables as expected" do
expect(ENV["C"]).to eq("2")
end
it "applies duplicates based on the first provided" do
expect(ENV["B"]).to eq("1")
end
end
end

24
spec/psenv_rails_spec.rb Normal file
View File

@ -0,0 +1,24 @@
require "spec_helper"
require "rails"
require "psenv-rails"
RSpec.describe Psenv::Railtie do
before(:each) do
Rails.env = "test"
Rails.application = double(:application)
end
context "before_configuration" do
it "calls #load" do
expect(Psenv::Railtie.instance).to receive(:load)
ActiveSupport.run_load_hooks(:before_configuration)
end
end
context ".load" do
it "calls Psenv.load" do
expect(Psenv).to receive(:load)
Psenv::Railtie.load
end
end
end

View File

@ -1,7 +1,114 @@
require "spec_helper"
RSpec.describe Psenv do
let(:env_path) { "/env/" }
let(:arg_paths) { ["/arg1/", "/arg2"] }
let(:env_variables) { {TEST: "env", ANOTHER: "env"} }
let(:arg_variables) do
[{ONE: "arg1", TWO: "arg1"}, {TWO: "arg2", THREE: "arg2"}]
end
let(:retriever1) { double(:retriever) }
let(:retriever2) { double(:retriever) }
let(:retriever3) { double(:retriever) }
let(:environment) { double(:environment) }
before(:each) do
allow(Psenv::Retriever).to receive(:new).with(env_path) { retriever1 }
allow(Psenv::Retriever).to receive(:new).with(arg_paths[0]) { retriever2 }
allow(Psenv::Retriever).to receive(:new).with(arg_paths[1]) { retriever3 }
allow(retriever1).to receive(:call) { env_variables }
allow(retriever2).to receive(:call) { arg_variables[0] }
allow(retriever3).to receive(:call) { arg_variables[1] }
allow(Psenv::Environment).to receive(:new) { environment }
allow(environment).to receive(:apply)
allow(environment).to receive(:apply!)
ENV.store("PARAMETER_STORE_PATH", nil)
end
it "has a version number" do
expect(Psenv::VERSION).not_to be nil
end
it "tests something useful"
context ".load" do
context "when PARAMETER_STORE_PATH is set" do
before(:each) do
ENV.store("PARAMETER_STORE_PATH", env_path)
Psenv.load
end
it "retrieves the correct path" do
expect(Psenv::Retriever).to have_received(:new).with(env_path)
end
it "creates the environment with the correct variables" do
expect(Psenv::Environment)
.to have_received(:new).with(env_variables)
end
it "applies the environment" do
expect(environment).to have_received(:apply)
end
end
context "when paths are passed in" do
before(:each) { Psenv.load(*arg_paths) }
it "retrieves the correct paths" do
arg_paths.each do |path|
expect(Psenv::Retriever).to have_received(:new).with(path)
end
end
it "creates the environment with the correct variables" do
expect(Psenv::Environment)
.to have_received(:new).with(*arg_variables)
end
it "apples the environment" do
expect(environment).to have_received(:apply)
end
end
end
context ".overload" do
context "when PARAMETER_STORE_PATH is set" do
before(:each) do
ENV.store("PARAMETER_STORE_PATH", env_path)
Psenv.overload
end
it "retrieves the correct path" do
expect(Psenv::Retriever).to have_received(:new).with(env_path)
end
it "creates the environment with the correct variables" do
expect(Psenv::Environment)
.to have_received(:new).with(env_variables)
end
it "applies the environment" do
expect(environment).to have_received(:apply!)
end
end
context "when paths are passed in" do
before(:each) { Psenv.overload(*arg_paths) }
it "retrieves the correct paths" do
arg_paths.each do |path|
expect(Psenv::Retriever).to have_received(:new).with(path)
end
end
it "creates the environment with the correct variables" do
expect(Psenv::Environment)
.to have_received(:new).with(*arg_variables)
end
it "apples the environment" do
expect(environment).to have_received(:apply!)
end
end
end
end

73
spec/rails/.gitignore vendored Normal file
View File

@ -0,0 +1,73 @@
# Created by https://www.gitignore.io/api/rails
# Edit at https://www.gitignore.io/?templates=rails
### Rails ###
*.rbc
capybara-*.html
.rspec
/db/*.sqlite3
/db/*.sqlite3-journal
/public/system
/coverage/
/spec/tmp
*.orig
rerun.txt
pickle-email-*.html
# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep
# TODO Comment out this rule if you are OK with secrets being uploaded to the repo
config/initializers/secret_token.rb
config/master.key
# Only include if you have production secrets in this file, which is no longer a Rails default
# config/secrets.yml
# dotenv
# TODO Comment out this rule if environment variables can be committed
.env
## Environment normalization:
/.bundle
/vendor/bundle
# these should all be checked in to normalize the environment:
# Gemfile.lock, .ruby-version, .ruby-gemset
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc
# if using bower-rails ignore default bower_components path bower.json files
/vendor/assets/bower_components
*.bowerrc
bower.json
# Ignore pow environment settings
.powenv
# Ignore Byebug command history file.
.byebug_history
# Ignore node_modules
node_modules/
# Ignore precompiled javascript packs
/public/packs
/public/packs-test
/public/assets
# Ignore yarn files
/yarn-error.log
yarn-debug.log*
.yarn-integrity
# Ignore uploaded files in development
/storage/*
!/storage/.keep
# End of https://www.gitignore.io/api/rails

1
spec/rails/.ruby-version Normal file
View File

@ -0,0 +1 @@
3.1.2

26
spec/rails/Gemfile Normal file
View File

@ -0,0 +1,26 @@
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem "rails", "~> 7.0.0"
# Use Puma as the app server
gem "puma", "~> 5.0"
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
# gem 'jbuilder', '~> 2.7'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Reduces boot times through caching; required in config/boot.rb
gem "bootsnap", require: false
# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
# gem 'rack-cors'
gem "psenv-rails", path: "../../"
group :development, :test do
gem "debug", platforms: %i[mri mingw x64_mingw]
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby]

186
spec/rails/Gemfile.lock Normal file
View File

@ -0,0 +1,186 @@
PATH
remote: ../..
specs:
psenv (0.9.0)
aws-sdk-ssm (~> 1)
psenv-rails (0.9.0)
psenv (= 0.9.0)
railties (>= 3.2, < 7.1)
GEM
remote: https://rubygems.org/
specs:
actioncable (7.0.4)
actionpack (= 7.0.4)
activesupport (= 7.0.4)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (7.0.4)
actionpack (= 7.0.4)
activejob (= 7.0.4)
activerecord (= 7.0.4)
activestorage (= 7.0.4)
activesupport (= 7.0.4)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.0.4)
actionpack (= 7.0.4)
actionview (= 7.0.4)
activejob (= 7.0.4)
activesupport (= 7.0.4)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.0)
actionpack (7.0.4)
actionview (= 7.0.4)
activesupport (= 7.0.4)
rack (~> 2.0, >= 2.2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (7.0.4)
actionpack (= 7.0.4)
activerecord (= 7.0.4)
activestorage (= 7.0.4)
activesupport (= 7.0.4)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.0.4)
activesupport (= 7.0.4)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
activejob (7.0.4)
activesupport (= 7.0.4)
globalid (>= 0.3.6)
activemodel (7.0.4)
activesupport (= 7.0.4)
activerecord (7.0.4)
activemodel (= 7.0.4)
activesupport (= 7.0.4)
activestorage (7.0.4)
actionpack (= 7.0.4)
activejob (= 7.0.4)
activerecord (= 7.0.4)
activesupport (= 7.0.4)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
activesupport (7.0.4)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
aws-eventstream (1.2.0)
aws-partitions (1.642.0)
aws-sdk-core (3.158.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1, >= 1.6.1)
aws-sdk-ssm (1.141.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sigv4 (~> 1.1)
aws-sigv4 (1.5.2)
aws-eventstream (~> 1, >= 1.0.2)
bootsnap (1.13.0)
msgpack (~> 1.2)
builder (3.2.4)
concurrent-ruby (1.1.10)
crass (1.0.6)
debug (1.6.2)
irb (>= 1.3.6)
reline (>= 0.3.1)
erubi (1.11.0)
globalid (1.0.0)
activesupport (>= 5.0)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
io-console (0.5.11)
irb (1.4.1)
reline (>= 0.3.0)
jmespath (1.6.1)
loofah (2.19.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.1)
mini_mime (>= 0.1.1)
marcel (1.0.2)
method_source (1.0.0)
mini_mime (1.1.2)
mini_portile2 (2.8.0)
minitest (5.16.3)
msgpack (1.6.0)
net-imap (0.3.1)
net-protocol
net-pop (0.1.2)
net-protocol
net-protocol (0.1.3)
timeout
net-smtp (0.3.2)
net-protocol
nio4r (2.5.8)
nokogiri (1.13.8)
mini_portile2 (~> 2.8.0)
racc (~> 1.4)
puma (5.6.5)
nio4r (~> 2.0)
racc (1.6.0)
rack (2.2.4)
rack-test (2.0.2)
rack (>= 1.3)
rails (7.0.4)
actioncable (= 7.0.4)
actionmailbox (= 7.0.4)
actionmailer (= 7.0.4)
actionpack (= 7.0.4)
actiontext (= 7.0.4)
actionview (= 7.0.4)
activejob (= 7.0.4)
activemodel (= 7.0.4)
activerecord (= 7.0.4)
activestorage (= 7.0.4)
activesupport (= 7.0.4)
bundler (>= 1.15.0)
railties (= 7.0.4)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.4.3)
loofah (~> 2.3)
railties (7.0.4)
actionpack (= 7.0.4)
activesupport (= 7.0.4)
method_source
rake (>= 12.2)
thor (~> 1.0)
zeitwerk (~> 2.5)
rake (13.0.6)
reline (0.3.1)
io-console (~> 0.5)
thor (1.2.1)
timeout (0.3.0)
tzinfo (2.0.5)
concurrent-ruby (~> 1.0)
websocket-driver (0.7.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
zeitwerk (2.6.1)
PLATFORMS
ruby
DEPENDENCIES
bootsnap
debug
psenv-rails!
puma (~> 5.0)
rails (~> 7.0.0)
tzinfo-data
BUNDLED WITH
2.3.22

27
spec/rails/README.md Normal file
View File

@ -0,0 +1,27 @@
# psenv-test
Used for testing the psenv-rails gem to validate.
## Usage
* Generate new parameter store variable in AWS
* `/psenv/test/API_KEY` with value "api_key_value"
* `PARAMETER_STORE_PATH=/psenv/test bundle exec rails test`
## New Versions
To test new versions of the gem, you can install the psenv-rails gem locally and
reference it:
1. Clone psenv and complete work
1. Likely updating Railtie requirements
1. Update psenv lib/psenv/version.rb
1. Example version name: `0.5.16-local`
1. Run `bundle exec rake install` in psenv directory
1. Note new gem version installed locally
1. Example gem version: `0.5.16.pre.local`
1. Open psenv-test project
1. Update Gemfile with test version
1. `gem 'psenv-rails', '0.5.16.pre.local'`
1. `bundle install`
1. `PARAMETER_STORE_PATH=/psenv/test bundle exec rails test`

6
spec/rails/Rakefile Normal file
View File

@ -0,0 +1,6 @@
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require_relative "config/application"
Rails.application.load_tasks

View File

@ -0,0 +1,5 @@
class EnvironmentTester
def self.call
ENV.fetch("API_KEY", "")
end
end

103
spec/rails/bin/bundle Executable file
View File

@ -0,0 +1,103 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
#
# This file was generated by Bundler.
#
# The application 'bundle' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require "rubygems"
m = Module.new {
module_function
def invoked_as_script?
File.expand_path($0) == File.expand_path(__FILE__)
end
def env_var_version
ENV["BUNDLER_VERSION"]
end
def cli_arg_version
return unless invoked_as_script? # don't want to hijack other binstubs
return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
bundler_version = nil
update_index = nil
ARGV.each_with_index do |a, i|
if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
bundler_version = a
end
next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/o
bundler_version = $1 || ">= 0.a"
update_index = i
end
bundler_version
end
def gemfile
gemfile = ENV["BUNDLE_GEMFILE"]
return gemfile if gemfile && !gemfile.empty?
File.expand_path("../../Gemfile", __FILE__)
end
def lockfile
lockfile =
case File.basename(gemfile)
when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
else "#{gemfile}.lock"
end
File.expand_path(lockfile)
end
def lockfile_version
return unless File.file?(lockfile)
lockfile_contents = File.read(lockfile)
return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/o
Regexp.last_match(1)
end
def bundler_version
@bundler_version ||= env_var_version || cli_arg_version ||
lockfile_version || "#{Gem::Requirement.default}.a"
end
def load_bundler!
ENV["BUNDLE_GEMFILE"] ||= gemfile
# must dup string for RG < 1.8 compatibility
activate_bundler(bundler_version.dup)
end
def activate_bundler(bundler_version)
if Gem::Version.correct?(bundler_version) && Gem::Version.new(bundler_version).release < Gem::Version.new("2.0")
bundler_version = "< 2"
end
gem_error = activation_error_handling {
gem "bundler", bundler_version
}
return if gem_error.nil?
require_error = activation_error_handling {
require "bundler/version"
}
return if require_error.nil? && Gem::Requirement.new(bundler_version).satisfied_by?(Gem::Version.new(Bundler::VERSION))
warn "Activating bundler (#{bundler_version}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_version}'`"
exit 42
end
def activation_error_handling
yield
nil
rescue StandardError, LoadError => e
e
end
}
m.load_bundler!
if m.invoked_as_script?
load Gem.bin_path("bundler", "bundle")
end

4
spec/rails/bin/rails Executable file
View File

@ -0,0 +1,4 @@
#!/usr/bin/env ruby
APP_PATH = File.expand_path("../config/application", __dir__)
require_relative "../config/boot"
require "rails/commands"

4
spec/rails/bin/rake Executable file
View File

@ -0,0 +1,4 @@
#!/usr/bin/env ruby
require_relative "../config/boot"
require "rake"
Rake.application.run

25
spec/rails/bin/setup Executable file
View File

@ -0,0 +1,25 @@
#!/usr/bin/env ruby
require "fileutils"
# path to your application root.
APP_ROOT = File.expand_path("..", __dir__)
def system!(*args)
system(*args) || abort("\n== Command #{args} failed ==")
end
FileUtils.chdir APP_ROOT do
# This script is a way to set up or update your development environment automatically.
# This script is idempotent, so that you can run it at any time and get an expectable outcome.
# Add necessary setup steps to this file.
puts "== Installing dependencies =="
system! "gem install bundler --conservative"
system("bundle check") || system!("bundle install")
puts "\n== Removing old logs and tempfiles =="
system! "bin/rails log:clear tmp:clear"
puts "\n== Restarting application server =="
system! "bin/rails restart"
end

6
spec/rails/config.ru Normal file
View File

@ -0,0 +1,6 @@
# This file is used by Rack-based servers to start the application.
require_relative "config/environment"
run Rails.application
Rails.application.load_server

View File

@ -0,0 +1,40 @@
require_relative "boot"
require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
# require "active_record/railtie"
# require "active_storage/engine"
require "action_controller/railtie"
# require "action_mailer/railtie"
# require "action_mailbox/engine"
# require "action_text/engine"
require "action_view/railtie"
# require "action_cable/engine"
# require "sprockets/railtie"
require "rails/test_unit/railtie"
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
module PsenvTest
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 6.0
# Configuration for the application, engines, and railties goes here.
#
# These settings can be overridden in specific environments using the files
# in config/environments, which are processed later.
#
# config.time_zone = "Central Time (US & Canada)"
# config.eager_load_paths << Rails.root.join("extras")
# Only loads a smaller set of middleware suitable for API only apps.
# Middleware like session, flash, cookies can be added back manually.
# Skip views, helpers and assets when generating a new resource.
config.api_only = true
end
end

View File

@ -0,0 +1,4 @@
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
require "bundler/setup" # Set up gems listed in the Gemfile.
require "bootsnap/setup" # Speed up boot time by caching expensive operations.

View File

@ -0,0 +1 @@
CCG/EQd33VifoFkRZcFpOp/puREeD3Yt0bh71aB6ab5LVHvctul0xKbeLAN1pyGi5Kk10V1+KBEGFRbpmK9mc923IlzFW3VVRap7D+Ek2cJNM6jA7olaMkLjRcYcsPQw6Hi+786z9jcTsk1UxY6haOr4r/uPklz6jcYl88nS4UnWu/83nWvOBjpSGv2uvz5OJE4wqggFaTe8i93VOvANDE0OMrXrdHcH8h1GPgXm5EGOvArKCnsY4FDrxyyaK9Sx9pRUteh1Xz1FZWLeav5pwMkZw00c7JFWjy2HxNBtdvIP6m0GfssetpyekFIcj9zOcxOCXXzaEhuoT+QY8kOAr5rgEW+f6l9lcKevRcC2UhTNd0FnhUku9mPuq03qyM8pvxlzjL7vs6/OG+raYSoApHomf35c+Sq6BxtC--rzZBIPCfBwWkW2ZH--xSV/WdQx1za3nDCsx0NKhg==

View File

@ -0,0 +1,5 @@
# Load the Rails application.
require_relative "application"
# Initialize the Rails application.
Rails.application.initialize!

View File

@ -0,0 +1,51 @@
require "active_support/core_ext/integer/time"
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# In the development environment your application's code is reloaded any time
# it changes. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
# Do not eager load code on boot.
config.eager_load = false
# Show full error reports.
config.consider_all_requests_local = true
# Enable/disable caching. By default caching is disabled.
# Run rails dev:cache to toggle caching.
if Rails.root.join("tmp", "caching-dev.txt").exist?
config.cache_store = :memory_store
config.public_file_server.headers = {
"Cache-Control" => "public, max-age=#{2.days.to_i}"
}
else
config.action_controller.perform_caching = false
config.cache_store = :null_store
end
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
# Raise exceptions for disallowed deprecations.
config.active_support.disallowed_deprecation = :raise
# Tell Active Support which deprecation messages to disallow.
config.active_support.disallowed_deprecation_warnings = []
# Raises error for missing translations.
# config.i18n.raise_on_missing_translations = true
# Annotate rendered view with file names.
# config.action_view.annotate_rendered_view_with_filenames = true
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
# Uncomment if you wish to allow Action Cable access from any origin.
# config.action_cable.disable_request_forgery_protection = true
end

View File

@ -0,0 +1,96 @@
require "active_support/core_ext/integer/time"
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# Code is not reloaded between requests.
config.cache_classes = true
# Eager load code on boot. This eager loads most of Rails and
# your application in memory, allowing both threaded web servers
# and those relying on copy on write to perform better.
# Rake tasks automatically ignore this option for performance.
config.eager_load = true
# Full error reports are disabled and caching is turned on.
config.consider_all_requests_local = false
# Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
# or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
# config.require_master_key = true
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
# config.asset_host = 'http://assets.example.com'
# Specifies the header that your server uses for sending files.
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
# config.force_ssl = true
# Include generic and useful information about system operation, but avoid logging too much
# information to avoid inadvertent exposure of personally identifiable information (PII).
config.log_level = :info
# Prepend all log lines with the following tags.
config.log_tags = [:request_id]
# Use a different cache store in production.
# config.cache_store = :mem_cache_store
# Use a real queuing backend for Active Job (and separate queues per environment).
# config.active_job.queue_adapter = :resque
# config.active_job.queue_name_prefix = "psenv_test_production"
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation cannot be found).
config.i18n.fallbacks = true
# Send deprecation notices to registered listeners.
config.active_support.deprecation = :notify
# Log disallowed deprecations.
config.active_support.disallowed_deprecation = :log
# Tell Active Support which deprecation messages to disallow.
config.active_support.disallowed_deprecation_warnings = []
# Use default logging formatter so that PID and timestamp are not suppressed.
config.log_formatter = ::Logger::Formatter.new
# Use a different logger for distributed setups.
# require "syslog/logger"
# config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
if ENV["RAILS_LOG_TO_STDOUT"].present?
logger = ActiveSupport::Logger.new($stdout)
logger.formatter = config.log_formatter
config.logger = ActiveSupport::TaggedLogging.new(logger)
end
# Inserts middleware to perform automatic connection switching.
# The `database_selector` hash is used to pass options to the DatabaseSelector
# middleware. The `delay` is used to determine how long to wait after a write
# to send a subsequent read to the primary.
#
# The `database_resolver` class is used by the middleware to determine which
# database is appropriate to use based on the time delay.
#
# The `database_resolver_context` class is used by the middleware to set
# timestamps for the last write to the primary. The resolver uses the context
# class timestamps to determine how long to wait before reading from the
# replica.
#
# By default Rails will store a last write timestamp in the session. The
# DatabaseSelector middleware is designed as such you can define your own
# strategy for connection switching and pass that into the middleware through
# these configuration options.
# config.active_record.database_selector = { delay: 2.seconds }
# config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
# config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
end

View File

@ -0,0 +1,49 @@
require "active_support/core_ext/integer/time"
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
config.cache_classes = true
# Do not eager load code on boot. This avoids loading your whole application
# just for the purpose of running a single test. If you are using a tool that
# preloads Rails for running tests, you may have to set it to true.
config.eager_load = false
# Configure public file server for tests with Cache-Control for performance.
config.public_file_server.enabled = true
config.public_file_server.headers = {
"Cache-Control" => "public, max-age=#{1.hour.to_i}"
}
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
config.cache_store = :null_store
# Raise exceptions instead of rendering exception templates.
config.action_dispatch.show_exceptions = false
# Disable request forgery protection in test environment.
config.action_controller.allow_forgery_protection = false
# Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr
# Raise exceptions for disallowed deprecations.
config.active_support.disallowed_deprecation = :raise
# Tell Active Support which deprecation messages to disallow.
config.active_support.disallowed_deprecation_warnings = []
# Raises error for missing translations.
# config.i18n.raise_on_missing_translations = true
# Annotate rendered view with file names.
# config.action_view.annotate_rendered_view_with_filenames = true
end

View File

@ -0,0 +1,8 @@
# Be sure to restart your server when you modify this file.
# ActiveSupport::Reloader.to_prepare do
# ApplicationController.renderer.defaults.merge!(
# http_host: 'example.org',
# https: false
# )
# end

View File

@ -0,0 +1,8 @@
# Be sure to restart your server when you modify this file.
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
# Rails.backtrace_cleaner.add_silencer { |line| /my_noisy_library/.match?(line) }
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code
# by setting BACKTRACE=1 before calling your invocation, like "BACKTRACE=1 ./bin/rails runner 'MyClass.perform'".
Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"]

View File

@ -0,0 +1,16 @@
# Be sure to restart your server when you modify this file.
# Avoid CORS issues when API is called from the frontend app.
# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests.
# Read more: https://github.com/cyu/rack-cors
# Rails.application.config.middleware.insert_before 0, Rack::Cors do
# allow do
# origins 'example.com'
#
# resource '*',
# headers: :any,
# methods: [:get, :post, :put, :patch, :delete, :options, :head]
# end
# end

View File

@ -0,0 +1,6 @@
# Be sure to restart your server when you modify this file.
# Configure sensitive parameters which will be filtered from the log file.
Rails.application.config.filter_parameters += [
:passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn
]

View File

@ -0,0 +1,16 @@
# Be sure to restart your server when you modify this file.
# Add new inflection rules using the following format. Inflections
# are locale specific, and you may define rules for as many different
# locales as you wish. All of these examples are active by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.plural /^(ox)$/i, '\1en'
# inflect.singular /^(ox)en/i, '\1'
# inflect.irregular 'person', 'people'
# inflect.uncountable %w( fish sheep )
# end
# These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.acronym 'RESTful'
# end

View File

@ -0,0 +1,4 @@
# Be sure to restart your server when you modify this file.
# Add new mime types for use in respond_to blocks:
# Mime::Type.register "text/richtext", :rtf

View File

@ -0,0 +1,67 @@
# Be sure to restart your server when you modify this file.
#
# This file contains migration options to ease your Rails 6.1 upgrade.
#
# Once upgraded flip defaults one by one to migrate to the new default.
#
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
# Support for inversing belongs_to -> has_many Active Record associations.
# Rails.application.config.active_record.has_many_inversing = true
# Track Active Storage variants in the database.
# Rails.application.config.active_storage.track_variants = true
# Apply random variation to the delay when retrying failed jobs.
# Rails.application.config.active_job.retry_jitter = 0.15
# Stop executing `after_enqueue`/`after_perform` callbacks if
# `before_enqueue`/`before_perform` respectively halts with `throw :abort`.
# Rails.application.config.active_job.skip_after_callbacks_if_terminated = true
# Specify cookies SameSite protection level: either :none, :lax, or :strict.
#
# This change is not backwards compatible with earlier Rails versions.
# It's best enabled when your entire app is migrated and stable on 6.1.
# Rails.application.config.action_dispatch.cookies_same_site_protection = :lax
# Generate CSRF tokens that are encoded in URL-safe Base64.
#
# This change is not backwards compatible with earlier Rails versions.
# It's best enabled when your entire app is migrated and stable on 6.1.
# Rails.application.config.action_controller.urlsafe_csrf_tokens = true
# Specify whether `ActiveSupport::TimeZone.utc_to_local` returns a time with an
# UTC offset or a UTC time.
# ActiveSupport.utc_to_local_returns_utc_offset_times = true
# Change the default HTTP status code to `308` when redirecting non-GET/HEAD
# requests to HTTPS in `ActionDispatch::SSL` middleware.
# Rails.application.config.action_dispatch.ssl_default_redirect_status = 308
# Use new connection handling API. For most applications this won't have any
# effect. For applications using multiple databases, this new API provides
# support for granular connection swapping.
# Rails.application.config.active_record.legacy_connection_handling = false
# Make `form_with` generate non-remote forms by default.
# Rails.application.config.action_view.form_with_generates_remote_forms = false
# Set the default queue name for the analysis job to the queue adapter default.
# Rails.application.config.active_storage.queues.analysis = nil
# Set the default queue name for the purge job to the queue adapter default.
# Rails.application.config.active_storage.queues.purge = nil
# Set the default queue name for the incineration job to the queue adapter default.
# Rails.application.config.action_mailbox.queues.incineration = nil
# Set the default queue name for the routing job to the queue adapter default.
# Rails.application.config.action_mailbox.queues.routing = nil
# Set the default queue name for the mail deliver job to the queue adapter default.
# Rails.application.config.action_mailer.deliver_later_queue_name = nil
# Generate a `Link` header that gives a hint to modern browsers about
# preloading assets when using `javascript_include_tag` and `stylesheet_link_tag`.
# Rails.application.config.action_view.preload_links_header = true

View File

@ -0,0 +1,9 @@
# Be sure to restart your server when you modify this file.
# This file contains settings for ActionController::ParamsWrapper which
# is enabled by default.
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json]
end

View File

@ -0,0 +1,33 @@
# Files in the config/locales directory are used for internationalization
# and are automatically loaded by Rails. If you want to use locales other
# than English, add the necessary files in this directory.
#
# To use the locales, use `I18n.t`:
#
# I18n.t 'hello'
#
# In views, this is aliased to just `t`:
#
# <%= t('hello') %>
#
# To use a different locale, set it with `I18n.locale`:
#
# I18n.locale = :es
#
# This would use the information in config/locales/es.yml.
#
# The following keys must be escaped otherwise they will not be retrieved by
# the default I18n backend:
#
# true, false, on, off, yes, no
#
# Instead, surround them with single quotes.
#
# en:
# 'true': 'foo'
#
# To learn more, please read the Rails Internationalization guide
# available at https://guides.rubyonrails.org/i18n.html.
en:
hello: "Hello world"

43
spec/rails/config/puma.rb Normal file
View File

@ -0,0 +1,43 @@
# Puma can serve each request in a thread from an internal thread pool.
# The `threads` method setting takes two numbers: a minimum and maximum.
# Any libraries that use thread pools should be configured to match
# the maximum value specified for Puma. Default is set to 5 threads for minimum
# and maximum; this matches the default thread size of Active Record.
#
max_threads_count = ENV.fetch("RAILS_MAX_THREADS", 5)
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count
# Specifies the `worker_timeout` threshold that Puma will use to wait before
# terminating a worker in development environments.
#
worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development"
# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
#
port ENV.fetch("PORT", 3000)
# Specifies the `environment` that Puma will run in.
#
environment ENV.fetch("RAILS_ENV") { "development" }
# Specifies the `pidfile` that Puma will use.
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
# Specifies the number of `workers` to boot in clustered mode.
# Workers are forked web server processes. If using threads and workers together
# the concurrency of the application would be max `threads` * `workers`.
# Workers do not work on JRuby or Windows (both of which do not support
# processes).
#
# workers ENV.fetch("WEB_CONCURRENCY") { 2 }
# Use the `preload_app!` method when specifying a `workers` number.
# This directive tells Puma to first boot the application and load code
# before forking the application. This takes advantage of Copy On Write
# process behavior so workers use less memory.
#
# preload_app!
# Allow puma to be restarted by `rails restart` command.
plugin :tmp_restart

View File

@ -0,0 +1,3 @@
Rails.application.routes.draw do
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

View File

@ -0,0 +1,6 @@
Spring.watch(
".ruby-version",
".rbenv-vars",
"tmp/restart.txt",
"tmp/caching-dev.txt"
)

View File

0
spec/rails/log/.keep Normal file
View File

View File

@ -0,0 +1 @@
# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file

View File

@ -0,0 +1,10 @@
require "test_helper"
class EnvironmentTesterTest < Minitest::Test
describe ".call" do
subject { ::EnvironmentTester.call }
it "returns the environment variable value" do
assert_equal "api_key_value", subject
end
end
end

View File

@ -0,0 +1,11 @@
ENV["RAILS_ENV"] ||= "test"
require_relative "../config/environment"
require "rails/test_help"
require "minitest/spec"
class ActiveSupport::TestCase
# Run tests in parallel with specified workers
parallelize(workers: :number_of_processors)
# Add more helper methods to be used by all tests here...
end

0
spec/rails/tmp/.keep Normal file
View File

0
spec/rails/vendor/.keep vendored Normal file
View File

99
spec/retriever_spec.rb Normal file
View File

@ -0,0 +1,99 @@
require "spec_helper"
require "ostruct"
RSpec.describe Psenv::Parameter do
context ".new" do
let(:parameter) do
{
name: "/psenv/test/VARIABLE",
value: "value",
type: "String",
version: 1
}
end
subject { Psenv::Parameter.new(parameter) }
it "creates a paraemeter object" do
expect(subject).to be_kind_of(Psenv::Parameter)
end
it "stores the correct name" do
expect(subject.name).to eq("VARIABLE")
end
it "stores the value" do
expect(subject.value).to eq("value")
end
end
end
RSpec.describe Psenv::Retriever do
context ".new" do
it "creates a retriever object" do
expect(Psenv::Retriever.new("A")).to be_kind_of(Psenv::Retriever)
end
end
context "#call" do
let(:ssm) { double }
before(:each) { allow(Aws::SSM::Client).to receive(:new) { ssm } }
subject { Psenv::Retriever.new("/psenv/test").call }
context "with a single page request" do
before(:each) do
allow(ssm).to receive(:get_parameters_by_path) {
OpenStruct.new(
parameters: [{
name: "/psenv/test/API_KEY",
value: "value",
type: "String",
version: 1
}]
)
}
end
it "returns the parsed parameters" do
expect(subject).to eq("API_KEY" => "value")
end
end
context "with multiple pages" do
before(:each) do
allow(ssm).to receive(:get_parameters_by_path) {
OpenStruct.new(
parameters: [{
name: "/psenv/test/API_KEY",
value: "value",
type: "String",
version: 1
}],
next_page?: true,
next_page: OpenStruct.new(
parameters: [{
name: "/psenv/test/CLIENT_KEY",
value: "value",
type: "String",
version: 1
}]
)
)
}
end
it "returns both parameters" do
expect(subject).to eq("API_KEY" => "value", "CLIENT_KEY" => "value")
end
end
context "when the request fails" do
before(:each) { allow(ssm).to receive(:get_parameters_by_path).and_raise }
it "raises a RetrieveError" do
expect { subject }.to raise_error(Psenv::RetrieveError)
end
end
end
end

View File

@ -1,6 +1,12 @@
require "bundler/setup"
Bundler.setup
require "psenv"
require "webmock/rspec"
WebMock.disable_net_connect!(allow_localhost: true)
RSpec.configure do |config|
# Enable flags like --only-failures and --next-failure
config.example_status_persistence_file_path = ".rspec_status"