settei 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8d7db95b9bd55c016fd36a30e28f42d6c360fadf
4
+ data.tar.gz: 6a6638dc0f1403b4070bdfde0ec9194f52683f44
5
+ SHA512:
6
+ metadata.gz: 6a052e47b595948163a00b02a1138b09124acbff2d3fce28cf5882d5f6e2761899ff8c9cd065623e26186a0abb72e0e12073e06af66698dcf6cc473ec9f927e6
7
+ data.tar.gz: '094233cf0983684d86bf189e1b4a18119335356a992e5a4d7859d93da4bf1bed70bf6f9608257809fc8a00f812323df06e9dd131d98bc2289271eabc1e4dab41'
@@ -0,0 +1,8 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
@@ -0,0 +1,2 @@
1
+ --no-private
2
+ --markup=markdown
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in settei.gemspec
6
+ gemspec
@@ -0,0 +1,134 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ settei (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ actioncable (5.1.4)
10
+ actionpack (= 5.1.4)
11
+ nio4r (~> 2.0)
12
+ websocket-driver (~> 0.6.1)
13
+ actionmailer (5.1.4)
14
+ actionpack (= 5.1.4)
15
+ actionview (= 5.1.4)
16
+ activejob (= 5.1.4)
17
+ mail (~> 2.5, >= 2.5.4)
18
+ rails-dom-testing (~> 2.0)
19
+ actionpack (5.1.4)
20
+ actionview (= 5.1.4)
21
+ activesupport (= 5.1.4)
22
+ rack (~> 2.0)
23
+ rack-test (>= 0.6.3)
24
+ rails-dom-testing (~> 2.0)
25
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
26
+ actionview (5.1.4)
27
+ activesupport (= 5.1.4)
28
+ builder (~> 3.1)
29
+ erubi (~> 1.4)
30
+ rails-dom-testing (~> 2.0)
31
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
32
+ activejob (5.1.4)
33
+ activesupport (= 5.1.4)
34
+ globalid (>= 0.3.6)
35
+ activemodel (5.1.4)
36
+ activesupport (= 5.1.4)
37
+ activerecord (5.1.4)
38
+ activemodel (= 5.1.4)
39
+ activesupport (= 5.1.4)
40
+ arel (~> 8.0)
41
+ activesupport (5.1.4)
42
+ concurrent-ruby (~> 1.0, >= 1.0.2)
43
+ i18n (~> 0.7)
44
+ minitest (~> 5.1)
45
+ tzinfo (~> 1.1)
46
+ arel (8.0.0)
47
+ builder (3.2.3)
48
+ concurrent-ruby (1.0.5)
49
+ crass (1.0.3)
50
+ diff-lcs (1.3)
51
+ erubi (1.7.0)
52
+ globalid (0.4.1)
53
+ activesupport (>= 4.2.0)
54
+ i18n (0.9.4)
55
+ concurrent-ruby (~> 1.0)
56
+ loofah (2.2.0)
57
+ crass (~> 1.0.2)
58
+ nokogiri (>= 1.5.9)
59
+ mail (2.7.0)
60
+ mini_mime (>= 0.1.1)
61
+ method_source (0.9.0)
62
+ mini_mime (1.0.0)
63
+ mini_portile2 (2.3.0)
64
+ minitest (5.11.3)
65
+ nio4r (2.2.0)
66
+ nokogiri (1.8.2)
67
+ mini_portile2 (~> 2.3.0)
68
+ rack (2.0.4)
69
+ rack-test (0.8.2)
70
+ rack (>= 1.0, < 3)
71
+ rails (5.1.4)
72
+ actioncable (= 5.1.4)
73
+ actionmailer (= 5.1.4)
74
+ actionpack (= 5.1.4)
75
+ actionview (= 5.1.4)
76
+ activejob (= 5.1.4)
77
+ activemodel (= 5.1.4)
78
+ activerecord (= 5.1.4)
79
+ activesupport (= 5.1.4)
80
+ bundler (>= 1.3.0)
81
+ railties (= 5.1.4)
82
+ sprockets-rails (>= 2.0.0)
83
+ rails-dom-testing (2.0.3)
84
+ activesupport (>= 4.2.0)
85
+ nokogiri (>= 1.6)
86
+ rails-html-sanitizer (1.0.3)
87
+ loofah (~> 2.0)
88
+ railties (5.1.4)
89
+ actionpack (= 5.1.4)
90
+ activesupport (= 5.1.4)
91
+ method_source
92
+ rake (>= 0.8.7)
93
+ thor (>= 0.18.1, < 2.0)
94
+ rake (10.5.0)
95
+ rspec (3.7.0)
96
+ rspec-core (~> 3.7.0)
97
+ rspec-expectations (~> 3.7.0)
98
+ rspec-mocks (~> 3.7.0)
99
+ rspec-core (3.7.1)
100
+ rspec-support (~> 3.7.0)
101
+ rspec-expectations (3.7.0)
102
+ diff-lcs (>= 1.2.0, < 2.0)
103
+ rspec-support (~> 3.7.0)
104
+ rspec-mocks (3.7.0)
105
+ diff-lcs (>= 1.2.0, < 2.0)
106
+ rspec-support (~> 3.7.0)
107
+ rspec-support (3.7.1)
108
+ sprockets (3.7.1)
109
+ concurrent-ruby (~> 1.0)
110
+ rack (> 1, < 3)
111
+ sprockets-rails (3.2.1)
112
+ actionpack (>= 4.0)
113
+ activesupport (>= 4.0)
114
+ sprockets (>= 3.0.0)
115
+ thor (0.20.0)
116
+ thread_safe (0.3.6)
117
+ tzinfo (1.2.5)
118
+ thread_safe (~> 0.1)
119
+ websocket-driver (0.6.5)
120
+ websocket-extensions (>= 0.1.0)
121
+ websocket-extensions (0.1.3)
122
+
123
+ PLATFORMS
124
+ ruby
125
+
126
+ DEPENDENCIES
127
+ bundler (~> 1.16)
128
+ rails
129
+ rake (~> 10.0)
130
+ rspec (~> 3.7.0)
131
+ settei!
132
+
133
+ BUNDLED WITH
134
+ 1.16.0
@@ -0,0 +1,97 @@
1
+ # Settei
2
+
3
+ Hash based configuration with flexibility and 12-factor app deployment in mind
4
+
5
+ ## Design Philosophies
6
+
7
+ * Fast as it is accessible without loading Rails
8
+ * Ease of management as nested hash is allowed
9
+ * 12-factor compatible by serializing as environment variable.
10
+ * Minimal meta-programming magics, so you can add your flavor of magic.
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'settei'
18
+ ```
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install settei
27
+
28
+ ## Usage
29
+
30
+ For Rails, a rake task is available for simple setup:
31
+
32
+ $ settei:install:rails
33
+
34
+ A `config/setting.rb` file is added for basic setup.
35
+
36
+ YAML files are added under `config/environments` and is ignored by git.
37
+
38
+ In your app, you can access the settings like this:
39
+
40
+ ```ruby
41
+ Setting.dig(:google, :api, :secret)
42
+ ```
43
+
44
+ ## Settei::Base
45
+
46
+ `Settei::Base` is the core class for accessing the configurations. It is initialized by a hash. It is a light wrapper intended for you to extend.
47
+
48
+ `#dig` is used to access its values. It's convenient because it does not err if nested hash is absent.
49
+
50
+ `#dig_and_wrap` will return a `Settei::Base` if it the return value is a hash.
51
+
52
+ Install script maps `Setting` to an instance of `Settei::Base`, for convenience.
53
+
54
+ ## Loader
55
+
56
+ `Settei::Loaders::SimpleLoader` is responsible for providing the hash to initialize `Settei::Base`. It loads from a source such as YAML or environment variable. It can also serialize the whole hash into one string, suitable for deploying via environment variables.
57
+
58
+ ```ruby
59
+ loader = Settei::Loaders::SimpleLoader.new(dir: 'path/to/dir')
60
+ loader.load.as_hash # loads default.yml and returns a hash
61
+ loader.load(:production).as_env_value # loads production.yml and returns "XYZ"
62
+ loader.load(:test).as_env_assignment # loads test.yml and returns "APP_CONG=XYZ"
63
+ ```
64
+
65
+ We welcome PRs for different types of loaders, as `SimpleLoader` is not suitable for every situation.
66
+
67
+ ## Deployment
68
+
69
+ If `deploy.rb` is present, `rake settei:install:rails` will append code to it, allow serialized config to be passed as an environment variable.
70
+
71
+ ## Frameworks other than Rails
72
+
73
+ Settei is designed to be simple so you can integrate it into any frameworks easily. The steps are mainly:
74
+
75
+ 1. Designate a folder for storing YAML files.
76
+ 2. Create a `setting.rb` file, in which `Settei::Base` is initialized (see `templates/setting.rb`)
77
+ 3. Require it when framework starts.
78
+ 4. Load and pass serialized production config as environment variable in deploy script (see `templates/_capistrano.rb` or `templates/_mina.rb`).
79
+
80
+ We also welcome PRs for generators of other frameworks too.
81
+
82
+ # Ruby < 2.3
83
+
84
+ `Settei::Base` uses `dig` to access the configuration, available since Ruby 2.3. If your Ruby is not new enough, don't be afraid. Write your own hash accessor literally takes minutes. You can even use `SettingsLogic.new(hash)` .
85
+
86
+ # FAQ
87
+
88
+ **Q:** Would serialized configuration be too big for environment variable?
89
+ **A:** [The upper limit is pretty big.](https://stackoverflow.com/a/1078125/474597)
90
+
91
+
92
+ ## TODO
93
+
94
+ * Integrate Rails configurations (e.g. database) into Settei.
95
+ * Explore deep merge hash so development.yml can combine with default.yml.
96
+ * Make loader configurable so it is easy to add and mix functionality.
97
+
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "settei"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,4 @@
1
+ require_relative "settei/version"
2
+ require_relative "settei/base"
3
+ require_relative "settei/loaders/simple_loader"
4
+ require_relative 'settei/railtie' if !!defined?(Rails)
@@ -0,0 +1,61 @@
1
+ require 'forwardable'
2
+
3
+ # Accessor for configuration values in a hash.
4
+ module Settei
5
+ class Base
6
+ extend Forwardable
7
+ # @!method dig(key, ...)
8
+ # @see Hash#dig
9
+ # @!method merge(other_hash)
10
+ # @see Hash#merge
11
+ # @!method fetch(key [, default])
12
+ # @see Hash#fetch
13
+ # @!method has_key?(key)
14
+ # @see Hash#has_key?
15
+ # @!method include?(key)
16
+ # @see Hash#include?
17
+ # @!method key?(key)
18
+ # @see Hash#key?
19
+ # @!method member?(key)
20
+ # @see Hash#member?
21
+ # @!method to_hash
22
+ # @!method to_h
23
+ def_delegators :@config, :dig, :merge!, :fetch, :has_key?, :include?, :key?, :member?, :to_hash, :to_h
24
+
25
+ # @param config [Hash] configuration
26
+ def initialize(config)
27
+ if !config.is_a? Hash
28
+ raise ArgumentError.new('config is not a hash')
29
+ end
30
+
31
+ self.config = config
32
+ end
33
+
34
+ # Same as {#dig}, but will wrap return value as a {Settei::Base} if it is a hash.
35
+ def dig_and_wrap(*args)
36
+ result = dig(*args)
37
+ if result.is_a?(Hash)
38
+ self.class.new(result)
39
+ else
40
+ result
41
+ end
42
+ end
43
+
44
+ def merge(*args)
45
+ new_hash = @config.merge(*args)
46
+ self.class.new(new_hash)
47
+ end
48
+
49
+ private
50
+
51
+ def config=(config)
52
+ @config = config
53
+
54
+ begin
55
+ require "active_support/core_ext/hash/indifferent_access"
56
+ @config = @config.with_indifferent_access
57
+ rescue LoadError
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,25 @@
1
+ module Settei
2
+ module Extensions
3
+ # For computing the a string for host settings. There can be multiple host settings such as asset host.
4
+ module HostUrl
5
+ # @param [String, Symbol] server name of host
6
+ # @param [Hash] params segment key-values to override default. A false value can hide that segment.
7
+ # @option params [String, false] :protocol
8
+ # @option params [String, false] :subdomain
9
+ # @option params [String, false] :domain
10
+ # @option params [Integer, false] :port
11
+ # @return [String] host domain
12
+ def host(server = :default, params = {})
13
+ default_params = dig(:hosts, server)
14
+ params = default_params.merge(params)
15
+
16
+ url = ''
17
+ url << params[:protocol].clone << '://' if params[:protocol]
18
+ url << params[:subdomain].clone << '.' if params[:subdomain]
19
+ url << params[:domain]
20
+ url << ':' << params[:port].to_s if params[:port]
21
+ url
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,113 @@
1
+ module Settei
2
+ module Generators
3
+ class Rails
4
+ def initialize(app_path:)
5
+ @app_path = app_path
6
+
7
+ spec = Gem::Specification.find_by_name("settei")
8
+ @gem_path = spec.gem_dir
9
+ end
10
+
11
+ def run
12
+ create_setting_rb
13
+ create_ymls
14
+ update_application_rb
15
+ update_gitignore
16
+ update_deploy_rb
17
+ end
18
+
19
+ private
20
+
21
+ def create_setting_rb
22
+ file_name = 'config/setting.rb'.freeze
23
+
24
+ create_if_absent(file_name) do |file_name|
25
+ FileUtils.cp(
26
+ File.join(@gem_path, 'templates/setting.rb'),
27
+ File.join(@app_path, file_name)
28
+ )
29
+ end
30
+ end
31
+
32
+ def create_ymls
33
+ [:production, :default].each do |env|
34
+ file_name = "config/environments/#{env}.yml"
35
+
36
+ create_if_absent(file_name) do |file_name|
37
+ FileUtils.cp(
38
+ File.join(@gem_path, 'templates/setting.yml'),
39
+ File.join(@app_path, file_name)
40
+ )
41
+ end
42
+ end
43
+ end
44
+
45
+ def update_application_rb
46
+ file_name = 'config/application.rb'
47
+ file_path = File.join(@app_path, file_name)
48
+ text = "require_relative 'setting'"
49
+
50
+ file_content = File.read(file_path)
51
+ return if file_content.include?(text)
52
+
53
+ gsub_file(file_name, file_path, "require 'rails/all'", "require 'rails/all'\n\n#{text}")
54
+ end
55
+
56
+ def update_gitignore
57
+ file_name = '.gitignore'
58
+ file_path = File.join(@app_path, file_name)
59
+ text = "\n/config/environments/*.yml"
60
+
61
+ append(file_name, file_path, text)
62
+ end
63
+
64
+ def update_deploy_rb
65
+ file_name = 'config/deploy.rb'
66
+ file_path = File.join(@app_path, file_name)
67
+
68
+ return if !File.exist?(file_path)
69
+
70
+ file_content = File.read(file_path)
71
+ return if file_content.include?('Settei::')
72
+
73
+ if defined?(Mina)
74
+ text = File.read(File.join(@gem_path, 'templates/_mina.rb'))
75
+ elsif defined?(Capistrano)
76
+ text = File.read(File.join(@gem_path, 'templates/_capistrano.rb'))
77
+ else
78
+ return
79
+ end
80
+
81
+ text.prepend("\n\n# Settei: append serialized config as an environment variable\n")
82
+
83
+ append(file_name, file_path, text)
84
+ end
85
+
86
+ def append(file_name, file_path, text)
87
+ file_content = File.read(file_path)
88
+ if !file_content.include?(text)
89
+ File.open(file_path, 'a+') { |file| file.write(text) }
90
+ puts "Appended: #{file_name}"
91
+ end
92
+ end
93
+
94
+ def create_if_absent(file_name)
95
+ if File.exist?(file_name)
96
+ puts "Already exists: #{file_name}, skipped"
97
+ else
98
+ yield file_name
99
+ puts "Created: #{file_name}"
100
+ end
101
+ end
102
+
103
+ # Copied and modified from thor
104
+ def gsub_file(file_name, file_path, flag, *args, &block)
105
+ content = File.read(file_path)
106
+ content.gsub!(flag, *args, &block)
107
+ File.open(file_path, "wb") { |file| file.write(content) }
108
+
109
+ puts "Inserted: #{file_name}"
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,85 @@
1
+ require 'base64'
2
+ require 'yaml'
3
+ require 'zlib'
4
+
5
+ module Settei
6
+ module Loaders
7
+ # Loader designed to load hash from environment variable and YAML files.
8
+ # After initialization, call {#load} to load hash into memory,
9
+ # then call {#as_hash}, {#as_env_value}, or {#as_env_assignment} to obtain the results.
10
+ # e.g. `loader.load(:production).as_hash`
11
+ class SimpleLoader
12
+ attr_reader :env_name
13
+
14
+ # @param dir [String] path of directory containing config YAML files
15
+ # @param env_name [String] name for environment variable
16
+ def initialize(dir: nil, env_name: 'APP_CONFIG')
17
+ @dir = dir
18
+ @env_name = env_name
19
+ end
20
+
21
+ # Loads yaml file into memory.
22
+ # If `ENV[@env_name]` exists, loader loads from it,
23
+ # otherwise load from YAML file.
24
+ #
25
+ # YAML file is picked based on provided `environment`.
26
+ # If environment is not specified,
27
+ # or specified environment file does not exist,
28
+ # default.yml is loaded.
29
+ #
30
+ # @param environment [String] application environment (e.g. production/test)
31
+ # @return [self] for further chaining
32
+ def load(environment = nil)
33
+ if !ENV[@env_name].nil?
34
+ @yaml = Zlib::Inflate.inflate(
35
+ Base64.strict_decode64(ENV[@env_name])
36
+ )
37
+ else
38
+ if environment
39
+ env_specific_file_path = "#{@dir}/#{environment}.yml"
40
+ if File.exist?(env_specific_file_path)
41
+ file_path = env_specific_file_path
42
+ end
43
+ end
44
+ file_path ||= "#{@dir}/default.yml"
45
+
46
+ @yaml = open(file_path).read
47
+ end
48
+
49
+ self
50
+ end
51
+
52
+ # @return [Hash]
53
+ def as_hash
54
+ ensure_loaded!
55
+
56
+ YAML.load(@yaml)
57
+ end
58
+
59
+ # @return [String] serialized config hash, for passing as environment variable
60
+ def as_env_value
61
+ ensure_loaded!
62
+
63
+ Base64.strict_encode64(
64
+ Zlib::Deflate.deflate(@yaml)
65
+ )
66
+ end
67
+
68
+ # Convenience method for outputting "NAME=VALUE" in one call.
69
+ # @return [String] {#as_env_value} with assignment to `env_name`
70
+ def as_env_assignment
71
+ ensure_loaded!
72
+
73
+ "#{@env_name}=#{as_env_value}"
74
+ end
75
+
76
+ private
77
+
78
+ def ensure_loaded!
79
+ if !@yaml
80
+ raise 'Call `load` first to load YAML into memory.'
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,7 @@
1
+ module Settei
2
+ class Railtie < Rails::Railtie
3
+ rake_tasks do
4
+ load "tasks/settei_tasks.rake"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Settei
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,11 @@
1
+ require 'rake'
2
+ require 'settei/generators/rails'
3
+
4
+ namespace :settei do
5
+ namespace :install do
6
+ desc "Setup settei for Rails project"
7
+ task :rails do
8
+ Settei::Generators::Rails.new(app_path: Dir.pwd).run
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "settei/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "settei"
7
+ spec.version = Settei::VERSION
8
+ spec.authors = ["lulalala"]
9
+ spec.email = ["mark@goodlife.tw"]
10
+
11
+ spec.summary = %q{Ruby configuration}
12
+ #spec.description = %q{TODO: Write a longer description or delete this line.}
13
+ spec.homepage = "https://github.com/lulalala/settei"
14
+ spec.licenses = ['MIT']
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.required_ruby_version = '>= 2.3.0'
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.16"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rspec", "~> 3.7.0"
28
+ spec.add_development_dependency "rails"
29
+ end
@@ -0,0 +1,7 @@
1
+ require 'settei/loaders/simple_loader'
2
+ loader = Settei::Loaders::SimpleLoader.new(
3
+ dir: File.join(File.dirname(__FILE__), "environments")
4
+ )
5
+ loader.load(fetch(:rails_env))
6
+
7
+ set :default_env, {loader.env_name => loader.as_env_value}
@@ -0,0 +1,9 @@
1
+ require 'settei/loaders/simple_loader'
2
+ loader = Settei::Loaders::SimpleLoader.new(
3
+ dir: File.join(File.dirname(__FILE__), "environments")
4
+ )
5
+ loader.load(fetch(:rails_env))
6
+
7
+ set :bundle_prefix, -> {
8
+ %{#{loader.as_env_assignment} RAILS_ENV="#{fetch(:rails_env)}" #{fetch(:bundle_bin)} exec}
9
+ }
@@ -0,0 +1,13 @@
1
+ require 'settei/loaders/simple_loader'
2
+ require 'settei/base'
3
+ require 'settei/extensions/host_url'
4
+
5
+ if defined? Rails
6
+ rails_env = Rails.env
7
+ end
8
+
9
+ loader= Settei::Loaders::SimpleLoader.new(
10
+ dir: File.join(File.dirname(__FILE__), "environments")
11
+ )
12
+ Setting = Settei::Base.new(loader.load(rails_env).as_hash)
13
+ Setting.extend Settei::Extensions::HostUrl
@@ -0,0 +1 @@
1
+ the_answer_to_life_the_universe_and_everything: 42
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: settei
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - lulalala
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-03-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.7.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.7.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email:
71
+ - mark@goodlife.tw
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - ".yardopts"
79
+ - Gemfile
80
+ - Gemfile.lock
81
+ - README.md
82
+ - Rakefile
83
+ - bin/console
84
+ - bin/setup
85
+ - lib/settei.rb
86
+ - lib/settei/base.rb
87
+ - lib/settei/extensions/host_url.rb
88
+ - lib/settei/generators/rails.rb
89
+ - lib/settei/loaders/simple_loader.rb
90
+ - lib/settei/railtie.rb
91
+ - lib/settei/version.rb
92
+ - lib/tasks/settei_tasks.rake
93
+ - settei.gemspec
94
+ - templates/_capistrano.rb
95
+ - templates/_mina.rb
96
+ - templates/setting.rb
97
+ - templates/setting.yml
98
+ homepage: https://github.com/lulalala/settei
99
+ licenses:
100
+ - MIT
101
+ metadata: {}
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 2.3.0
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project:
118
+ rubygems_version: 2.6.13
119
+ signing_key:
120
+ specification_version: 4
121
+ summary: Ruby configuration
122
+ test_files: []