dirt-envelope 0.0.1.placeholder → 0.0.1.pre1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 187735bbf5949199cba257eb0d38f6c423358ef4
4
- data.tar.gz: c315b1ce36473021776e2b919c33427c548fa760
2
+ SHA256:
3
+ metadata.gz: d09180f8f86b0e8185d719b77b7803759567654c68c6a204a94e113f836af239
4
+ data.tar.gz: 5ef797a7641950d58474854c44d746d80f320b28ae6d182ea08b07d6f554b1ac
5
5
  SHA512:
6
- metadata.gz: f00a9d6e8d021dcdbd05078971e7be880660284658e14ab505a808c4126428b4a68ee1e77cbbb3f479c7b81950f0049462ea641d1e4c08fd54ac059d17a90ca9
7
- data.tar.gz: 65868d02f3bb41826352af86d2bd7f7bc4b8b9c476b2bff6b2ef6fdc312d85008dd4c8c2c09305cf22d16f8d8230cb388240c7565e9ef5f7416aaee81d2582a1
6
+ metadata.gz: 6418213a9c59ae1a7a70f9fa30f1b6ab1a5032541056e735c5659c0f3ff82853f358d521abf31af073f7bf944f633d3d8dc9cd85be42719aff123edb406114dc
7
+ data.tar.gz: 13e32abd1a7c74840bb403df613b336e6aaec3331504a5588f348a58046c5b1a267335ea1c9ee7e2290a3b49102caeed67f1eabf567c63045201ac43980f51fd
data/.rubocop.yml ADDED
@@ -0,0 +1,26 @@
1
+ inherit_from: ../.rubocop.yml
2
+
3
+ AllCops:
4
+ Exclude:
5
+ - 'bin/*'
6
+
7
+ TargetRubyVersion: 2.4
8
+
9
+ Layout/LineLength:
10
+ Exclude:
11
+ - 'spec/**/*.rb'
12
+
13
+ # setting to 6 to match RubyMine autoformat
14
+ Layout/FirstArrayElementIndentation:
15
+ IndentationWidth: 6
16
+
17
+
18
+ # rspec blocks are huge by design
19
+ Metrics/BlockLength:
20
+ Exclude:
21
+ - 'spec/**/*.rb'
22
+
23
+ Metrics/ModuleLength:
24
+ Exclude:
25
+ - 'spec/**/*.rb'
26
+
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.7.1
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in dirt-envelope.gemspec
data/README.md CHANGED
@@ -1,43 +1,105 @@
1
- # Dirt::Envelope
1
+ # ENVelope
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/dirt/envelope`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ > **Note:** This gem is a prototype spike. The API is not yet stable.
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ ## Big Picture
6
+
7
+ Single source of truth for application-wide configuration and environment variables.
8
+
9
+ the [12 Factor](http://12factor.net/config) application style is a good start, but the downside to environment variables
10
+ is that they can be leaked to untrustable subprocesses or 3rd party logging services.
11
+
12
+ ### Features
13
+
14
+ * File schema
15
+ * Location defaults based on the [XDG](https://en.wikipedia.org/wiki/Freedesktop.org#Base_Directory_Specification) file
16
+ location standard
17
+ * Distinction between configurations and secrets
18
+ * Secrets encrypted using [Lockbox](https://github.com/ankane/lockbox)
19
+ * Immutable
20
+
21
+ ### Anti-Features
22
+
23
+ Things that ENVelope intentionally does **not** support include:
24
+
25
+ * Multiple config files
26
+ * No subtle overrides
27
+ * No implicit priority-ordering knowledge
28
+ * Modes
29
+ * A testing environment should control itself
30
+ * No forgetting to set the mode before running rake, etc
31
+ * Config file code interpretation (eg. ERB in YAML)
32
+ * Security implications
33
+ * File structure complexity
34
+ * Value ambiguity
35
+
36
+ ### But That's Bonkers
37
+
38
+ It might be! Some situations may legitimately need extremely complex configuration setups. But sometimes a complex
39
+ configuration environment is a code smell indicating that life could be better by:
40
+
41
+ * Reducing your application into smaller parts (eg. microservices etc)
42
+ * Reducing the number of service providers
43
+ * Improving your deployment process
44
+
45
+ You know your situation better than this README can.
6
46
 
7
47
  ## Installation
8
48
 
9
49
  Add this line to your application's Gemfile:
10
50
 
11
51
  ```ruby
12
- gem 'dirt-envelope'
52
+ gem 'procrastinator'
13
53
  ```
14
54
 
15
- And then execute:
55
+ And then run in a terminal:
16
56
 
17
- $ bundle
57
+ bundle install
18
58
 
19
- Or install it manually with:
59
+ ## Usage
20
60
 
21
- $ gem install dirt-envelope
61
+ ### Configs
22
62
 
23
- ## Usage
63
+ To create the config file, run this in a terminal:
24
64
 
25
- TODO: Write usage instructions here
65
+ bundle exec rake envelope:create:configs
66
+
67
+ If a config file already exists in any of the search path locations, it will yell at you.
68
+
69
+ To edit the config file, run this in a terminal:
70
+
71
+ bundle exec rake envelope:edit:configs
72
+
73
+ ### Secrets
74
+
75
+ To create the config file, run this in a terminal:
76
+
77
+ bundle exec rake envelope:create:secrets
78
+
79
+ To edit the secrets file, run this and provide the file's encryption key:
80
+
81
+ bundle exec rake envelope:edit:secrets
82
+
83
+ It will then open the decrypted file your default editor (eg. nano). Once you have saved the file, it will be
84
+ re-encrypted.
26
85
 
27
86
  ## Contributing
87
+
28
88
  Bug reports and pull requests are welcome on GitHub at https://github.com/TenjinInc/dirt-envelope.
29
89
 
30
- This project is intended to be a friendly space for collaboration, and contributors are expected to adhere to the
90
+ This project is intended to be a friendly space for collaboration, and contributors are expected to adhere to the
31
91
  [Contributor Covenant](http://contributor-covenant.org) code of conduct.
32
92
 
33
93
  ### Core Developers
34
- After checking out the repo, run `bundle install` to install dependencies. Then, run `rake spec` to run the tests.
35
- You can also run `bin/console` for an interactive prompt that will allow you to experiment.
36
94
 
37
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the
38
- version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version,
95
+ After checking out the repo, run `bundle install` to install dependencies. Then, run `rake spec` to run the tests. You
96
+ can also run `bin/console` for an interactive prompt that will allow you to experiment.
97
+
98
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the
99
+ version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version,
39
100
  push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
40
101
 
41
102
  ## License
103
+
42
104
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
43
105
 
data/RELEASE_NOTES.md ADDED
@@ -0,0 +1,15 @@
1
+ # Release Notes
2
+
3
+ ## 0.0.1 ( )
4
+
5
+ ### Major Changes
6
+
7
+ * none
8
+
9
+ ### Minor Changes
10
+
11
+ * none
12
+
13
+ ### Bugfixes
14
+
15
+ * none
data/Rakefile CHANGED
@@ -1,6 +1,15 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'yard'
3
6
 
4
7
  RSpec::Core::RakeTask.new(:spec)
5
8
 
6
9
  task :default => :spec
10
+
11
+ YARD::Rake::YardocTask.new do |t|
12
+ t.files = %w[lib/**/*.rb]
13
+ # t.options = %w[--some-option]
14
+ t.stats_options = ['--list-undoc']
15
+ end
@@ -9,18 +9,24 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ['Robin Miller']
10
10
  spec.email = ['robin@tenjin.ca']
11
11
 
12
- spec.summary = %q{A nicer way to use environment variables. }
12
+ spec.summary = %q{Unified environment config.}
13
13
  spec.description = %q{Provides symbol access and namespacing for environment variables. }
14
14
  spec.homepage = 'https://github.com/TenjinInc/dirt-envelope'
15
15
  spec.license = 'MIT'
16
+ spec.metadata = {
17
+ 'rubygems_mfa_required' => 'true'
18
+ }
16
19
 
17
20
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
21
  spec.bindir = 'exe'
19
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
23
  spec.require_paths = ['lib']
21
24
 
22
- spec.add_development_dependency 'bundler', '~> 1.11'
23
- spec.add_development_dependency 'rake', '~> 10.0'
24
- spec.add_development_dependency 'rspec', '~> 3.0'
25
- spec.add_development_dependency 'simplecov', '~> 0.11'
25
+ spec.add_dependency 'lockbox', '>= 1.0'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 2.3'
28
+ spec.add_development_dependency 'rake', '~> 13.0'
29
+ spec.add_development_dependency 'rspec', '~> 3.9'
30
+ spec.add_development_dependency 'simplecov', '~> 0.21'
31
+ spec.add_development_dependency 'yard', '~> 0.9'
26
32
  end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'io/console'
4
+ require 'tempfile'
5
+
6
+ namespace :envelope do
7
+ # TODO: replace with actual path search mechanism (though not sure how to handle creates)
8
+ config_dir = Pathname.new('~/.config/').expand_path
9
+
10
+ namespace :configs do
11
+ desc 'Create a new configuration file'
12
+ task :create, [:app_name] do |_task, args|
13
+ if args[:app_name].nil?
14
+ raise 'app namespace argument required. Run with bundle exec rake envelope:secrets:create[app_name_here]'
15
+ end
16
+
17
+ file = config_dir / args[:app_name] / 'config.yml'
18
+ if file.exist?
19
+ warn 'Abort: File exists. Maybe you meant to edit the file with rake envelope:secrets:edit?'
20
+ exit 1
21
+ end
22
+
23
+ file.write <<~CONFIG_TEMPLATE
24
+ ---
25
+ CONFIG_TEMPLATE
26
+
27
+ warn "Created file #{ file }"
28
+ end
29
+
30
+ task :edit, [:app_name] do |_task, args|
31
+ if args[:app_name].nil?
32
+ raise 'app namespace argument required. Run with bundle exec rake envelope:secrets:create[app_name_here]'
33
+ end
34
+
35
+ # TODO: better to use the actual path search mechanism
36
+ configs_file = config_dir / args[:app_name] / 'config.yml'
37
+
38
+ # TODO: is exception good here? thought is to avoid clobbering exiting file on error.
39
+ system(ENV.fetch('EDITOR', 'editor'), configs_file.to_s, exception: true)
40
+
41
+ # TODO: it should warn about file unchanged. hint maybe you forgot to hit save?
42
+ # TODO: should avoid writing empty string. tell them to delete the file if that is what they want
43
+
44
+ warn "File saved to #{ configs_file }"
45
+ end
46
+ end
47
+
48
+ namespace :secrets do
49
+ desc 'Create a new encrypted secrets file'
50
+ task :create, [:app_name] do |_task, args|
51
+ if args[:app_name].nil?
52
+ raise 'app namespace argument required. Run with bundle exec rake envelope:secrets:create[app_name_here]'
53
+ end
54
+
55
+ file = config_dir / args[:app_name] / 'secrets.yml'
56
+ if file.exist?
57
+ warn 'Abort: File exists. Maybe you meant to edit the file with rake envelope:secrets:edit?'
58
+ exit 1
59
+ end
60
+
61
+ # TODO: add a comment inside the default template that tells people how to use it
62
+ file_str = <<~SECRETS_TEMPLATE
63
+ ---
64
+ SECRETS_TEMPLATE
65
+
66
+ master_key = Lockbox.generate_key
67
+
68
+ lockbox = Lockbox.new(key: master_key)
69
+
70
+ # TODO: explicitly set permissions, just in case they have weird inherited defaults
71
+ file.binwrite(lockbox.encrypt(file_str))
72
+ warn "Created file #{ file }"
73
+
74
+ # TODO: ideally this would not (always) print to terminal. maybe save to a file? or perhaps leverage stdout vs stderr to allow piping to file?
75
+ warn <<~INSTRUCTIONS
76
+ Generated key is:
77
+ #{ master_key }
78
+
79
+ Save this key to a secure password manager. You will need it to edit the secrets.yml file.
80
+ INSTRUCTIONS
81
+ end
82
+
83
+ desc 'Edit the encrypted secrets file'
84
+ task :edit, [:app_name] do |_task, args|
85
+ if args[:app_name].nil?
86
+ raise 'app namespace argument required. Run with bundle exec rake envelope:secrets:create[app_name_here]'
87
+ end
88
+
89
+ # TODO: better to use the actual path search mechanism
90
+ secrets_file = config_dir / args[:app_name] / 'secrets.yml'
91
+
92
+ master_key = ENV.fetch 'LOCKBOX_KEY' do
93
+ $stderr.puts 'Enter master key:'
94
+ $stdin.noecho(&:gets).strip
95
+ end
96
+
97
+ lockbox = Lockbox.new(key: master_key)
98
+
99
+ file_str = Tempfile.create(secrets_file.basename.to_s) do |tmp_file|
100
+ decrypted = lockbox.decrypt(secrets_file.binread)
101
+
102
+ tmp_file.write(decrypted)
103
+ tmp_file.rewind # rewind seems to be needed before system call for some reason?
104
+ # TODO: is exception good here? thought is to avoid clobbering exiting file on error.
105
+ system(ENV.fetch('EDITOR', 'editor'), tmp_file.path, exception: true)
106
+ tmp_file.read
107
+ end
108
+
109
+ # TODO: it should warn about file unchanged. hint maybe you forgot to hit save?
110
+ # TODO: should avoid writing empty string. tell them to delete the file if that is what they want
111
+ secrets_file.binwrite(lockbox.encrypt(file_str))
112
+
113
+ warn "File saved to #{ secrets_file }"
114
+ end
115
+ end
116
+ end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dirt
2
- module Envelope
3
- VERSION = '0.0.1.placeholder'
4
- end
4
+ module Envelope
5
+ VERSION = '0.0.1.pre1'
6
+ end
5
7
  end
data/lib/dirt/envelope.rb CHANGED
@@ -1,7 +1,148 @@
1
- require "dirt/envelope/version"
1
+ # frozen_string_literal: true
2
+
3
+ require 'dirt/envelope/version'
4
+ require 'yaml'
5
+ require 'lockbox'
6
+ require 'pathname'
7
+ require 'forwardable'
2
8
 
3
9
  module Dirt
4
- module Envelope
5
- # Your code goes here...
6
- end
10
+
11
+ # ENVelope
12
+ module Envelope
13
+ # TODO: replace PATH_KEY and DEFAULT_PATH with XDG gem. won't need them then
14
+ PATH_KEY = 'ENVELOPE_PATH'
15
+ # specifically not looking in app directory since we want to discourage saving any of these in git
16
+ DEFAULT_PATH = %w[
17
+ /etc
18
+ /usr/local/etc
19
+ ~/.config
20
+ ].join(' ').freeze
21
+
22
+ EXT = '.yml'
23
+
24
+ class Envelope
25
+ extend Forwardable
26
+
27
+ def_delegators :@configs, :fetch, :[]
28
+
29
+ def_delegator :@secrets, :secret, :fetch
30
+
31
+ attr_reader :configs, :secrets
32
+
33
+ def initialize(app_name:)
34
+ @configs = {}
35
+ @secrets = {}
36
+
37
+ config_files = locate_files(app_name, :config)
38
+
39
+ load_configs(config_files)
40
+
41
+ secret_files = locate_files(app_name, :secrets)
42
+
43
+ # TODO: this should be read from ENV or specific key in config file
44
+ master_key = ENV.fetch('LOCKBOX_KEY') do
45
+ raise KeyError, 'missing environment variable LOCKBOX_KEY' unless $stdin.respond_to? :noecho
46
+ $stderr.puts 'Enter master key:'
47
+ $stdin.noecho(&:gets).strip
48
+ end
49
+ Lockbox.master_key = master_key
50
+
51
+ load_secrets(secret_files, master_key)
52
+
53
+ # TODO: should be nice to recursively freeze secrets and configs, so that the whole settings hash chain is frozen
54
+ # secrets and main object are frozen prior to calling override block. This is on purpose to prevent folks from
55
+ # putting secrets into their code in that block.
56
+ @secrets.freeze
57
+ freeze
58
+
59
+ # TODO: setting & runninng override block should have some guards around it that raise if called after freezing
60
+ # (with a better error msg, hint that it must be set) or if called too early
61
+ self.class.__override_block__&.call(@configs)
62
+ @configs.freeze
63
+ end
64
+
65
+ class << self
66
+ attr_accessor :__override_block__
67
+ end
68
+
69
+ private
70
+
71
+ def search_path
72
+ ENV.fetch(PATH_KEY, DEFAULT_PATH).split(/\s+/).collect { |path| Pathname.new(path).expand_path }
73
+ end
74
+
75
+ def load_configs(files)
76
+ files.each do |config_file|
77
+ data = YAML.safe_load(config_file.read, symbolize_names: true)
78
+ next unless data
79
+
80
+ @configs.merge!(data)
81
+ end
82
+ end
83
+
84
+ def load_secrets(files, master_key)
85
+ lockbox = Lockbox.new(key: master_key)
86
+
87
+ # TODO: error out if any config files are readable by any other user
88
+
89
+ files.each do |config_file|
90
+ raw_file = config_file.binread
91
+ file_data = begin
92
+ lockbox.decrypt raw_file
93
+ rescue Lockbox::DecryptionError => e
94
+ raise RuntimeError, "Failed to open #{ config_file } (#{ e })"
95
+ end
96
+ data = YAML.safe_load(file_data, symbolize_names: true)
97
+ next unless data
98
+
99
+ @secrets.merge!(data)
100
+ end
101
+ end
102
+
103
+ def locate_files(app_name, type)
104
+ full_paths = search_path.collect { |dir| dir / app_name / "#{ type }#{ EXT }" }.collect(&:expand_path)
105
+
106
+ config_files = full_paths.select(&:exist?)
107
+
108
+ if config_files.empty?
109
+ raise "No #{ type } files found. Looked for: #{ full_paths.join(', ') }. Create at least one of these."
110
+ end
111
+
112
+ config_files
113
+ end
114
+
115
+ class SettingSet
116
+ extend Forwardable
117
+
118
+ def_delegators :@config, :fetch, :[]
119
+
120
+ def_delegator :@secrets, :secret, :fetch
121
+
122
+ def initialize(config)
123
+ @config = config
124
+ @secrets = {}
125
+ end
126
+
127
+ def merge!(other)
128
+ if other.is_a? Hash
129
+ @delegate_sd_obj.merge!(SettingSet.new(other))
130
+ else
131
+ @delegate_sd_obj.merge!(other)
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ class << self
138
+ # Override block that will be run after loading from config files and prior to freezing. It is intended to allow
139
+ # for test suites to tweak configurations without having to duplicate the entire config file.
140
+ #
141
+ # @yieldparam the configs from the Envelope
142
+ # @return [void]
143
+ def override(&block)
144
+ ::Dirt::Envelope::Envelope.__override_block__ = block
145
+ end
146
+ end
147
+ end
7
148
  end
metadata CHANGED
@@ -1,71 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dirt-envelope
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.placeholder
4
+ version: 0.0.1.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robin Miller
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-21 00:00:00.000000000 Z
11
+ date: 2022-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lockbox
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '1.11'
33
+ version: '2.3'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '1.11'
40
+ version: '2.3'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '10.0'
47
+ version: '13.0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '10.0'
54
+ version: '13.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '3.0'
61
+ version: '3.9'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '3.0'
68
+ version: '3.9'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: simplecov
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0.11'
75
+ version: '0.21'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.21'
83
+ - !ruby/object:Gem::Dependency
84
+ name: yard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.9'
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - "~>"
67
95
  - !ruby/object:Gem::Version
68
- version: '0.11'
96
+ version: '0.9'
69
97
  description: 'Provides symbol access and namespacing for environment variables. '
70
98
  email:
71
99
  - robin@tenjin.ca
@@ -75,21 +103,25 @@ extra_rdoc_files: []
75
103
  files:
76
104
  - ".gitignore"
77
105
  - ".rspec"
78
- - ".travis.yml"
106
+ - ".rubocop.yml"
107
+ - ".ruby-version"
79
108
  - CODE_OF_CONDUCT.md
80
109
  - Gemfile
81
110
  - LICENSE.txt
82
111
  - README.md
112
+ - RELEASE_NOTES.md
83
113
  - Rakefile
84
114
  - bin/console
85
115
  - bin/setup
86
116
  - dirt-envelope.gemspec
87
117
  - lib/dirt/envelope.rb
118
+ - lib/dirt/envelope/rake/tasks.rb
88
119
  - lib/dirt/envelope/version.rb
89
120
  homepage: https://github.com/TenjinInc/dirt-envelope
90
121
  licenses:
91
122
  - MIT
92
- metadata: {}
123
+ metadata:
124
+ rubygems_mfa_required: 'true'
93
125
  post_install_message:
94
126
  rdoc_options: []
95
127
  require_paths:
@@ -105,9 +137,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
137
  - !ruby/object:Gem::Version
106
138
  version: 1.3.1
107
139
  requirements: []
108
- rubyforge_project:
109
- rubygems_version: 2.4.6
140
+ rubygems_version: 3.1.2
110
141
  signing_key:
111
142
  specification_version: 4
112
- summary: A nicer way to use environment variables.
143
+ summary: Unified environment config.
113
144
  test_files: []
data/.travis.yml DELETED
@@ -1,4 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.2.1
4
- before_install: gem install bundler -v 1.11.2