config_module 1.2.2 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c659612630af7af88191a53d41f67505aeab718ff20048e351af9f62a56f6719
4
- data.tar.gz: 2efa5cb28e6658f14efb5de8c1cf975dc77c9862f262aae6b151f7a0fd540d63
3
+ metadata.gz: 04d4f6c816e394924d4d3e833ef2d3c8be39cc6048a1167dca507761c6f965db
4
+ data.tar.gz: b782426dd752d18ed5ca2a8a6ec2f8c98998156d6fd2b5807cea0f7eebf629fd
5
5
  SHA512:
6
- metadata.gz: be3fce66346dae46f5390526c1dc383111b9cf63246946d639d32fa0c4b4726e00ec69b914b988fbb3e931ef788f911c5bb6fea0ed316bedd7e13216085c7c13
7
- data.tar.gz: feb89b0f8dfe9cad75297f99dabb0902a279b094710dfd68e589825bb0988c376319cb0600c0bd3b20f1be26e5f5f1da987103967c376826aa6cd198587489d3
6
+ metadata.gz: b12be1b132e0e47a3a80f1bde3ae177e1f8ad7f73edd9228ad3c2830e706189571104ae0768b0c5fa53b986f444894dde2b9a6e34a8b1a93b1ddf0ddcd68f32f
7
+ data.tar.gz: 53678ce655a23c423bad46535a774075a8ecb5483ef9237677d3e0484a5a500884391a11beab622c0d2e1915205cd7530379581d1e5428ed61c23bd14e0bf437
@@ -0,0 +1,23 @@
1
+ # Ruby CircleCI 2.0 configuration file
2
+ #
3
+ # Check https://circleci.com/docs/2.0/language-ruby/ for more details
4
+ #
5
+ version: 2
6
+ jobs:
7
+ build:
8
+ docker:
9
+ # specify the version you desire here
10
+ - image: circleci/ruby:2.6
11
+
12
+ working_directory: ~/repo
13
+
14
+ steps:
15
+ - checkout
16
+ - run:
17
+ name: install dependencies
18
+ command: |
19
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
20
+ - run:
21
+ name: run tests
22
+ command:
23
+ bundle exec uspec
data/.codeclimate.yml CHANGED
@@ -7,6 +7,7 @@ engines:
7
7
  - ruby
8
8
  rubocop:
9
9
  enabled: true
10
+ channel: rubocop-0-50
10
11
  reek:
11
12
  enabled: true
12
13
  ratings:
data/.gitlab-ci.yml ADDED
@@ -0,0 +1,2 @@
1
+ include:
2
+ template: Dependency-Scanning.gitlab-ci.yml
data/.rubocop.yml ADDED
@@ -0,0 +1,50 @@
1
+ # Rubocop override settings
2
+
3
+ AllCops:
4
+ TargetRubyVersion: 2.0
5
+
6
+ Metrics/LineLength:
7
+ Max: 120
8
+ Exclude:
9
+ - config_module.gemspec
10
+ - "uspec/**/*"
11
+
12
+ Naming/PredicateName:
13
+ Enabled: false
14
+
15
+ Style/PreferredHashMethods:
16
+ Exclude:
17
+ - "**/*"
18
+
19
+ Style/Documentation:
20
+ Enabled: false
21
+
22
+ Style/MethodDefParentheses:
23
+ Enabled: false
24
+
25
+ Style/ParallelAssignment:
26
+ Enabled: false
27
+
28
+ Style/SingleLineMethods:
29
+ Enabled: false
30
+
31
+ Style/Alias:
32
+ Enabled: false
33
+
34
+ Style/CaseEquality:
35
+ Enabled: false
36
+
37
+ Style/SymbolArray:
38
+ Enabled: false
39
+
40
+ Bundler/OrderedGems:
41
+ Enabled: false
42
+
43
+ Style/StringLiterals:
44
+ EnforcedStyle: double_quotes
45
+
46
+ Style/StringLiteralsInInterpolation:
47
+ EnforcedStyle: double_quotes
48
+
49
+ Layout/AccessModifierIndentation:
50
+ EnforcedStyle: outdent
data/.travis.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.6
3
4
  - 2.5
4
5
  - 2.4
5
6
  - 2.3
@@ -8,19 +9,19 @@ rvm:
8
9
  - 2.0
9
10
 
10
11
  - ruby-head
11
- - jruby-9.1.6.0
12
+ - jruby-9.2.7.0
12
13
  - jruby-21mode
13
14
 
14
15
  matrix:
15
16
  allow_failures:
16
17
  - rvm: ruby-head
17
- - rvm: jruby-9.1.6.0
18
+ - rvm: jruby-9.2.7.0
18
19
  - rvm: jruby-21mode
19
20
 
20
21
  sudo: false
21
22
 
22
23
  before_install:
23
- - gem update bundler
24
+ - which bundle || gem install bundler
24
25
  before_script:
25
26
  - bundle exec gem list
26
27
  script: bundle exec uspec
data/Gemfile CHANGED
@@ -1,23 +1,33 @@
1
- source 'https://rubygems.org'
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in config_module.gemspec
4
6
  gemspec
5
7
 
6
- if ENV['CI'] == 'true' then
8
+ if ENV["CI"] == "true"
7
9
  group :test do
8
- gem 'simplecov'
9
- gem 'codeclimate-test-reporter', '~> 1.0.0'
10
+ gem "simplecov"
11
+ gem "codeclimate-test-reporter", "~> 1.0.0"
10
12
  end
11
13
  else
12
14
  group :development do
13
- gem 'travis'
15
+ gem "travis"
16
+
17
+ if RUBY_VERSION.to_f < 2.2
18
+ byebug_version = "~> 9.0.6"
19
+ elsif RUBY_VERSION.to_f < 2.3
20
+ byebug_version = "~> 10.0.2"
21
+ elsif RUBY_VERSION.to_f < 2.4
22
+ byebug_version = "< 12"
23
+ end
24
+ gem "byebug", byebug_version
14
25
 
15
- gem 'pry'
16
- gem 'pry-doc'
17
- gem 'pry-theme'
18
- gem 'pry-rescue'
19
- gem 'pry-byebug'
20
- gem 'pry-coolline'
21
- gem 'pry-stack_explorer'
26
+ gem "pry"
27
+ gem "pry-doc"
28
+ gem "pry-theme"
29
+ gem "pry-rescue"
30
+ gem "pry-byebug"
31
+ gem "pry-coolline"
22
32
  end
23
33
  end
data/README.markdown CHANGED
@@ -8,9 +8,9 @@ Reference documentation for the [Latest Released](http://rubydoc.info/gems/confi
8
8
  [![Gem Version](https://img.shields.io/gem/v/config_module.svg)](https://rubygems.org/gems/config_module)
9
9
  [![Gem Downloads](https://img.shields.io/gem/dt/config_module.svg?maxAge=2592000)](https://rubygems.org/gems/config_module)
10
10
  [![Build Status](https://travis-ci.org/acook/config_module.svg?branch=master)](https://travis-ci.org/acook/config_module)
11
+ [![CircleCI](https://circleci.com/gh/acook/config_module.svg?style=svg)](https://circleci.com/gh/acook/config_module)
11
12
  [![Code Climate](https://codeclimate.com/github/acook/config_module/badges/gpa.svg)](https://codeclimate.com/github/acook/config_module)
12
13
  [![Test Coverage](https://codeclimate.com/github/acook/config_module/badges/coverage.svg)](https://codeclimate.com/github/acook/config_module/coverage)
13
- [![Dependency Status](https://gemnasium.com/badges/github.com/acook/config_module.svg)](https://gemnasium.com/github.com/acook/config_module)
14
14
 
15
15
  Installation
16
16
  ------------
data/Rakefile CHANGED
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
@@ -1,22 +1,24 @@
1
- # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'config_module/version'
5
+ require "config_module/version"
5
6
 
6
7
  Gem::Specification.new do |gem|
7
- gem.name = 'config_module'
8
- gem.version = ConfigModule::VERSION
9
- gem.authors = ['Anthony M. Cook']
10
- gem.email = ['github@anthonymcook.com']
11
- gem.description = %q{Wrap a configuration file in a module for easy use throughout your application. Inspired by Rails.}
12
- gem.summary = %q{Load important configuration files into their own modules!}
13
- gem.homepage = 'http://github.com/acook/config_module'
14
- gem.licenses = %w{MIT LGPL-3}
8
+ gem.name = "config_module"
9
+ gem.version = ConfigModule::VERSION
10
+ gem.authors = ["Anthony M. Cook"]
11
+ gem.email = ["github@anthonymcook.com"]
12
+ gem.description =
13
+ "Wrap a configuration file in a module for easy use throughout your application. Inspired by Rails."
14
+ gem.summary = "Load important configuration files into their own modules!"
15
+ gem.homepage = "http://github.com/acook/config_module"
16
+ gem.licenses = %w[MIT LGPL-3.0]
15
17
 
16
- gem.files = `git ls-files`.split($/)
17
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
- gem.require_paths = ['lib']
18
+ gem.files = `git ls-files`.split($/)
19
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
20
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
+ gem.require_paths = ["lib"]
20
22
 
21
- gem.add_development_dependency 'uspec'
23
+ gem.add_development_dependency "uspec", "~> 0.1.0"
22
24
  end
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ConfigModule
2
4
  class ConfigHelper
3
- attr :raw_config
4
- attr_accessor :config_file, :namespaces
5
+ attr_reader :raw_config
6
+ attr_accessor :config_file
7
+ attr_writer :namespaces
5
8
 
6
9
  def config
7
10
  @config ||= ConfigOption.wrap load_config
@@ -10,7 +13,7 @@ module ConfigModule
10
13
  def method_missing_handler name, source, *args, &block
11
14
  ConfigOption.wrap config.send(name, *args, &block)
12
15
  rescue NoMethodError => error
13
- if error.name == name then
16
+ if error.name == name
14
17
  raise(
15
18
  ConfigOption::NotFoundError.new(name, self, error),
16
19
  error.message, source
@@ -20,7 +23,11 @@ module ConfigModule
20
23
  end
21
24
  end
22
25
 
23
- def field_lookup_handler name, source, *args, &block
26
+ def respond_to_missing_handler name, include_all
27
+ config.send(:respond_to_missing?, name, include_all)
28
+ end
29
+
30
+ def field_lookup_handler name, _source, *_args, &_block
24
31
  config[name]
25
32
  end
26
33
 
@@ -31,7 +38,7 @@ module ConfigModule
31
38
  end
32
39
 
33
40
  def load_namespaces_from tree
34
- namespaces.inject(ConfigOption.wrap tree) do |subtree, ns|
41
+ namespaces.inject(ConfigOption.wrap(tree)) do |subtree, ns|
35
42
  if ConfigOption === subtree && ns.respond_to?(:to_sym) && subtree.has_key?(ns)
36
43
  ConfigOption.wrap subtree[ns]
37
44
  else
@@ -41,7 +48,7 @@ module ConfigModule
41
48
  )
42
49
  end
43
50
  end
44
- rescue TypeError => error
51
+ rescue TypeError
45
52
  raise(
46
53
  InvalidNamespaceError.new(namespaces.first, self, caller),
47
54
  "Namespace must be a string or symbol, instead it was: #{namespaces.first.class}", caller(6)
@@ -49,7 +56,7 @@ module ConfigModule
49
56
  end
50
57
 
51
58
  def namespaces
52
- @namespaces ||= Array.new
59
+ @namespaces ||= []
53
60
  end
54
61
  end
55
62
  end
@@ -1,32 +1,51 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ConfigModule
2
4
  class ConfigOption < OpenStruct
3
5
  include Enumerable
4
6
 
5
7
  def self.wrap data
6
- if data.is_a? Hash then
7
- ConfigOption.new data
8
+ if data.is_a? Hash
9
+ new data
8
10
  else
9
11
  data
10
12
  end
11
13
  end
12
14
 
13
- def each
14
- return to_enum __method__ unless block_given?
15
- @table.each_pair{|p| yield p}
15
+ def each_pair
16
+ return to_enum(__method__) { @table.size } unless block_given?
17
+ @table.each_pair { |pair| yield pair }
18
+ self
19
+ end
20
+ alias each each_pair
21
+
22
+ def each_key
23
+ return to_enum(__method__) { @table.size } unless block_given?
24
+ @table.each_key { |key| yield key }
25
+ self
26
+ end
27
+
28
+ def each_value
29
+ return to_enum(__method__) { @table.size } unless block_given?
30
+ @table.each_value { |value| yield value }
31
+ self
16
32
  end
17
33
 
18
- def [] name
19
- @table[name.to_sym]
34
+ unless public_instance_method :[]
35
+ def [] name
36
+ @table[name.to_sym]
37
+ end
20
38
  end
21
39
 
22
40
  def has_key? key
23
41
  @table.has_key? key.to_sym
24
42
  end
43
+ alias key? has_key?
25
44
 
26
45
  def method_missing name, *args, &block
27
46
  result = super
28
47
 
29
- if result || @table.has_key?(name) then
48
+ if result || @table.has_key?(name)
30
49
  self.class.wrap result
31
50
  else
32
51
  raise(
@@ -34,7 +53,6 @@ module ConfigModule
34
53
  "Key not found: #{name}", caller(3)
35
54
  )
36
55
  end
37
-
38
56
  rescue NoMethodError => error
39
57
  raise(
40
58
  ConfigOption::NotFoundError.new(name, self, error),
@@ -42,13 +60,35 @@ module ConfigModule
42
60
  )
43
61
  end
44
62
 
45
- def new_ostruct_member name
46
- name = name.to_sym
47
- unless respond_to? name
48
- define_singleton_method(name) { self.class.wrap @table[name] }
49
- define_singleton_method("#{name}=") { |x| modifiable[name] = x }
63
+ def respond_to_missing? name, include_all
64
+ @table.has_key?(name) || super
65
+ end
66
+ private :respond_to_missing?
67
+
68
+ if private_instance_methods.include? :new_ostruct_member!
69
+ # :reek:TooManyStatements { max_statements: 10 }
70
+ def new_ostruct_member! name
71
+ name = name.to_sym
72
+ unless singleton_class.method_defined? name
73
+ define_singleton_method(name) { self.class.wrap @table[name] }
74
+ define_singleton_method("#{name}=") { |val| modifiable[name] = val }
75
+ end
76
+ name
77
+ end
78
+ private :new_ostruct_member!
79
+ alias new_ostruct_member new_ostruct_member! # :nodoc:
80
+ protected :new_ostruct_member
81
+ elsif instance_methods.include? :new_ostruct_member
82
+ # :reek:TooManyStatements { max_statements: 10 }
83
+ def new_ostruct_member name
84
+ name = name.to_sym
85
+ unless respond_to? name
86
+ define_singleton_method(name) { self.class.wrap @table[name] }
87
+ define_singleton_method("#{name}=") { |val| modifiable[name] = val }
88
+ end
89
+ name
50
90
  end
51
- name
91
+ protected :new_ostruct_member
52
92
  end
53
93
 
54
94
  class NotFoundError < ::ConfigModule::ConfigError
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ConfigModule
2
4
  class ConfigError < NoMethodError
3
5
  def initialize name, object, details = nil
4
6
  @name, @object, @details = name, object, details
5
7
  @custom_message = "invalid #{identifier} `#{name}' for #{object_info}"
6
8
  end
7
- attr :name, :object, :details
9
+ attr_reader :name, :object, :details
8
10
 
9
11
  def custom_message
10
12
  @custom_message + "\n#{super_message}"
@@ -14,7 +16,7 @@ module ConfigModule
14
16
  alias_method :message, :custom_message
15
17
 
16
18
  def object_info
17
- if object.is_a?(Class) then
19
+ if object.is_a?(Class)
18
20
  object.name
19
21
  else
20
22
  "instance of `#{object.class} < #{object.class.superclass}'"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ConfigModule
2
- VERSION = '1.2.2'
4
+ VERSION = "1.2.3".freeze
3
5
  end
data/lib/config_module.rb CHANGED
@@ -1,10 +1,12 @@
1
- require 'ostruct'
2
- require 'yaml'
1
+ # frozen_string_literal: true
3
2
 
4
- require_relative 'config_module/version'
5
- require_relative 'config_module/exceptions'
6
- require_relative 'config_module/config_option'
7
- require_relative 'config_module/config_helper'
3
+ require "ostruct"
4
+ require "yaml"
5
+
6
+ require_relative "config_module/version"
7
+ require_relative "config_module/exceptions"
8
+ require_relative "config_module/config_option"
9
+ require_relative "config_module/config_helper"
8
10
 
9
11
  module ConfigModule
10
12
  def [] key, *args
@@ -35,7 +37,13 @@ private
35
37
  @__config_module_helper ||= ConfigHelper.new
36
38
  end
37
39
 
40
+ # rubocop:disable Style/MethodMissing
38
41
  def method_missing name, *args, &block
39
- __config_module_helper.method_missing_handler name, caller(1), *args
42
+ __config_module_helper.method_missing_handler name, caller(1), *args, &block
43
+ end
44
+ # rubocop:enable Style/MethodMissing
45
+
46
+ def respond_to_missing? name, include_all
47
+ __config_module_helper.respond_to_missing_handler(name, include_all) || super
40
48
  end
41
49
  end
@@ -1,12 +1,14 @@
1
- require_relative 'spec_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "spec_helper"
2
4
 
3
5
  helper = ConfigModule::ConfigHelper.new
4
- helper.config_file = './config/example.yml'
6
+ helper.config_file = "./config/example.yml"
5
7
 
6
- spec 'method_missing_handler traces back to the caller' do
8
+ spec "method_missing_handler traces back to the caller" do
7
9
  begin
8
10
  helper.method_missing_handler :nonexistant, caller(1)
9
11
  rescue NoMethodError => error
10
- error.backtrace.to_s.include? "spec/config_helper_spec.rb:6:in"
12
+ error.backtrace.to_s.include?("spec/config_helper_spec.rb:8:in") || error.backtrace
11
13
  end
12
14
  end
@@ -1,56 +1,78 @@
1
- require_relative 'spec_helper'
2
- require_relative 'example_config'
1
+ # frozen_string_literal: true
3
2
 
4
- spec 'modules extended with ConfigModule will load configurations' do
5
- ExampleConfig.foo == 'bar'
3
+ require_relative "spec_helper"
4
+ require_relative "example_config"
5
+
6
+ spec "modules extended with ConfigModule will load configurations" do
7
+ ExampleConfig.foo == "bar"
6
8
  end
7
9
 
8
- spec 'modules extended with ConfigModule have "namespace" methods' do
10
+ spec "modules extended with ConfigModule have 'namespace' methods" do
9
11
  ExampleConfig.methods.include? :namespace
10
12
  end
11
13
 
12
- spec 'config modules have [] methods' do
14
+ spec "config modules have [] methods" do
13
15
  ExampleConfig.respond_to? :[]
14
16
  end
15
17
 
16
- spec 'config modules return correct data using []' do
17
- ExampleConfig[:foo] == 'bar'
18
+ spec "config modules return correct data using []" do
19
+ ExampleConfig[:foo] == "bar"
18
20
  end
19
21
 
20
- spec 'when using [], return nil for nonexistant keys' do
21
- ExampleConfig[:nonexistant] == nil
22
+ spec "when using [], return nil for nonexistant keys" do
23
+ ExampleConfig[:nonexistant].nil?
22
24
  end
23
25
 
24
- spec 'nested hash values are properly wrapped' do
26
+ spec "nested hash values are properly wrapped" do
25
27
  ExampleConfig.dictionary.class == ConfigModule::ConfigOption
26
28
  end
27
29
 
28
- spec 'subkeys are accessible with methods' do
29
- ExampleConfig.dictionary.configuration == 'An arrangement of elements in a particular form, figure, or combination.'
30
+ spec "nested hash values stay wrapped on subsequent calls" do
31
+ ExampleConfig.dictionary.class == ConfigModule::ConfigOption &&
32
+ ExampleConfig.dictionary.class == ConfigModule::ConfigOption
33
+ end
34
+
35
+ spec "subkeys are accessible with methods" do
36
+ ExampleConfig.dictionary.configuration == "An arrangement of elements in a particular form, figure, or combination."
37
+ end
38
+
39
+ spec "subkeys are accessible with methods on subsequent calls" do
40
+ ExampleConfig.dictionary.configuration
41
+ ExampleConfig.dictionary.configuration == "An arrangement of elements in a particular form, figure, or combination."
30
42
  end
31
43
 
32
- spec 'subkeys work with .each' do
33
- text = String.new
44
+ spec "subkeys work with .each" do
45
+ text = []
34
46
  ExampleConfig.dictionary.each do |entry|
35
47
  text << entry.to_s
36
48
  end
37
- text == "[:configuration, \"An arrangement of elements in a particular form, figure, or combination.\"]"
49
+ text.join == "[:configuration, \"An arrangement of elements in a particular form, figure, or combination.\"]"
50
+ end
51
+
52
+ spec "respond_to? works for top-level methods" do
53
+ ExampleConfig.respond_to?(:dictionary) &&
54
+ !ExampleConfig.respond_to?(:nonexistant)
55
+ end
56
+
57
+ spec "respond_to? works for subkey methods" do
58
+ ExampleConfig.dictionary.respond_to?(:configuration) &&
59
+ !ExampleConfig.dictionary.respond_to?(:nonexistant)
38
60
  end
39
61
 
40
62
  module FalseNil
41
63
  extend ConfigModule
42
- config_file './config/false_nil.yml'
64
+ config_file "./config/false_nil.yml"
43
65
  end
44
66
 
45
- spec 'false values are returned' do
67
+ spec "false values are returned" do
46
68
  FalseNil.f == false
47
69
  end
48
70
 
49
- spec 'nil values are preserved' do
50
- FalseNil.n == nil
71
+ spec "nil values are preserved" do
72
+ FalseNil.n.nil?
51
73
  end
52
74
 
53
- spec 'missing keys raise exception when called as methods' do
75
+ spec "missing keys raise exception when called as methods" do
54
76
  begin
55
77
  FalseNil.nonexistant
56
78
  rescue ConfigModule::ConfigOption::NotFoundError
@@ -60,24 +82,24 @@ end
60
82
 
61
83
  module MultipleExample
62
84
  extend ConfigModule
63
- config_file './config/example.yml'
85
+ config_file "./config/example.yml"
64
86
  namespace :production, :dictionary
65
87
  end
66
88
 
67
- spec 'multiple namespaces can be set' do
89
+ spec "multiple namespaces can be set" do
68
90
  MultipleExample.configuration == ExampleConfig.dictionary.configuration
69
91
  end
70
92
 
71
93
  module InvalidNamespaceExample
72
94
  extend ConfigModule
73
- config_file './config/example.yml'
95
+ config_file "./config/example.yml"
74
96
  namespace :jimmy, :pop, :ali
75
97
  end
76
98
 
77
- spec 'incorrect namespaces raise informative errors' do
99
+ spec "incorrect namespaces raise informative errors" do
78
100
  begin
79
101
  InvalidNamespaceExample.whatever
80
- rescue => error
81
- error.class == ConfigModule::InvalidNamespaceError
102
+ rescue ConfigModule::InvalidNamespaceError
103
+ true
82
104
  end
83
105
  end
@@ -1,40 +1,98 @@
1
- require_relative 'spec_helper'
1
+ # frozen_string_literal: true
2
2
 
3
- hash = {a: {b: 5}}
3
+ require_relative "spec_helper"
4
+
5
+ hash = { a: { b: 5 } }
4
6
  opt = ConfigModule::ConfigOption.new hash
5
7
 
6
- spec 'responds to #[]' do
8
+ spec "includes Enumerable (deprecated)" do
9
+ ConfigModule::ConfigOption.include?(Enumerable)
10
+ end
11
+
12
+ spec "responds to #[]" do
7
13
  opt.respond_to? :[]
8
14
  end
9
15
 
10
- spec '#[] returns value associated with key' do
16
+ spec "#[] returns value associated with key" do
11
17
  opt[:a] == hash[:a]
12
18
  end
13
19
 
14
- spec 'ConfigOptions are Enumerable' do
15
- opt.map{|k,v| v[:b]} == [5]
20
+ spec "supports each" do
21
+ x = []
22
+ opt.each { |k, v| x << [k, v] } == opt && x == [[:a, { b: 5 }]]
23
+ end
24
+
25
+ spec "supports each_pair" do
26
+ x = []
27
+ opt.each_pair { |k, v| x << [k, v] } == opt && x == [[:a, { b: 5 }]]
28
+ end
29
+
30
+ spec "supports each_key" do
31
+ x = []
32
+ opt.each_key { |k| x << k } == opt && x == [:a]
33
+ end
34
+
35
+ spec "supports each_value" do
36
+ x = []
37
+ opt.each_value { |v| x << v } == opt && x == [{ b: 5 }]
38
+ end
39
+
40
+ spec "supports each as enumerator" do
41
+ opt.each.class == Enumerator && opt.each.to_a == [[:a, { b: 5 }]]
42
+ end
43
+
44
+ spec "supports each_pair as enumerator" do
45
+ opt.each_pair.class == Enumerator && opt.each_pair.to_a == [[:a, { b: 5 }]]
46
+ end
47
+
48
+ spec "supports each_key as enumerator" do
49
+ opt.each_key.class == Enumerator && opt.each_key.to_a == [:a]
50
+ end
51
+
52
+ spec "supports each_value as enumerator" do
53
+ opt.each_value.class == Enumerator && opt.each_value.to_a == [{ b: 5 }]
54
+ end
55
+
56
+ spec "can be frozen" do
57
+ frozen = opt.dup.freeze
58
+ frozen.frozen?
59
+ end
60
+
61
+ spec "when frozen, defines methods which return the right results" do
62
+ frozen = opt.dup.freeze
63
+ frozen.a.class == ConfigModule::ConfigOption
64
+ end
65
+
66
+ spec "when frozen, does not freeze nested options" do
67
+ frozen = opt.dup.freeze
68
+ !frozen.a.frozen?
69
+ end
70
+
71
+ spec "when frozen, nested options still work" do
72
+ frozen = opt.dup.freeze
73
+ frozen.a.b == 5
16
74
  end
17
75
 
18
- spec 'identifies the presence of keys' do
76
+ spec "identifies the presence of keys" do
19
77
  opt.has_key? :a
20
78
  end
21
79
 
22
- spec 'identifies the presence of keys as strings' do
23
- opt.has_key? 'a'
80
+ spec "identifies the presence of keys as strings" do
81
+ opt.has_key? "a"
24
82
  end
25
83
 
26
- spec 'identifies the lack of keys' do
27
- opt.has_key?('nonexistant') == false
84
+ spec "identifies the lack of keys" do
85
+ opt.has_key?("nonexistant") == false
28
86
  end
29
87
 
30
- spec 'identifies the presence of nested keys' do
88
+ spec "identifies the presence of nested keys" do
31
89
  opt.a.has_key? :b
32
90
  end
33
91
 
34
- spec 'to_ary' do
92
+ spec "to_ary" do
35
93
  begin
36
94
  opt.to_ary
37
- rescue NoMethodError => error
38
- error.class == ConfigModule::ConfigOption::NotFoundError
95
+ rescue ConfigModule::ConfigOption::NotFoundError
96
+ true
39
97
  end
40
98
  end
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ExampleConfig
2
4
  extend ConfigModule
3
5
 
4
- config_file './config/example.yml'
6
+ config_file "./config/example.yml"
5
7
  namespace Rails.env
6
8
 
7
- module_function
9
+ module_function
8
10
 
9
11
  def kanoodle
10
- 'ka' + config.noodle
12
+ "ka" + config.noodle
11
13
  end
12
14
  end
@@ -1,6 +1,8 @@
1
- require_relative 'spec_helper'
1
+ # frozen_string_literal: true
2
2
 
3
- spec 'display appropriate error when the object is a class' do
3
+ require_relative "spec_helper"
4
+
5
+ spec "display appropriate error when the object is a class" do
4
6
  error = ConfigModule::InvalidNamespaceError.new :foo, Array
5
- error.message.include? 'Array'
7
+ error.message.include?("Array") || error.message
6
8
  end
@@ -1,7 +1,9 @@
1
- require_relative 'spec_helper'
2
- require_relative 'example_config'
1
+ # frozen_string_literal: true
3
2
 
4
- spec 'method missing must handle multiple arguments gracefully' do
3
+ require_relative "spec_helper"
4
+ require_relative "example_config"
5
+
6
+ spec "method missing must handle multiple arguments gracefully" do
5
7
  begin
6
8
  ExampleConfig.nonexistant :foo, :bar
7
9
  rescue NoMethodError => error
@@ -1,11 +1,12 @@
1
- require_relative 'spec_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "spec_helper"
2
4
 
3
5
  def self.helper
4
- if @helper then @helper
5
- else
6
+ @helper ||= begin
6
7
  @helper = ConfigModule::ConfigHelper.new
7
- @helper.config_file = './config/example.yml'
8
- @helper.namespaces = ['production']
8
+ @helper.config_file = "./config/example.yml"
9
+ @helper.namespaces = ["production"]
9
10
  @helper.config
10
11
  @helper
11
12
  end
@@ -13,58 +14,55 @@ end
13
14
 
14
15
  table = helper.load_config.instance_variable_get(:@table)
15
16
 
16
- spec 'namespaces obtain subtrees of the full config' do
17
+ spec "namespaces obtain subtrees of the full config" do
17
18
  table.keys == [:foo, :noodle, :dictionary]
18
19
  end
19
20
 
20
- spec 'specifying a namespace forces #config to return that subtree the first time its called' do
21
- symbolized_keys_from_full_config = helper.raw_config['production'].keys.map(&:to_sym)
21
+ spec "specifying a namespace forces #config to return that subtree the first time its called" do
22
+ symbolized_keys_from_full_config = helper.raw_config["production"].keys.map(&:to_sym)
22
23
  symbolized_keys_from_full_config == table.keys
23
24
  end
24
25
 
25
- spec 'nested namespaces are handled properly' do
26
+ spec "nested namespaces are handled properly" do
26
27
  helper = ConfigModule::ConfigHelper.new
27
- helper.config_file = './config/example.yml'
28
- helper.namespaces = ['production', 'dictionary']
29
- helper.config.has_key?('configuration') &&
30
- helper.config[:configuration] == helper.raw_config['production']['dictionary']['configuration']
28
+ helper.config_file = "./config/example.yml"
29
+ helper.namespaces = %w[production dictionary]
30
+ helper.config.has_key?("configuration") &&
31
+ helper.config[:configuration] == helper.raw_config["production"]["dictionary"]["configuration"]
31
32
  end
32
33
 
33
- spec 'misconfigured namespaces provide useful errors' do
34
+ spec "misconfigured namespaces provide useful errors" do
34
35
  helper = ConfigModule::ConfigHelper.new
35
- helper.config_file = './config/example.yml'
36
- helper.namespaces = ['nonexistant']
36
+ helper.config_file = "./config/example.yml"
37
+ helper.namespaces = ["nonexistant"]
37
38
 
38
39
  begin
39
40
  helper.config
40
41
  rescue ConfigModule::InvalidNamespaceError => error
41
- error.is_a?(ConfigModule::InvalidNamespaceError) &&
42
- error.message.include?('nonexistant') || error.message
42
+ error.message.include?("nonexistant") || error.message
43
43
  end
44
44
  end
45
45
 
46
- spec 'out of bounds namespaces are checked properly' do
46
+ spec "out of bounds namespaces are checked properly" do
47
47
  helper = ConfigModule::ConfigHelper.new
48
- helper.config_file = './config/example.yml'
49
- helper.namespaces = ['production', 'foo', 'bar']
48
+ helper.config_file = "./config/example.yml"
49
+ helper.namespaces = %w[production foo bar]
50
50
 
51
51
  begin
52
52
  helper.config
53
53
  rescue ConfigModule::InvalidNamespaceError => error
54
- error.is_a?(ConfigModule::InvalidNamespaceError) &&
55
- error.message.include?('bar') || error.message
54
+ error.message.include?("bar") || error.message
56
55
  end
57
56
  end
58
57
 
59
- spec 'invalid namespaces which are ruby objects display properly' do
58
+ spec "invalid namespaces which are ruby objects display properly" do
60
59
  helper = ConfigModule::ConfigHelper.new
61
- helper.config_file = './config/example.yml'
62
- helper.namespaces = [Array,Hash]
60
+ helper.config_file = "./config/example.yml"
61
+ helper.namespaces = [Array, Hash]
63
62
 
64
63
  begin
65
64
  helper.config
66
65
  rescue ConfigModule::InvalidNamespaceError => error
67
- error.is_a?(ConfigModule::InvalidNamespaceError) &&
68
- error.message.include?('Array') || error.message
66
+ error.message.include?("Array") || error.message
69
67
  end
70
68
  end
data/uspec/spec_helper.rb CHANGED
@@ -1,16 +1,18 @@
1
- require 'bundler/setup'
2
- require 'uspec'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "uspec"
3
5
  Bundler.require :default, :test
4
6
 
5
- if ENV['CI'] == 'true' then
6
- require 'simplecov'
7
+ if ENV["CI"] == "true"
8
+ require "simplecov"
7
9
  SimpleCov.start
8
10
  end
9
11
 
10
12
  Dir.chdir File.dirname(__FILE__)
11
13
 
12
- require_relative '../lib/config_module'
14
+ require_relative "../lib/config_module"
13
15
 
14
16
  extend Uspec
15
17
 
16
- module Rails; def self.env; 'production'; end; end
18
+ module Rails; def self.env; "production"; end; end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: config_module
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anthony M. Cook
@@ -14,16 +14,16 @@ dependencies:
14
14
  name: uspec
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 0.1.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 0.1.0
27
27
  description: Wrap a configuration file in a module for easy use throughout your application.
28
28
  Inspired by Rails.
29
29
  email:
@@ -32,8 +32,11 @@ executables: []
32
32
  extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
+ - ".circleci/config.yml"
35
36
  - ".codeclimate.yml"
36
37
  - ".gitignore"
38
+ - ".gitlab-ci.yml"
39
+ - ".rubocop.yml"
37
40
  - ".ruby-gemset"
38
41
  - ".ruby-version"
39
42
  - ".travis.yml"
@@ -59,7 +62,7 @@ files:
59
62
  homepage: http://github.com/acook/config_module
60
63
  licenses:
61
64
  - MIT
62
- - LGPL-3
65
+ - LGPL-3.0
63
66
  metadata: {}
64
67
  post_install_message:
65
68
  rdoc_options: []