spore-rails 0.0.3
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 +7 -0
- data/LICENSE +22 -0
- data/README.md +77 -0
- data/Rakefile +4 -0
- data/lib/spore/config.rb +102 -0
- data/lib/spore/environment.rb +27 -0
- data/lib/spore/parser.rb +29 -0
- data/lib/spore/rails-now.rb +10 -0
- data/lib/spore/rails.rb +43 -0
- data/lib/spore/version.rb +13 -0
- data/lib/spore.rb +31 -0
- data/spore.gemspec +18 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 985a93a4a301bda8d488e2ab9ede61d18fc2728c
|
4
|
+
data.tar.gz: efd1c8554eb8368dbc2cd48709afedf77c4070a4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dec469cbed1e48a7d592dffb505700a23e433d829e2c0ac72dac2260cb585348820f86b7d8f38ca14f6b73f07d3ea032385a6447b7ba78bfb2c2bad6653a8929
|
7
|
+
data.tar.gz: c664cef26ddb8778a04ad230857ba9d67916db2ef6b60f2a56486fa06bd54e0728c7a4483a0b980497fe99fd81d7268aec3c49da29f7a727348a95430989d008
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Brandon Keepers
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
spore-rails
|
2
|
+
-----------
|
3
|
+
|
4
|
+
Ruby/Rails gem to load Spore environment variables. See the [Spore Website](https://spore.sh) for more information.
|
5
|
+
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
### Rails
|
10
|
+
|
11
|
+
Add this line to the top of your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'spore-rails'
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
```shell
|
20
|
+
$ bundle
|
21
|
+
```
|
22
|
+
|
23
|
+
#### Note on load order
|
24
|
+
|
25
|
+
Spore is initialized in your Rails app during the `before_configuration` callback, which is fired when the `Application` constant is defined in `config/application.rb` with `class Application < Rails::Application`. If you need it to be initialized sooner, you can manually call `Spore::Railtie.load`.
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
# config/application.rb
|
29
|
+
Bundler.require(*Rails.groups)
|
30
|
+
|
31
|
+
Spore::Railtie.load
|
32
|
+
|
33
|
+
HOSTNAME = ENV['HOSTNAME']
|
34
|
+
```
|
35
|
+
|
36
|
+
If you use gems that require environment variables to be set before they are loaded, then list `spore-rails` in the `Gemfile` before those other gems and require `spore/rails-now`.
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
gem 'spore-rails', :require => 'spore/rails-now'
|
40
|
+
gem 'gem-that-requires-env-variables'
|
41
|
+
```
|
42
|
+
|
43
|
+
### Sinatra or Plain ol' Ruby
|
44
|
+
|
45
|
+
Install the gem:
|
46
|
+
|
47
|
+
```shell
|
48
|
+
$ gem install spore
|
49
|
+
```
|
50
|
+
|
51
|
+
As early as possible in your application bootstrap process, load Spore:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
require 'spore'
|
55
|
+
Spore.load
|
56
|
+
```
|
57
|
+
To ensure Spore is loaded in rake, load the tasks:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
require 'spore/tasks'
|
61
|
+
|
62
|
+
task :mytask => :spore do
|
63
|
+
# things that require environment variables
|
64
|
+
end
|
65
|
+
```
|
66
|
+
|
67
|
+
## Contributing
|
68
|
+
|
69
|
+
1. Fork it
|
70
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
71
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
72
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
73
|
+
5. Create new Pull Request
|
74
|
+
|
75
|
+
## Notes
|
76
|
+
|
77
|
+
The `spore-rails` gem was based on [`dotenv`](https://github.com/bkeepers/dotenv) by Brandon Keepers.
|
data/Rakefile
ADDED
data/lib/spore/config.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spore-api'
|
2
|
+
require 'netrc'
|
3
|
+
|
4
|
+
module Spore
|
5
|
+
class Config
|
6
|
+
attr_reader :environment
|
7
|
+
attr_reader :api
|
8
|
+
|
9
|
+
DEPLOYMENT_VAR = "SPORE_DEPLOYMENT"
|
10
|
+
CONFIG_FILE = "config.json"
|
11
|
+
DEFAULT_CONFIG = File.expand_path(
|
12
|
+
"../config/default.json", File.dirname(__FILE__))
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def is_deployment?
|
16
|
+
!ENV[DEPLOYMENT_VAR].nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def load
|
20
|
+
if is_deployment?
|
21
|
+
Spore::DeploymentConfig.new
|
22
|
+
else
|
23
|
+
Spore::LocalConfig.new
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def config
|
29
|
+
@config ||= begin
|
30
|
+
file = File.read DEFAULT_CONFIG
|
31
|
+
hash = JSON.parse file
|
32
|
+
config_file = File.join(ENV["SPORE_HOME"] || "~/.spore", CONFIG_FILE)
|
33
|
+
begin
|
34
|
+
hash.update(JSON.parse(File.read(File.expand_path(config_file))))
|
35
|
+
rescue Errno::ENOENT
|
36
|
+
# ~/.spore/config.json doesn't exist, so just use the default config
|
37
|
+
hash
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def fetch(app_id, cell_id)
|
43
|
+
api.get_cell(app_id, environment, cell_id)["value"]
|
44
|
+
end
|
45
|
+
|
46
|
+
def spore_file
|
47
|
+
File.expand_path(config["sporeFile"])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module Spore
|
53
|
+
class LocalConfig < Config
|
54
|
+
def initialize
|
55
|
+
email, key = load_credentials
|
56
|
+
@api = Spore::Client.new
|
57
|
+
@api.key = key
|
58
|
+
@api.name = email
|
59
|
+
@api.api_endpoint = server
|
60
|
+
end
|
61
|
+
|
62
|
+
def environment
|
63
|
+
ENV["SPORE_ENV"] || @config["defaultEnv"]
|
64
|
+
end
|
65
|
+
|
66
|
+
def server
|
67
|
+
config["useProxy"] ? "http://127.0.0.1:#{config["proxy"]["port"]}" : config["host"]
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def load_credentials
|
73
|
+
n = Netrc.read(File.expand_path config["netrc"])
|
74
|
+
hostname = URI.parse(config["host"]).hostname
|
75
|
+
n[hostname]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
module Spore
|
81
|
+
class DeploymentConfig < Config
|
82
|
+
ENV_FORMAT = /(http|https):\/\/([a-zA-Z0-9-]+)\+([a-zA-Z0-9-]+)\+([a-f0-9-]+):([^@]+)@(.+)/
|
83
|
+
|
84
|
+
def initialize
|
85
|
+
ENV_FORMAT.match(ENV[Config::DEPLOYMENT_VAR]) do |m|
|
86
|
+
name = m[2]
|
87
|
+
key = m[5]
|
88
|
+
host = "#{m[1]}://#{m[6]}"
|
89
|
+
@environment = m[3]
|
90
|
+
@api = Spore::Client.new
|
91
|
+
@api.key = key
|
92
|
+
@api.name = name
|
93
|
+
@api.api_endpoint = host
|
94
|
+
end
|
95
|
+
raise "SPORE_DEPLOYMENT has an unexpected format" if @environment.nil?
|
96
|
+
end
|
97
|
+
|
98
|
+
def environment
|
99
|
+
ENV["SPORE_ENV"] || @environment
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Spore
|
2
|
+
# This class inherits from Hash and represents the environemnt into which
|
3
|
+
# Dotenv will load key value pairs from a file.
|
4
|
+
class Environment < Hash
|
5
|
+
attr_reader :filename
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
load
|
9
|
+
end
|
10
|
+
|
11
|
+
def load
|
12
|
+
update Parser.call
|
13
|
+
end
|
14
|
+
|
15
|
+
def read
|
16
|
+
File.read(@filename)
|
17
|
+
end
|
18
|
+
|
19
|
+
def apply
|
20
|
+
each { |k, v| ENV[k] ||= v }
|
21
|
+
end
|
22
|
+
|
23
|
+
def apply!
|
24
|
+
each { |k, v| ENV[k] = v }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/spore/parser.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Spore
|
4
|
+
class Parser
|
5
|
+
class << self
|
6
|
+
def call
|
7
|
+
config = Spore::Config.load
|
8
|
+
new(config).hash
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :hash
|
13
|
+
def initialize(config)
|
14
|
+
@config = config
|
15
|
+
spore = JSON.parse(File.read config.spore_file)
|
16
|
+
translate(spore["id"], spore["envs"][config.environment])
|
17
|
+
end
|
18
|
+
|
19
|
+
def translate(app_id, hash)
|
20
|
+
@hash = {}
|
21
|
+
hash.each do |key, value|
|
22
|
+
# Translate APP_ENV to RAILS_ENV
|
23
|
+
key = "RAILS_ENV" if key == "APP_ENV"
|
24
|
+
@hash[key] = @config.fetch(app_id, value)
|
25
|
+
end
|
26
|
+
@hash
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# If you use gems that require environment variables to be set before they are
|
2
|
+
# loaded, then list `spore-rails` in the `Gemfile` before those other gems and
|
3
|
+
# require `spore/rails-now`.
|
4
|
+
#
|
5
|
+
# gem "spore-rails", :require => "spore/rails-now"
|
6
|
+
# gem "gem-that-requires-env-variables"
|
7
|
+
#
|
8
|
+
|
9
|
+
require "spore/rails"
|
10
|
+
Spore::Railtie.load
|
data/lib/spore/rails.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require "spore"
|
2
|
+
|
3
|
+
Spore.instrumenter = ActiveSupport::Notifications
|
4
|
+
|
5
|
+
# Watch all loaded env files with Spring
|
6
|
+
begin
|
7
|
+
require "spring/watcher"
|
8
|
+
ActiveSupport::Notifications.subscribe(/^spore/) do |*args|
|
9
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
10
|
+
Spring.watch event.payload[:env].filename if Rails.application
|
11
|
+
end
|
12
|
+
rescue LoadError
|
13
|
+
# Spring is not available
|
14
|
+
end
|
15
|
+
|
16
|
+
module Spore
|
17
|
+
# Spore Railtie for using Spore to load environment from a file into
|
18
|
+
# Rails applications
|
19
|
+
class Railtie < Rails::Railtie
|
20
|
+
config.before_configuration { load }
|
21
|
+
|
22
|
+
# Public: Load spore
|
23
|
+
#
|
24
|
+
# This will get called during the `before_configuration` callback, but you
|
25
|
+
# can manually call `Spore::Railtie.load` if you needed it sooner.
|
26
|
+
def load
|
27
|
+
Spore.load
|
28
|
+
end
|
29
|
+
|
30
|
+
# Internal: `Rails.root` is nil in Rails 4.1 before the application is
|
31
|
+
# initialized, so this falls back to the `RAILS_ROOT` environment variable,
|
32
|
+
# or the current working directory.
|
33
|
+
def root
|
34
|
+
Rails.root || Pathname.new(ENV["RAILS_ROOT"] || Dir.pwd)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Rails uses `#method_missing` to delegate all class methods to the
|
38
|
+
# instance, which means `Kernel#load` gets called here. We don't want that.
|
39
|
+
def self.load
|
40
|
+
instance.load
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/spore.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "spore/parser"
|
2
|
+
require "spore/environment"
|
3
|
+
require "spore/config"
|
4
|
+
|
5
|
+
# The top level Spore module. The entrypoint for the application logic.
|
6
|
+
module Spore
|
7
|
+
class << self
|
8
|
+
attr_accessor :instrumenter
|
9
|
+
end
|
10
|
+
|
11
|
+
module_function
|
12
|
+
|
13
|
+
def load(*filenames)
|
14
|
+
env = Environment.new
|
15
|
+
instrument("spore.load", :env => env) { env.apply }
|
16
|
+
end
|
17
|
+
|
18
|
+
# same as `load`, but will override existing values in `ENV`
|
19
|
+
def overload(*filenames)
|
20
|
+
env = Environment.new
|
21
|
+
instrument("spore.overload", :env => env) { env.apply! }
|
22
|
+
end
|
23
|
+
|
24
|
+
def instrument(name, payload = {}, &block)
|
25
|
+
if instrumenter
|
26
|
+
instrumenter.instrument(name, payload, &block)
|
27
|
+
else
|
28
|
+
block.call
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spore.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.expand_path("../lib/spore/version", __FILE__)
|
2
|
+
require "English"
|
3
|
+
|
4
|
+
Gem::Specification.new "spore-rails", Spore::Version do |gem|
|
5
|
+
gem.authors = ["Shayan Guha"]
|
6
|
+
gem.email = ["shayan@teleborder.com"]
|
7
|
+
gem.description = gem.summary = "Loads environment variables from spore."
|
8
|
+
gem.homepage = "https://github.com/spore-sh/spore-rails"
|
9
|
+
gem.license = "MIT"
|
10
|
+
|
11
|
+
gem.files = %w(LICENSE README.md Rakefile spore.gemspec)
|
12
|
+
gem.files += Dir.glob("lib/**/*.rb")
|
13
|
+
gem.require_paths = ["lib"]
|
14
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
15
|
+
|
16
|
+
gem.add_dependency 'spore-api', "~> 0.0"
|
17
|
+
gem.add_dependency 'netrc', "~> 0.10"
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spore-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shayan Guha
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: spore-api
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: netrc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.10'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.10'
|
41
|
+
description: Loads environment variables from spore.
|
42
|
+
email:
|
43
|
+
- shayan@teleborder.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- LICENSE
|
49
|
+
- README.md
|
50
|
+
- Rakefile
|
51
|
+
- lib/spore.rb
|
52
|
+
- lib/spore/config.rb
|
53
|
+
- lib/spore/environment.rb
|
54
|
+
- lib/spore/parser.rb
|
55
|
+
- lib/spore/rails-now.rb
|
56
|
+
- lib/spore/rails.rb
|
57
|
+
- lib/spore/version.rb
|
58
|
+
- spore.gemspec
|
59
|
+
homepage: https://github.com/spore-sh/spore-rails
|
60
|
+
licenses:
|
61
|
+
- MIT
|
62
|
+
metadata: {}
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 2.2.2
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: Loads environment variables from spore.
|
83
|
+
test_files: []
|
84
|
+
has_rdoc:
|