Git Product home page Git Product logo

configurethis's Introduction

Build Status Code Climate Dependency Status

Configurethis

Clean up your configuration approach by using Configurethis. Configurethis allows you to access your config values using method names instead of string literals to identify which config value you want to retrieve.

Quick example

# lib/password_settings.rb
class PasswordSettings
  extend Configurethis
end

# some_ruby_file_in_my_app.rb
PasswordSettings.min_length        #=> 10
PasswordSettings.require_uppercase #=> true
PasswordSettings.storage.keep_last #=> 3
---
# config/password_settings.yml
minLength: 10
require_uppercase: true
storage:
  keep_last: 3

Why?

Typical Ruby code has craziness like this all over the place:

# config/initializers/load_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]

# application.rb
if APP_CONFIG['perform_authentication']
  # Do stuff
end

But that's just ugly. It relies on string literals, constants, and gets worse if you have multiple config values, or even nested config values for that matter. Configurethis makes your life better and your code healthier by avoiding literals, constants and makes it easy to setup multiple config files. All you need to do is define a Class to act as your configuration container object, create a matching YAML file, and then access your values as needed using method calls to your new Class!

# A cleaner way!
# config/initializers/configurethis.rb
Configurethis.root_path = File.join(Rails.root, "config")

# lib/password_settings.rb
class PasswordSettings
  extend Configurethis
end

# some_ruby_file_in_my_app.rb
PasswordSettings.min_length        #=> 10
PasswordSettings.require_uppercase #=> true
PasswordSettings.storage.keep_last #=> 3
---
# config/password_settings.yml
minLength: 10
require_uppercase: true
storage:
  keep_last: 3

Get started with Configurethis!

Add this line to your application's Gemfile:

gem 'configurethis'

And then execute:

$ bundle

Or install it yourself as:

$ gem install configurethis

How to?

Setup

To get started, specify where you want Configurethis to look for your .yml files at.

Configurethis.root_path = '/etc/my_app'

If you are using Configurethis in a Rails app, create an initializer for Configurethis and add the following:

# config/initializers/configurethis.rb
Configurethis.root_path = File.join(Rails.root, "config")

If your configuration is dependent on environment variables, you can specify it (Unfortunately at this time you need to do this once per each class that is environmentally dependent):

MyConfigurationClass.set_root = Rails.env

Creating a configuration

To turn your class into a configuration class, simply extend Configurethis

class MyRiakConfiguration
  extend Configurethis
end

And create a .yml file that matches your class name. In this case our .yml file would be named my_riak_configuration.yml: And it might contain something like this:

---
pb_port: 9002
http_port: 9000
host: 127.0.0.1
riak_control:
  cert: /opt/local/var/riak-1.2.0/riak.crt

Now you can access those values as methods off your configuration class.

MyRiakConfiguration.pb_port            #=> 9002
MyRiakConfiguration.http_port          #=> 9000
MyRiakConfiguration.riak_control.cert  #=> "/opt/local/var/riak-1.2.0/riak.crt"

Overriding

If you do not want your .yml file to follow convention, you can choose your own name.

class IWantToBeDifferent
  extend Configurethis
  configure_this_with 'my_configuration_file.yml'
end

Inspecting keys for a hash value

Sometimes you may want to iterate over the keys of a configured hash. You can do this by calling #keys on the hash to retrieve a list of the keys. For example, if your YAML is represented as:

---
bourbon:
  distillery:
    woodford:
      # more data on woodford
    buffalo_trace:
      # more stuff
    makers_mark:
      # makers stuff

And let's assume our configuration class is called BourbonConfig, we could retrieve a list of distilleries using #keys:

BourbonConfig.bourbon.distillery.keys #=> ["woodford", "buffalo_trace", "makers_mark"]

Validation

If you are having problems and everything "looks clear", try running your YAML through a YAML lint test. Ruby has been known to be forgiving to poorly formatted YAML in some versions, but not others.

Running the tests

Just run rspec from your prompt! The tests are also contain great examples about how to use Configurethis.

Testing

While working with Configurethis in your specs/tests you can override the configuration and avoid using the real configuration files to simulate behavior. This enables you to avoid using messing stubbing hierarchies and keep your tests clean!

Just pass a hash representing your configuration to #test_with.

# my_configuration.rb
class BourbonConfig
  extend Configurethis
end

# my_behavior_spec.rb
it "should do some drinking" do
  BourbonConfiguration.test_with({"bourbons" => {"Woodford" => "awesome", "Buffalo Trace" => "ok"} })
  expect( my_behavior.drink("Woodford") ).to eql("awesome") # => true
end

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

configurethis's People

Contributors

mattsnyder avatar

Watchers

James Cloos avatar

configurethis's Issues

License missing from gemspec

RubyGems.org doesn't report a license for your gem. This is because it is not specified in the gemspec of your last release.

via e.g.

spec.license = 'MIT'
# or
spec.licenses = ['MIT', 'GPL-2']

Including a license in your gemspec is an easy way for rubygems.org and other tools to check how your gem is licensed. As you can image, scanning your repository for a LICENSE file or parsing the README, and then attempting to identify the license or licenses is much more difficult and more error prone. So, even for projects that already specify a license, including a license in your gemspec is a good practice. See, for example, how rubygems.org uses the gemspec to display the rails gem license.

There is even a License Finder gem to help companies/individuals ensure all gems they use meet their licensing needs. This tool depends on license information being available in the gemspec. This is an important enough issue that even Bundler now generates gems with a default 'MIT' license.

I hope you'll consider specifying a license in your gemspec. If not, please just close the issue with a nice message. In either case, I'll follow up. Thanks for your time!

Appendix:

If you need help choosing a license (sorry, I haven't checked your readme or looked for a license file), GitHub has created a license picker tool. Code without a license specified defaults to 'All rights reserved'-- denying others all rights to use of the code.
Here's a list of the license names I've found and their frequencies

p.s. In case you're wondering how I found you and why I made this issue, it's because I'm collecting stats on gems (I was originally looking for download data) and decided to collect license metadata,too, and make issues for gemspecs not specifying a license as a public service :). See the previous link or my blog post aobut this project for more information.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.