shellject 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: 42c5c16ef31d11d1568b3b56f5046272b8ec650f
4
+ data.tar.gz: 01560ee6b533f226a683b1211ec4edf3abaccab8
5
+ SHA512:
6
+ metadata.gz: 5aa0308255c3dbdc2b9eb89f724c12a48d4c813f1b1ea0714ae01d9ad8ae69afd1c7e02e1937449190e3a06b78505f261893a1cb1ffaa7f71c3b1c0dac55f6df
7
+ data.tar.gz: de9e1de5191d93961f5fb64dc2fd308b81f82edf7d7266b86f4926e97fb78ff14497a726f9c94f65cf3d596e3c0696ba52d13e026b4e26aa59d080cd9d832bf3
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --require spec_helper
3
+ --format documentation
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
4
+ addons:
5
+ code_climate:
6
+ repo_token: 0c1e171a171c155a28b285b4f51de50259744fdc720521df22a18d028774881d
@@ -0,0 +1,13 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
6
+
7
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
+
9
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
+
11
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
+
13
+ This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in shellject.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Sergei Matheson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,58 @@
1
+ # Shellject
2
+
3
+ Store your secret environment variables (API keys, AWS secrets etc.) with GPGME, and inject them into your current shell when needed.
4
+
5
+ [![Build Status](https://travis-ci.org/sergei-matheson/shellject.svg?branch=master)](https://travis-ci.org/sergei-matheson/shellject)
6
+ [![Code Climate](https://codeclimate.com/github/sergei-matheson/shellject/badges/gpa.svg)](https://codeclimate.com/github/sergei-matheson/shellject)
7
+ [![Test Coverage](https://codeclimate.com/github/sergei-matheson/shellject/badges/coverage.svg)](https://codeclimate.com/github/sergei-matheson/shellject)
8
+
9
+ ## Installation
10
+
11
+ 1. Install [GPGTools](https://gpgtools.org) on OSX and create a new key pair, if you don't have one already
12
+ 1. If you have more than 1 secret key in your keyring, you may want to ensure that the 'default-key' is specified in ~/.gnupg/gpg.conf
13
+ 1. Then install the gem:
14
+ ```ruby
15
+ # In your Gemfile
16
+ gem 'shellject'
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ ```
22
+ $ bundle
23
+ ```
24
+
25
+ Or install it yourself as:
26
+
27
+ ```
28
+ $ gem install shellject
29
+ ```
30
+
31
+ *You may need to brew install gpgme on mac, or use your favourite package manager in linux*
32
+
33
+ 4. Finally, run
34
+
35
+ ```
36
+ $ shellject setup
37
+ ```
38
+ for instructions on how to set up the shell wrapper needed for injection, and, optionally, command-line completion.
39
+
40
+
41
+ ## Usage
42
+
43
+ $ shellject --help
44
+
45
+ ## Development
46
+
47
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec shellject` to use the code located in this directory, ignoring other installed copies of this gem.
48
+
49
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
50
+
51
+ ## Contributing
52
+
53
+ 1. Fork it ( https://github.com/sergei-matheson/shellject/fork )
54
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
55
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
56
+ 4. Test your changes (`bundle exec rake`)
57
+ 5. Push to the branch (`git push origin my-new-feature`)
58
+ 6. Create a new Pull Request
@@ -0,0 +1,29 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'reek/rake/task'
4
+ require 'rubocop/rake_task'
5
+
6
+ Reek::Rake::Task.new do |task|
7
+ task.config_file = './config.reek'
8
+ end
9
+
10
+ begin
11
+ require 'cane/rake_task'
12
+
13
+ desc 'Run cane to check quality metrics'
14
+ Cane::RakeTask.new(:quality) do |cane|
15
+ cane.abc_max = 10
16
+ cane.add_threshold 'coverage/.last_run.json', :>=, 100
17
+ end
18
+
19
+ rescue LoadError
20
+ warn 'cane not available, quality task not provided.'
21
+ end
22
+
23
+ RSpec::Core::RakeTask.new(:spec)
24
+
25
+ RuboCop::RakeTask.new(:rubocop) do |task|
26
+ task.patterns = ['lib/**/*.rb', 'spec/**/*.rb']
27
+ end
28
+
29
+ task default: [:spec, :quality, :reek, :rubocop]
@@ -0,0 +1,33 @@
1
+ _shellject()
2
+ {
3
+ local cur prev opts base save_dir
4
+ COMPREPLY=()
5
+ cur="${COMP_WORDS[COMP_CWORD]}"
6
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
7
+
8
+ case "${prev}" in
9
+ shellject)
10
+ COMPREPLY=($(compgen -W "load save setup --help --version" -- ${cur}))
11
+ return 0
12
+ ;;
13
+ save)
14
+ # Use default filename completion (when combined with -o default below)
15
+ COMPREPLY=()
16
+ return 0
17
+ ;;
18
+ load)
19
+ #
20
+ # Shelljections we know about, removing save dir as a prefix.
21
+ #
22
+ save_dir=${SHELLJECT_SAVE_DIR:- $(ls -d ~/.shellject/shelljections)}
23
+ # Escape save_dir for regex
24
+ local prefix=$(echo ${save_dir}/ | sed -e 's/[\/&]/\\&/g')
25
+ local shelljections=$(find ${save_dir} -type f| sed -e "s/${prefix}\(.*\)/\1/")
26
+ COMPREPLY=( $(compgen -W "${shelljections}" -- ${cur}) )
27
+ return 0
28
+ ;;
29
+ esac
30
+
31
+ }
32
+ complete -F _shellject -o default shellject
33
+
@@ -0,0 +1,21 @@
1
+ shellject ()
2
+ {
3
+ local executable output shellject_exit eval_exit
4
+ executable=$( type -P shellject );
5
+ output=$( $executable $@ );
6
+ shellject_exit=$?;
7
+ if [[ $shellject_exit == 0 && "$1" == "load" && ! $@ =~ "--help" ]]; then
8
+ eval "$output";
9
+ eval_exit=$?
10
+ if [[ $eval_exit != 0 ]]; then
11
+ echo "Loading shelljection $2 FAILED";
12
+ return $eval_exit
13
+ fi;
14
+ else
15
+ if [[ $shellject_exit == 0 ]]; then
16
+ echo "$output";
17
+ else
18
+ return $shellject_exit;
19
+ fi;
20
+ fi
21
+ }
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'shellject'
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
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1 @@
1
+ ---
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'shellject'
4
+ require 'clamp'
5
+
6
+ Clamp do
7
+
8
+ option ['--save-dir', '-s'], 'DIRECTORY',
9
+ 'The directory in which to store encrypted shelljections.',
10
+ environment_variable: 'SHELLJECT_SAVE_DIR',
11
+ default: '~/.shellject/shelljections',
12
+ attribute_name: 'save_dir_path'
13
+
14
+ option ['--version', '-v'], :flag, 'Show version' do
15
+ puts Shellject::VERSION
16
+ exit(0)
17
+ end
18
+
19
+ def save_directory
20
+ Shellject::SaveDirectory.new(File.expand_path save_dir_path)
21
+ end
22
+
23
+ def with_error_handling
24
+ yield
25
+ rescue Shellject::ShelljectError => ex
26
+ STDERR.puts "ERROR: #{ex.message}"
27
+ STDERR.puts help
28
+ exit(1)
29
+ end
30
+
31
+ subcommand 'save', 'Save the specified file as a shelljection' do
32
+ option ['--name', '-n'], 'NAME',
33
+ 'What to name the shelljection. If not specified, the basename of the file will be used.'
34
+ parameter 'INPUT_FILE', 'File to save', :attribute_name => :input_file
35
+ def execute
36
+ with_error_handling do
37
+ Shellject::Tasks::Save.new(save_directory, input_file, name).call
38
+ end
39
+ end
40
+ end
41
+
42
+ subcommand 'load', 'Load the specified shelljection' do
43
+ parameter 'NAME',
44
+ 'Name of the shelljection to load', :attribute_name => :name
45
+ def execute
46
+ with_error_handling do
47
+ Shellject::Tasks::Load.new(save_directory, name).call
48
+ end
49
+ end
50
+ end
51
+
52
+ subcommand 'setup', 'Setup wrapper and completion' do
53
+ def execute
54
+
55
+ bash_dir = Pathname.new File.expand_path('../bash', __dir__)
56
+ puts <<-eos
57
+ # You'll need to source the bash wrapper in order for values to be injected
58
+ # into your shell.
59
+ # Add the following line to your ~/.bash_profile or ~/.bashrc
60
+
61
+ source #{bash_dir.join 'shellject_wrapper.sh'}
62
+
63
+ # To add command line completion, add the following line to your ~/.bash_profile or ~/.bashrc
64
+
65
+ source #{bash_dir.join 'shellject_completion.sh'}
66
+
67
+ eos
68
+ end
69
+ end
70
+
71
+ end
@@ -0,0 +1,15 @@
1
+ require 'fileutils'
2
+ require 'pathname'
3
+
4
+ require 'gpgme'
5
+
6
+ require 'shellject/version'
7
+ require 'shellject/save_directory'
8
+ require 'shellject/tasks/load'
9
+ require 'shellject/tasks/save'
10
+
11
+ # Main module
12
+ module Shellject
13
+ # Standard shellject error
14
+ class ShelljectError < StandardError; end
15
+ end
@@ -0,0 +1,14 @@
1
+ module Shellject
2
+ # Models the shelljections directory as a repository.
3
+ class SaveDirectory
4
+ attr_reader :path
5
+
6
+ def initialize(path)
7
+ @path ||= Pathname.new path
8
+ end
9
+
10
+ def path_for(name)
11
+ path.join name
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,39 @@
1
+ module Shellject
2
+ module Tasks
3
+ # Loads, decrypts, and outputs a shelljection
4
+ class Load
5
+ attr_reader :save_directory, :name
6
+
7
+ def initialize(save_directory, name)
8
+ @save_directory = save_directory
9
+ @name = name
10
+ end
11
+
12
+ def call
13
+ ensure_readable
14
+ file = File.open path
15
+ STDOUT.print crypto.decrypt(file)
16
+ ensure
17
+ file.close if file
18
+ end
19
+
20
+ private
21
+
22
+ def ensure_readable
23
+ fail ShelljectError, "Could not read file #{path}" unless readable?
24
+ end
25
+
26
+ def readable?
27
+ path.readable?
28
+ end
29
+
30
+ def path
31
+ @path ||= save_directory.path_for name
32
+ end
33
+
34
+ def crypto
35
+ GPGME::Crypto.new always_trust: true
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,62 @@
1
+ module Shellject
2
+ module Tasks
3
+ # Encrypts and saves a file as a shelljection.
4
+ class Save
5
+ attr_reader :save_directory, :input_path, :name
6
+
7
+ def initialize(save_directory, input_path, name = nil)
8
+ @save_directory = save_directory
9
+ @input_path = input_path
10
+ @name = name
11
+ end
12
+
13
+ def call
14
+ ensure_readable
15
+ ensure_writable
16
+ with_files do |from, to|
17
+ crypto.encrypt from, output: to
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def with_files
24
+ from = File.open(input_path)
25
+ to = File.open(output_path, 'wb')
26
+ yield from, to
27
+ ensure
28
+ from.close if from
29
+ to.close if to
30
+ end
31
+
32
+ def ensure_writable
33
+ FileUtils.mkdir_p(output_path.parent)
34
+ fail ShelljectError, "Cannot save to #{output_path}" unless writable?
35
+ end
36
+
37
+ def writable?
38
+ output_path.parent.writable?
39
+ end
40
+
41
+ def ensure_readable
42
+ fail ShelljectError, "Cannot read file #{input_path}" unless readable?
43
+ end
44
+
45
+ def readable?
46
+ File.readable? input_path
47
+ end
48
+
49
+ def output_path
50
+ @output_path ||= save_directory.path_for name
51
+ end
52
+
53
+ def name
54
+ @name ||= File.basename(input_path)
55
+ end
56
+
57
+ def crypto
58
+ GPGME::Crypto.new always_trust: true
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,4 @@
1
+ # Provides the gem version.
2
+ module Shellject
3
+ VERSION = '0.1.0'
4
+ end
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'shellject/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'shellject'
8
+ spec.version = Shellject::VERSION
9
+ spec.authors = ['Sergei Matheson']
10
+ spec.email = ['sergei.matheson@gmail.com']
11
+
12
+ spec.summary = 'Secure storage and injection of environment variables.'
13
+ spec.description = 'Store your secret environment variables with GPGME, and inject them into your current shell when needed.'
14
+ spec.homepage = 'https://github.com/sergei-matheson/shellject'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.post_install_message = <<-eos
23
+ Shellject:
24
+ You can get instructions on how to setup your installation with `shellject setup`.
25
+ eos
26
+
27
+ spec.add_dependency 'gpgme'
28
+ spec.add_dependency 'clamp'
29
+
30
+ spec.add_development_dependency 'bundler', '~> 1.7'
31
+ spec.add_development_dependency 'rake', '~> 10.0'
32
+ spec.add_development_dependency 'pry', '~> 0.10'
33
+
34
+ spec.add_development_dependency 'reek'
35
+ spec.add_development_dependency 'rubocop'
36
+ spec.add_development_dependency 'rspec'
37
+ spec.add_development_dependency 'simplecov'
38
+ spec.add_development_dependency 'cane'
39
+
40
+ spec.add_development_dependency 'codeclimate-test-reporter'
41
+ end
metadata ADDED
@@ -0,0 +1,222 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shellject
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sergei Matheson
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-02-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gpgme
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: clamp
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.10'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.10'
83
+ - !ruby/object:Gem::Dependency
84
+ name: reek
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: cane
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: codeclimate-test-reporter
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Store your secret environment variables with GPGME, and inject them into
168
+ your current shell when needed.
169
+ email:
170
+ - sergei.matheson@gmail.com
171
+ executables:
172
+ - shellject
173
+ extensions: []
174
+ extra_rdoc_files: []
175
+ files:
176
+ - ".gitignore"
177
+ - ".rspec"
178
+ - ".travis.yml"
179
+ - CODE_OF_CONDUCT.md
180
+ - Gemfile
181
+ - LICENSE.txt
182
+ - README.md
183
+ - Rakefile
184
+ - bash/shellject_completion.sh
185
+ - bash/shellject_wrapper.sh
186
+ - bin/console
187
+ - bin/setup
188
+ - config.reek
189
+ - exe/shellject
190
+ - lib/shellject.rb
191
+ - lib/shellject/save_directory.rb
192
+ - lib/shellject/tasks/load.rb
193
+ - lib/shellject/tasks/save.rb
194
+ - lib/shellject/version.rb
195
+ - shellject.gemspec
196
+ homepage: https://github.com/sergei-matheson/shellject
197
+ licenses:
198
+ - MIT
199
+ metadata: {}
200
+ post_install_message: |
201
+ Shellject:
202
+ You can get instructions on how to setup your installation with `shellject setup`.
203
+ rdoc_options: []
204
+ require_paths:
205
+ - lib
206
+ required_ruby_version: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ required_rubygems_version: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ requirements: []
217
+ rubyforge_project:
218
+ rubygems_version: 2.4.5
219
+ signing_key:
220
+ specification_version: 4
221
+ summary: Secure storage and injection of environment variables.
222
+ test_files: []