dotenv-0.9.0/0000755000004100000410000000000012226077472013060 5ustar www-datawww-datadotenv-0.9.0/Changelog.md0000644000004100000410000000375712226077472015305 0ustar www-datawww-data# Changelog ## 0.9.0 - Aug 29, 2013 * Add support for variable expansion. HOST="example.com" URL="http://${USER}@${HOST}" ESCAPED_VARIABLE="this is \$NOT replaced" * Allow setting variables without a value. BLANK= * Add `dotenv` executable to load `.env` for other scripts. $ dotenv ./script.py [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.8.0...v0.9.0) ## 0.8.0 - June 12, 2013 * Added a capistrano recipe to symlink in `.env` on deploy. * Allow inline comments VARIABLE=value # this is a comment * Raises Dotenv::FormatError when parsing fails [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.7.0...v0.8.0) ## 0.7.0 - April 15, 2013 * Remove deprectated autoloading. Upgrade to 0.6 first and fix any warnings. * Add Dotenv.load! which raises Errno::ENOENT if the file does not exist [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.6.0...v0.7.0) ## 0.6.0 - Mar 22, 2013 * Add dotenv-rails gem for autoloading in a Rails app * Deprecated autoloading with plain dotenv gem * Support for double quotes A="some value" B="with \"escaped\" quotes" C="and newline\n expansion" * Support for pow-style variables prefixed with export export VARIABLE="some value" [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.5.0...v0.6.0) ## 0.5.0 - Jan 25, 2013 * Load immediately on require in Rails instead of waiting for initialization * Add YAML-style variables VARIABLE: some value [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.4.0...v0.5.0) ## 0.4.0 - Nov 13, 2012 * Add support for quoted options, e.g.: VARIABLE='some value' * Fix rake deprecation warnings [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.3.0...v0.4.0) ## 0.3.0 - Oct 25, 2012 * Avoid overriding existing ENV variables so values set before loading the app are maintained. [Full Changelog](https://github.com/bkeepers/dotenv/compare/v0.2.0...v0.3.0) dotenv-0.9.0/.travis.yml0000644000004100000410000000007212226077472015170 0ustar www-datawww-datalanguage: ruby rvm: - 2.0.0 - 1.9.3 - 1.8.7 - ree dotenv-0.9.0/LICENSE0000644000004100000410000000205712226077472014071 0ustar www-datawww-dataCopyright (c) 2012 Brandon Keepers MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.dotenv-0.9.0/README.md0000644000004100000410000000514112226077472014340 0ustar www-datawww-data# dotenv [![Build Status](https://secure.travis-ci.org/bkeepers/dotenv.png)](https://travis-ci.org/bkeepers/dotenv) Dotenv loads environment variables from `.env` into `ENV`. Storing [configuration in the environment](http://www.12factor.net/config) is one of the tenets of a [twelve-factor app](http://www.12factor.net/). Anything that is likely to change between deployment environments–such as resource handles for databases or credentials for external services–should be extracted from the code into environment variables. But it is not always practical to set environment variables on development machines or continuous integration servers where multiple projects are run. Dotenv load variables from a `.env` file into ENV when the environment is bootstrapped. ## Installation ### Rails Add this line to your application's Gemfile: ```ruby gem 'dotenv-rails', :groups => [:development, :test] ``` And then execute: $ bundle ### Sinatra or Plain ol' Ruby Install the gem: $ gem install dotenv As early as possible in your application bootstrap process, load `.env`: ```ruby require 'dotenv' Dotenv.load ``` To ensure `.env` is loaded in rake, load the tasks: ```ruby require 'dotenv/tasks' task :mytask => :dotenv do # things that require .env end ``` ## Usage Add your application configuration to your `.env` file in the root of your project: ```shell S3_BUCKET=YOURS3BUCKET SECRET_KEY=YOURSECRETKEYGOESHERE ``` You can also create files per environment, such as `.env.test`. ```shell S3_BUCKET=tests3bucket SECRET_KEY=testsecretkey ``` An alternate yaml-like syntax is supported: ```yaml S3_BUCKET: yamlstyleforyours3bucket SECRET_KEY: thisisalsoanokaysecret ``` Whenever your application loads, these variables will be available in `ENV`: ```ruby config.fog_directory = ENV['S3_BUCKET'] ``` ## Capistrano integration In your `config/deploy.rb` file: ```ruby require "dotenv/capistrano" ``` It will symlink the `.env` located in `/path/to/shared` in the new release. ## Should I commit my .env file? It is recommended that you store development-only settings in your `.env` file, and commit it to your repository. Make sure that all your credentials for your development environment are different from your other deployments. This makes it easy for other developers to get started on your project, without compromising your credentials for other environments. ## Contributing 1. Fork it 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Added some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create new Pull Request dotenv-0.9.0/.env0000644000004100000410000000001312226077472013643 0ustar www-datawww-dataDOTENV=truedotenv-0.9.0/Rakefile0000644000004100000410000000127412226077472014531 0ustar www-datawww-data#!/usr/bin/env rake require 'bundler/gem_helper' namespace 'dotenv' do Bundler::GemHelper.install_tasks :name => 'dotenv' end namespace 'dotenv-rails' do class DotenvRailsGemHelper < Bundler::GemHelper def guard_already_tagged; end # noop def tag_version; end # noop end DotenvRailsGemHelper.install_tasks :name => 'dotenv-rails' end task :build => ["dotenv:build", 'dotenv-rails:build'] task :install => ["dotenv:install", 'dotenv-rails:install'] task :release => ["dotenv:release", 'dotenv-rails:release'] require 'rspec/core/rake_task' desc "Run all specs" RSpec::Core::RakeTask.new(:spec) do |t| t.rspec_opts = %w[--color] t.verbose = false end task :default => :spec dotenv-0.9.0/spec/0000755000004100000410000000000012226077472014012 5ustar www-datawww-datadotenv-0.9.0/spec/dotenv_spec.rb0000644000004100000410000000413612226077472016654 0ustar www-datawww-datarequire 'spec_helper' describe Dotenv do shared_examples 'load' do context 'with no args' do let(:env_files) { [] } it 'defaults to .env' do Dotenv::Environment.should_receive(:new).with(expand('.env')). and_return(double(:apply => {})) subject end end context 'with a tilde path' do let(:env_files) { ['~/.env'] } it 'expands the path' do expected = expand("~/.env") File.stub(:exists?){ |arg| arg == expected } Dotenv::Environment.should_receive(:new).with(expected). and_return(double(:apply => {})) subject end end context 'with multiple files' do let(:env_files) { ['.env', fixture_path('plain.env')] } let(:expected) do { 'OPTION_A' => '1', 'OPTION_B' => '2', 'OPTION_C' => '3', 'OPTION_D' => '4', 'OPTION_E' => '5', 'DOTENV' => 'true' } end it 'loads all files' do subject expected.each do |key, value| expect(ENV[key]).to eq(value) end end it 'returns hash of loaded environments' do expect(subject).to eq(expected) end end end describe 'load' do subject { Dotenv.load(*env_files) } it_behaves_like 'load' context 'when the file does not exist' do let(:env_files) { ['.env_does_not_exist'] } it 'fails silently' do expect { subject }.not_to raise_error expect(ENV.keys).to eq(@env_keys) end end end describe 'load!' do subject { Dotenv.load!(*env_files) } it_behaves_like 'load' context 'when one file exists and one does not' do let(:env_files) { ['.env', '.env_does_not_exist'] } it 'raises an Errno::ENOENT error and does not load any files' do expect do expect do subject end.to raise_error(Errno::ENOENT) end.to_not change { ENV.keys } end end end def fixture_path(name) File.join(File.expand_path('../fixtures', __FILE__), name) end def expand(path) File.expand_path path end end dotenv-0.9.0/spec/spec_helper.rb0000644000004100000410000000031312226077472016625 0ustar www-datawww-datarequire 'dotenv' RSpec.configure do |config| # Restore the state of ENV after each spec config.before { @env_keys = ENV.keys } config.after { ENV.delete_if { |k,v| !@env_keys.include?(k) } } end dotenv-0.9.0/spec/fixtures/0000755000004100000410000000000012226077472015663 5ustar www-datawww-datadotenv-0.9.0/spec/fixtures/exported.env0000644000004100000410000000004712226077472020230 0ustar www-datawww-dataexport OPTION_A=2 export OPTION_B='\n' dotenv-0.9.0/spec/fixtures/plain.env0000644000004100000410000000007312226077472017500 0ustar www-datawww-dataOPTION_A=1 OPTION_B=2 OPTION_C= 3 OPTION_D =4 OPTION_E = 5 dotenv-0.9.0/spec/fixtures/quoted.env0000644000004100000410000000015012226077472017672 0ustar www-datawww-dataOPTION_A='1' OPTION_B='2' OPTION_C='' OPTION_D='\n' OPTION_E="1" OPTION_F="2" OPTION_G="" OPTION_H="\n" dotenv-0.9.0/spec/fixtures/yaml.env0000644000004100000410000000006612226077472017341 0ustar www-datawww-dataOPTION_A: 1 OPTION_B: '2' OPTION_C: '' OPTION_D: '\n' dotenv-0.9.0/spec/dotenv/0000755000004100000410000000000012226077472015311 5ustar www-datawww-datadotenv-0.9.0/spec/dotenv/environment_spec.rb0000644000004100000410000000713412226077472021221 0ustar www-datawww-datarequire 'spec_helper' describe Dotenv::Environment do subject { env("OPTION_A=1\nOPTION_B=2") } describe 'initialize' do it 'reads the file' do expect(subject['OPTION_A']).to eq('1') expect(subject['OPTION_B']).to eq('2') end it 'fails if file does not exist' do expect { Dotenv::Environment.new('.does_not_exists') }.to raise_error(Errno::ENOENT) end end describe 'apply' do it 'sets variables in ENV' do subject.apply expect(ENV['OPTION_A']).to eq('1') end it 'does not override defined variables' do ENV['OPTION_A'] = 'predefined' subject.apply expect(ENV['OPTION_A']).to eq('predefined') end end it 'parses unquoted values' do expect(env('FOO=bar')).to eql('FOO' => 'bar') end it 'parses values with spaces around equal sign' do expect(env("FOO =bar")).to eql('FOO' => 'bar') expect(env("FOO= bar")).to eql('FOO' => 'bar') end it 'parses double quoted values' do expect(env('FOO="bar"')).to eql('FOO' => 'bar') end it 'parses single quoted values' do expect(env("FOO='bar'")).to eql('FOO' => 'bar') end it 'parses escaped double quotes' do expect(env('FOO="escaped\"bar"')).to eql('FOO' => 'escaped"bar') end it 'parses empty values' do expect(env('FOO=')).to eql('FOO' => '') end it 'expands variables found in values' do expect(env("FOO=test\nBAR=$FOO")).to eql('FOO' => 'test', 'BAR' => 'test') end it 'parses variables wrapped in brackets' do expect(env("FOO=test\nBAR=${FOO}bar")).to eql('FOO' => 'test', 'BAR' => 'testbar') end it 'reads variables from ENV when expanding if not found in local env' do ENV['FOO'] = 'test' expect(env('BAR=$FOO')).to eql('BAR' => 'test') end it 'expands undefined variables to an empty string' do expect(env('BAR=$FOO')).to eql('BAR' => '') end it 'expands variables in quoted strings' do expect(env("FOO=test\nBAR='quote $FOO'")).to eql('FOO' => 'test', 'BAR' => 'quote test') end it 'does not expand escaped variables' do expect(env('FOO="foo\$BAR"')).to eql('FOO' => 'foo$BAR') expect(env('FOO="foo\${BAR}"')).to eql('FOO' => 'foo${BAR}') end it 'parses yaml style options' do expect(env('OPTION_A: 1')).to eql('OPTION_A' => '1') end it 'parses export keyword' do expect(env('export OPTION_A=2')).to eql('OPTION_A' => '2') end it 'expands newlines in quoted strings' do expect(env('FOO="bar\nbaz"')).to eql('FOO' => "bar\nbaz") end it 'parses varibales with "." in the name' do expect(env('FOO.BAR=foobar')).to eql('FOO.BAR' => 'foobar') end it 'strips unquoted values' do expect(env('foo=bar ')).to eql('foo' => 'bar') # not 'bar ' end it 'throws an error if line format is incorrect' do expect{env('lol$wut')}.to raise_error(Dotenv::FormatError) end it 'ignores empty lines' do expect(env("\n \t \nfoo=bar\n \nfizz=buzz")).to eql('foo' => 'bar', 'fizz' => 'buzz') end it 'ignores inline comments' do expect(env("foo=bar # this is foo")).to eql('foo' => 'bar') end it 'allows # in quoted value' do expect(env('foo="bar#baz" # comment')).to eql('foo' => 'bar#baz') end it 'ignores comment lines' do expect(env("\n\n\n # HERE GOES FOO \nfoo=bar")).to eql('foo' => 'bar') end it 'parses # in quoted values' do expect(env('foo="ba#r"')).to eql('foo' => 'ba#r') expect(env("foo='ba#r'")).to eql('foo' => 'ba#r') end require 'tempfile' def env(text) file = Tempfile.new('dotenv') file.write text file.close env = Dotenv::Environment.new(file.path) file.unlink env end end dotenv-0.9.0/bin/0000755000004100000410000000000012226077472013630 5ustar www-datawww-datadotenv-0.9.0/bin/dotenv0000755000004100000410000000020612226077472015053 0ustar www-datawww-data#!/usr/bin/env ruby require "dotenv" begin Dotenv.load! rescue Errno::ENOENT => e warn e.message exit 1 else exec *ARGV end dotenv-0.9.0/metadata.yml0000644000004100000410000000472712226077472015375 0ustar www-datawww-data--- !ruby/object:Gem::Specification name: dotenv version: !ruby/object:Gem::Version version: 0.9.0 prerelease: platform: ruby authors: - Brandon Keepers autorequire: bindir: bin cert_chain: [] date: 2013-08-29 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: rake requirement: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: rspec requirement: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' description: Loads environment variables from `.env`. email: - brandon@opensoul.org executables: - dotenv extensions: [] extra_rdoc_files: [] files: - .env - .gitignore - .travis.yml - Changelog.md - Gemfile - Guardfile - LICENSE - README.md - Rakefile - bin/dotenv - dotenv-rails.gemspec - dotenv.gemspec - lib/dotenv-rails.rb - lib/dotenv.rb - lib/dotenv/capistrano.rb - lib/dotenv/capistrano/recipes.rb - lib/dotenv/environment.rb - lib/dotenv/format_error.rb - lib/dotenv/railtie.rb - lib/dotenv/tasks.rb - lib/dotenv/version.rb - spec/dotenv/environment_spec.rb - spec/dotenv_spec.rb - spec/fixtures/exported.env - spec/fixtures/plain.env - spec/fixtures/quoted.env - spec/fixtures/yaml.env - spec/spec_helper.rb homepage: https://github.com/bkeepers/dotenv licenses: [] post_install_message: rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' required_rubygems_version: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' requirements: [] rubyforge_project: rubygems_version: 1.8.23 signing_key: specification_version: 3 summary: Loads environment variables from `.env`. test_files: - spec/dotenv/environment_spec.rb - spec/dotenv_spec.rb - spec/fixtures/exported.env - spec/fixtures/plain.env - spec/fixtures/quoted.env - spec/fixtures/yaml.env - spec/spec_helper.rb dotenv-0.9.0/Gemfile0000644000004100000410000000016012226077472014350 0ustar www-datawww-datasource 'https://rubygems.org' gemspec :name => 'dotenv' gem 'guard-rspec' gem 'guard-bundler' gem 'rb-fsevent' dotenv-0.9.0/dotenv.gemspec0000644000004100000410000000140712226077472015726 0ustar www-datawww-data# -*- encoding: utf-8 -*- require File.expand_path('../lib/dotenv/version', __FILE__) Gem::Specification.new do |gem| gem.version = Dotenv::VERSION gem.authors = ["Brandon Keepers"] gem.email = ["brandon@opensoul.org"] gem.description = %q{Loads environment variables from `.env`.} gem.summary = %q{Loads environment variables from `.env`.} gem.homepage = "https://github.com/bkeepers/dotenv" gem.files = `git ls-files`.split($\) gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) gem.name = "dotenv" gem.require_paths = ["lib"] gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec' end dotenv-0.9.0/Guardfile0000644000004100000410000000035112226077472014704 0ustar www-datawww-dataguard 'bundler' do watch('Gemfile') end guard 'rspec', :cli => '--color' do watch(%r{^spec/.+_spec\.rb$}) watch(%r{^spec/spec_helper.rb$}) { "spec" } watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } end dotenv-0.9.0/.gitignore0000644000004100000410000000007412226077472015051 0ustar www-datawww-data*.gem *.rbc .bundle .config .yardoc Gemfile.lock tmp vendor dotenv-0.9.0/lib/0000755000004100000410000000000012226077472013626 5ustar www-datawww-datadotenv-0.9.0/lib/dotenv.rb0000644000004100000410000000126512226077472015456 0ustar www-datawww-datarequire 'dotenv/environment' module Dotenv def self.load(*filenames) default_if_empty(filenames).inject({}) do |hash, filename| filename = File.expand_path filename hash.merge(File.exists?(filename) ? Environment.new(filename).apply : {}) end end # same as `load`, but raises Errno::ENOENT if any files don't exist def self.load!(*filenames) load( *default_if_empty(filenames).each do |filename| filename = File.expand_path filename raise(Errno::ENOENT.new(filename)) unless File.exists?(filename) end ) end protected def self.default_if_empty(filenames) filenames.empty? ? (filenames << '.env') : filenames end end dotenv-0.9.0/lib/dotenv/0000755000004100000410000000000012226077472015125 5ustar www-datawww-datadotenv-0.9.0/lib/dotenv/version.rb0000644000004100000410000000004612226077472017137 0ustar www-datawww-datamodule Dotenv VERSION = '0.9.0' end dotenv-0.9.0/lib/dotenv/tasks.rb0000644000004100000410000000017512226077472016602 0ustar www-datawww-datadesc 'Load environment settings from .env' task :dotenv do require 'dotenv' Dotenv.load end task :environment => :dotenvdotenv-0.9.0/lib/dotenv/capistrano.rb0000644000004100000410000000022512226077472017614 0ustar www-datawww-datarequire 'dotenv/capistrano/recipes' Capistrano::Configuration.instance(:must_exist).load do before "deploy:finalize_update", "dotenv:symlink" end dotenv-0.9.0/lib/dotenv/format_error.rb0000644000004100000410000000007112226077472020151 0ustar www-datawww-datamodule Dotenv class FormatError < SyntaxError end enddotenv-0.9.0/lib/dotenv/environment.rb0000644000004100000410000000370212226077472020020 0ustar www-datawww-datarequire 'dotenv/format_error' module Dotenv class Environment < Hash LINE = / \A (?:export\s+)? # optional export ([\w\.]+) # key (?:\s*=\s*|:\s+?) # separator ( # optional value begin '(?:\'|[^'])*' # single quoted value | # or "(?:\"|[^"])*" # double quoted value | # or [^#\n]+ # unquoted value )? # value end (?:\s*\#.*)? # optional comment \z /x VARIABLE = / (\\)? (\$) ( # collect braces with var for sub \{? # allow brace wrapping ([A-Z0-9_]+) # match the variable \}? # closing brace ) /xi def initialize(filename) @filename = filename load end def load read.each do |line| if match = line.match(LINE) key, value = match.captures value ||= '' # Remove surrounding quotes value = value.strip.sub(/\A(['"])(.*)\1\z/, '\2') if $1 == '"' value = value.gsub('\n', "\n") # Unescape all characters except $ so variables can be escaped properly value = value.gsub(/\\([^$])/, '\1') end # Process embedded variables value.scan(VARIABLE).each do |parts| if parts.first == '\\' replace = parts[1...-1].join('') else replace = self.fetch(parts.last) { ENV[parts.last] } end value = value.sub(parts[0...-1].join(''), replace || '') end self[key] = value elsif line !~ /\A\s*(?:#.*)?\z/ # not comment or blank line raise FormatError, "Line #{line.inspect} doesn't match format" end end end def read File.read(@filename).split("\n") end def apply each { |k,v| ENV[k] ||= v } end end end dotenv-0.9.0/lib/dotenv/capistrano/0000755000004100000410000000000012226077472017270 5ustar www-datawww-datadotenv-0.9.0/lib/dotenv/capistrano/recipes.rb0000644000004100000410000000043512226077472021251 0ustar www-datawww-dataCapistrano::Configuration.instance(:must_exist).load do _cset(:dotenv_path){ "#{shared_path}/.env" } namespace :dotenv do desc "Symlink shared .env to current release" task :symlink, roles: :app do run "ln -nfs #{dotenv_path} #{release_path}/.env" end end end dotenv-0.9.0/lib/dotenv/railtie.rb0000644000004100000410000000041712226077472017105 0ustar www-datawww-datarequire 'dotenv' module Dotenv class Railtie < Rails::Railtie rake_tasks do desc 'Load environment settings from .env' task :dotenv do Dotenv.load ".env.#{Rails.env}", '.env' end end end end Dotenv.load ".env.#{Rails.env}", '.env' dotenv-0.9.0/lib/dotenv-rails.rb0000644000004100000410000000003112226077472016554 0ustar www-datawww-datarequire 'dotenv/railtie' dotenv-0.9.0/dotenv-rails.gemspec0000644000004100000410000000107712226077472017041 0ustar www-datawww-data# -*- encoding: utf-8 -*- require File.expand_path('../lib/dotenv/version', __FILE__) Gem::Specification.new do |gem| gem.version = Dotenv::VERSION gem.authors = ["Brandon Keepers"] gem.email = ["brandon@opensoul.org"] gem.description = %q{Autoload dotenv in Rails.} gem.summary = %q{Autoload dotenv in Rails.} gem.homepage = "https://github.com/bkeepers/dotenv" gem.files = ["lib/dotenv-rails.rb"] gem.name = "dotenv-rails" gem.require_paths = ["lib"] gem.add_dependency 'dotenv', Dotenv::VERSION end