dotenvious 0.0.6 → 0.0.7

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
2
  SHA1:
3
- metadata.gz: 05b9cfc0c1060c40bfbbf274f483ae4d351991f6
4
- data.tar.gz: 1c9bc373c7b9f4f49300bbb1046f4abc71a635b5
3
+ metadata.gz: ab78cc6851361858979e2f864f6f7c50bc5265b3
4
+ data.tar.gz: 4ba12610eb2d596bd875b200d19e755ac21c9154
5
5
  SHA512:
6
- metadata.gz: e7b431f326f238f3212e7a2602f829c61c141c43412d9b13ed618af526719bb572f5fde8f54425cbacad9eb7e2d4b73a204a720d5e56a8db95ec6f2038f03d03
7
- data.tar.gz: 61213d32ed4d838ff06b5c261761a24eb4773a557a0d357a1b919c5ed3589b935befcac929735bbebd81d64cc8c07d25c84ddab4e8bfb9cca3a892963d33ff3c
6
+ metadata.gz: aa8135e30a38c0d91180866fa659f509cc56829e7e54302648de7d4438a2e7d32ceb1164892ad784590cc48957a9ce944e8ae09a85a249aa9714935906303856
7
+ data.tar.gz: 3a57368c0557b87a84fa983b39650233ecde8370c0e65457eb7290d4f22697a2cf2093d8f7da8c709649bd38d460130fa92bb92252eda33987607ad89db099a6
data/README.md CHANGED
@@ -39,25 +39,40 @@ First, add a `.envious` file to the root of your project. In the file, you can s
39
39
  Dotenvious::Configuration.new do |config|
40
40
 
41
41
  config.custom_variables = %w(VARIABLES WITH DIFFERENT VALUES)
42
-
42
+
43
43
  config.optional_variables = %w(VARIABLES YOU DONT NEED)
44
44
 
45
45
  end
46
46
 
47
- ```
47
+ ```
48
48
 
49
49
  These both need to be arrays.
50
50
 
51
51
  `dotenvious` will ignore the variables specified.
52
52
 
53
- ### Sorting
53
+ ### Additional Options
54
+
55
+ #### --sort
54
56
 
55
57
  Running `dotenvious --sort` will sort your `.env` file alphabetically.
56
58
 
57
- ## Future Work
59
+ #### --file
60
+
61
+ To select another example enironment file to use, add the optional flag `--file .env-example` or whatever your filename is.
58
62
 
63
+ This gem also works with `.yml` or `.yaml` files designed for CircleCI. To use a `.yaml` file of this style, it must have the format:
59
64
 
60
- - [ ] Ability to choose which development `.env-*` file to load from
65
+ ```
66
+ machine:
67
+ environment:
68
+ MY_ENV_VAR_1: "asdfghjk"
69
+ MY_ENV_VAR_2: "qwertyu"
70
+ ...
71
+ ```
72
+
73
+ Other configuration formats can be added in the future.
74
+
75
+ ## Future Work
61
76
 
62
77
  - [ ] Persist user's individual choices in a `.envious` file in directory after run
63
78
 
data/dotenvious.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'dotenvious'
3
- s.version = '0.0.6'
4
- s.date = '2017-01-08'
3
+ s.version = '0.0.7'
4
+ s.date = '2017-10-22'
5
5
  s.summary = "Dotenvious"
6
6
  s.description = "A Gem to manage environment variables"
7
7
  s.authors = ["Jake Faris"]
@@ -6,23 +6,24 @@ require_relative '../loaders/configuration'
6
6
  module Dotenvious
7
7
  module CLI
8
8
  class EnvFileConsolidator
9
- def initialize(options = {})
10
- @example_file = options[:example_file]
9
+ def initialize(example_file: DEFAULT_EXAMPLE_ENV_FILE, env_file: DEFAULT_ENV_FILE)
10
+ @example_file = example_file
11
+ @env_file = env_file
11
12
  end
12
13
 
13
14
  def run
14
15
  Loaders::Configuration.new.load
15
- Loaders::Environments.new({example_file: example_file}).load_environments
16
+ Loaders::Environments.new({example_file: example_file, env_file: env_file}).load_environments
16
17
  unless all_vars_present? && all_vars_match?
17
18
  alert_user
18
19
  decision = STDIN.gets.strip
19
- Prompter.run if decision.downcase == 'y'
20
+ Prompter.new(env_file).run if decision.downcase == 'y'
20
21
  end
21
22
  end
22
23
 
23
24
  private
24
25
 
25
- attr_reader :example_file, :filename
26
+ attr_reader :example_file, :env_file, :filename
26
27
 
27
28
  def alert_user
28
29
  puts "You have missing ENV variables. Examime them? [y/n]"
@@ -1,15 +1,21 @@
1
1
  module Dotenvious
2
2
  module CLI
3
3
  class EnvFileSorter
4
+ def initialize(filename = DEFAULT_ENV_FILE)
5
+ @filename = filename
6
+ end
7
+
4
8
  def run
5
- File.open('.env', 'w') do |file|
9
+ File.open(filename, 'w') do |file|
6
10
  file.write(sorted_env_text)
7
11
  end
8
- puts 'Your .env file is now neat and orderly. Enjoy!'
12
+ puts "Your #{filename} file is now neat and orderly. Enjoy!"
9
13
  end
10
14
 
11
15
  private
12
16
 
17
+ attr_reader :filename
18
+
13
19
  def sorted_env_text
14
20
  ENV.sort.map do |(key, value)|
15
21
  "#{key}=#{value}"
@@ -11,23 +11,35 @@ module Dotenvious
11
11
 
12
12
  def run
13
13
  parse_options
14
- EnvFileConsolidator.new({example_file: options[:file]}).run
15
- EnvFileSorter.new.run if options[:sort]
14
+ EnvFileConsolidator.new(file_options).run
15
+ EnvFileSorter.new(options[:env_file]).run if options[:sort]
16
16
  end
17
17
 
18
18
  private
19
19
 
20
20
  attr_accessor :options
21
+ attr_reader :file_options
22
+
23
+ def file_options
24
+ @file_options ||= Hash.new.tap do |hash|
25
+ hash[:example_file] = options[:example_file] if options.key?(:example_file)
26
+ hash[:env_file] = options[:env_file] if options.key?(:env_file)
27
+ end
28
+ end
21
29
 
22
30
  def parse_options
23
31
  parser = OptionParser.new do |opts|
24
32
  opts.banner = "How to use Dotenvious:"
25
33
 
26
- opts.on('-f .example-environment-file', '--file .example-environment-file', 'Specify which example file to use') do |file|
27
- options[:file] = file
34
+ opts.on('-x .example-env-file', '--example .example-env-file', 'Specify which example file to use') do |file|
35
+ options[:example_file] = file
36
+ end
37
+
38
+ opts.on('-f .env-file', '--file .env-file', 'Specify which file to write to') do |file|
39
+ options[:env_file] = file
28
40
  end
29
41
 
30
- opts.on('-s', '--sort', 'Sort .env file by key names alphabetically') do
42
+ opts.on('-s', '--sort', 'Sort env file by key names alphabetically') do
31
43
  options[:sort] = true
32
44
  end
33
45
 
@@ -1,15 +1,20 @@
1
1
  module Dotenvious
2
2
  class EnvAppender
3
+ def initialize(filename)
4
+ @filename = filename
5
+ end
6
+
3
7
  def append(key)
4
8
  env.write("#{key}=#{ENV_EXAMPLE[key]}\n")
9
+ env.close
5
10
  end
6
11
 
7
12
  private
8
13
 
9
- attr_reader :env
14
+ attr_reader :env, :filename
10
15
 
11
16
  def env
12
- @env ||= File.open('.env', 'a+')
17
+ @env ||= File.open(filename, 'a+')
13
18
  end
14
19
  end
15
20
  end
@@ -6,17 +6,18 @@ module Dotenvious
6
6
  class Environments
7
7
  def initialize(options = {})
8
8
  @example_file = options[:example_file] || DEFAULT_EXAMPLE_ENV_FILE
9
+ @env_file = options[:env_file] || DEFAULT_ENV_FILE
9
10
  end
10
11
 
11
12
  def load_environments
12
- ENV.merge!(DotenvFile.load_from('.env'))
13
+ ENV.merge!(DotenvFile.load_from(env_file))
13
14
  environment_loader = example_file.match(/\.ya?ml/) ? YamlFile : DotenvFile
14
15
  ENV_EXAMPLE.merge!(environment_loader.load_from(example_file))
15
16
  end
16
17
 
17
18
  private
18
19
 
19
- attr_reader :example_file
20
+ attr_reader :example_file, :env_file
20
21
  end
21
22
  end
22
23
  end
@@ -5,47 +5,53 @@ require_relative 'env_appender'
5
5
 
6
6
  module Dotenvious
7
7
  class Prompter
8
- def self.run
8
+ def initialize(filename = DEFAULT_ENV_FILE)
9
+ @filename = filename
10
+ end
11
+
12
+ def run
9
13
  keys_in_question.each do |key, status|
10
14
  decision = prompt(key, status)
11
15
  return if decision == 'q'
12
16
  next unless decision.downcase == 'y'
13
17
 
14
18
  if status == 'missing'
15
- EnvAppender.new.append(key)
19
+ EnvAppender.new(filename).append(key)
16
20
  elsif status == 'mismatched'
17
- ValueReplacer.new.replace(key)
21
+ ValueReplacer.new(filename).replace(key)
18
22
  end
19
23
  end
20
24
  end
21
25
 
22
26
  private
23
27
 
24
- def self.keys_in_question
28
+ attr_reader :filename
29
+
30
+ def keys_in_question
25
31
  missing_keys = missing_vars.zip(['missing'] * missing_vars.length)
26
32
  mismatched_keys = mismatched_vars.zip(['mismatched'] * mismatched_vars.length)
27
33
  missing_keys + mismatched_keys
28
34
  end
29
35
 
30
- def self.missing_vars
36
+ def missing_vars
31
37
  MissingVariableFinder.missing_required_vars
32
38
  end
33
39
 
34
- def self.mismatched_vars
40
+ def mismatched_vars
35
41
  MismatchedVariableFinder.mismatched_vars
36
42
  end
37
43
 
38
- def self.prompt(var, status)
44
+ def prompt(var, status)
39
45
  send(:"display_#{status}_output", var)
40
46
  STDIN.gets.strip
41
47
  end
42
48
 
43
- def self.display_missing_output(var)
49
+ def display_missing_output(var)
44
50
  puts "#{var}=#{ENV_EXAMPLE[var]}"
45
- puts "Add to .env? [y/n/q]"
51
+ puts "Add to #{filename}? [y/n/q]"
46
52
  end
47
53
 
48
- def self.display_mismatched_output(var)
54
+ def display_mismatched_output(var)
49
55
  puts "ENV[#{var}] is set to: #{ENV[var]}"
50
56
  puts "Example [#{var}] is set to: #{ENV_EXAMPLE[var]}"
51
57
  puts "Replace with the example value? [y/n/q]"
@@ -1,24 +1,29 @@
1
1
  module Dotenvious
2
2
  class ValueReplacer
3
+ def initialize(filename)
4
+ @filename = filename
5
+ end
6
+
3
7
  def replace(key)
4
8
  line_number = base_env.find_index do |line|
5
9
  line.match(/^#{key}=/)
6
10
  end
7
11
  updated_env = base_env.dup
8
12
  updated_env[line_number] = "#{key}=#{ENV_EXAMPLE[key]}"
9
- env_writer.write(updated_env.join("\n"))
13
+ env_writer.write(updated_env.join("\n") + "\n")
14
+ env_writer.close
10
15
  end
11
16
 
12
17
  private
13
18
 
14
- attr_reader :base_env
19
+ attr_reader :base_env, :filename
15
20
 
16
21
  def base_env
17
- @base_env ||= File.read('.env').split("\n")
22
+ @base_env ||= File.read(filename).split("\n")
18
23
  end
19
24
 
20
25
  def env_writer
21
- File.open('.env', 'w')
26
+ @env_writer ||= File.open(filename, 'w')
22
27
  end
23
28
  end
24
29
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Dotenvious::CLI::EnvFileConsolidator do
4
4
  describe '.new' do
5
5
  it 'takes option hash' do
6
- expect { described_class.new({example_file: '.envenvenv'}) }.to_not raise_error
6
+ expect { described_class.new({example_file: '.envenvenv', env_file: '.env'}) }.to_not raise_error
7
7
  end
8
8
  end
9
9
 
@@ -23,9 +23,11 @@ describe Dotenvious::CLI::EnvFileConsolidator do
23
23
  context 'and the user wants to append them' do
24
24
  it 'begins the Prompter' do
25
25
  io_object = double
26
+ prompter = double
26
27
  expect(STDIN).to receive(:gets).and_return('y')
27
28
  expect_any_instance_of(described_class).to receive(:all_vars_present?).and_return false
28
- expect(Dotenvious::Prompter).to receive(:run)#.and_return false
29
+ expect(Dotenvious::Prompter).to receive(:new).and_return prompter
30
+ expect(prompter).to receive(:run)
29
31
  described_class.new.run
30
32
  end
31
33
  end
@@ -56,7 +58,7 @@ describe Dotenvious::CLI::EnvFileConsolidator do
56
58
  it 'loads environments with that example_file' do
57
59
  environments_double = double
58
60
  expect(Dotenvious::Loaders::Environments).to receive(:new)
59
- .with({example_file: '.test.env.test'}).and_return(environments_double)
61
+ .with({example_file: '.test.env.test', env_file: '.env'}).and_return(environments_double)
60
62
  expect(environments_double).to receive(:load_environments)
61
63
 
62
64
  described_class.new({example_file: '.test.env.test'}).run
@@ -41,9 +41,9 @@ describe Dotenvious::CLI::Main do
41
41
  end
42
42
  end
43
43
 
44
- context '--file' do
44
+ context '--example' do
45
45
  before do
46
- stub_const('ARGV', ['--file', '.my-test-file-env'])
46
+ stub_const('ARGV', ['--example', '.my-test-file-env'])
47
47
  end
48
48
 
49
49
  it 'uses the user-specified filename to read example environment' do
@@ -56,6 +56,22 @@ describe Dotenvious::CLI::Main do
56
56
  described_class.new.run
57
57
  end
58
58
  end
59
+
60
+ context '--file' do
61
+ before do
62
+ stub_const('ARGV', ['--file', '.my-env'])
63
+ end
64
+
65
+ it 'uses the user-specified filename to read example environment' do
66
+ fake_consolidator = double
67
+ expect(fake_consolidator).to receive(:run)
68
+ expect(Dotenvious::CLI::EnvFileConsolidator).to receive(:new)
69
+ .with({env_file: '.my-env'})
70
+ .and_return(fake_consolidator)
71
+
72
+ described_class.new.run
73
+ end
74
+ end
59
75
  end
60
76
  end
61
77
  end
@@ -9,11 +9,12 @@ describe Dotenvious::EnvAppender do
9
9
  it 'appends the value to the end of the .env file' do
10
10
  env_double = double('File', write: nil)
11
11
  expect(env_double).to receive(:write).with("test2=example2\n")
12
+ expect(env_double).to receive(:close)
12
13
  expect(File).to receive(:open).
13
- with('.env', 'a+').once.
14
+ with('.big-ol-env', 'a+').once.
14
15
  and_return(env_double)
15
16
 
16
- described_class.new.append('test2')
17
+ described_class.new('.big-ol-env').append('test2')
17
18
  end
18
19
  end
19
20
  end
@@ -11,22 +11,29 @@ describe Dotenvious::Prompter do
11
11
  it 'prompts the user to add every missing or mismatched variable do' do
12
12
  expect(STDIN).to receive(:gets).twice.and_return('n')
13
13
 
14
- described_class.run
14
+ described_class.new.run
15
15
  end
16
16
 
17
17
  it 'appends the vars to .env' do
18
18
  expect(STDIN).to receive(:gets).twice.and_return('y','n')
19
+ file_double = double
20
+ expect(file_double).to receive(:write).with("test2=\n")
21
+ expect(file_double).to receive(:close)
22
+
19
23
  expect(File).to receive(:open).
20
24
  with('.env', 'a+').once.
21
- and_return(double('File', write: nil))
25
+ and_return(file_double)
22
26
 
23
- described_class.run
27
+ described_class.new.run
24
28
  end
25
29
 
26
30
  it 'quits out if the user presses q' do
27
31
  expect(STDIN).to receive(:gets).once.and_return('q')
28
32
 
29
- described_class.run
33
+ described_class.new.run
34
+ end
35
+
36
+ xit 'given missing and different args, appends/rewrites correctly into env' do
30
37
  end
31
38
  end
32
39
  end
@@ -3,21 +3,25 @@ require 'spec_helper'
3
3
  describe Dotenvious::ValueReplacer do
4
4
  describe '#replace' do
5
5
  before do
6
- stub_const('Dotenvious::ENV_EXAMPLE', {'fake' => 'correct'} )
6
+ stub_const('Dotenvious::ENV_EXAMPLE', example_const )
7
7
  end
8
- it "replaces the key's value in .env if user presses yes" do
9
- expect(File).to receive(:read).
10
- with('.env').
11
- and_return("test=1234\nfake=missing")
8
+ context 'given a key with a different value' do
9
+ let(:example_const) { {'fake' => 'correct'} }
10
+ it "replaces the key's value in .env if user presses yes" do
11
+ expect(File).to receive(:read).
12
+ with('.big-ol-env').
13
+ and_return("test=1234\nfake=missing")
12
14
 
13
- env_double = double('File', write: nil)
14
- expect(env_double).to receive(:write).with("test=1234\nfake=correct")
15
+ env_double = double('File', write: nil)
16
+ expect(env_double).to receive(:write).with("test=1234\nfake=correct\n")
17
+ expect(env_double).to receive(:close)
15
18
 
16
- expect(File).to receive(:open).
17
- with('.env', 'w').
18
- and_return(env_double)
19
+ expect(File).to receive(:open).
20
+ with('.big-ol-env', 'w').
21
+ and_return(env_double)
19
22
 
20
- described_class.new.replace('fake')
23
+ described_class.new('.big-ol-env').replace('fake')
24
+ end
21
25
  end
22
26
  end
23
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dotenvious
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Faris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-08 00:00:00.000000000 Z
11
+ date: 2017-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler