sexy_settings 0.0.2 → 0.1.0

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
  SHA1:
3
- metadata.gz: 3a2bdfde4cdce0f4675e616504f3116cb268696e
4
- data.tar.gz: adcdd8d83a9fd898a2200d21f2c4d0dde34c08df
3
+ metadata.gz: d4a5887e8614a93b21480bf04d3db3ab170ee5b6
4
+ data.tar.gz: 2b59f6be2fe5763e44038d22f8411bff69167276
5
5
  SHA512:
6
- metadata.gz: 0a3be7f1002c585f6f6b3a105e1db74c9d4e743083cbc3ac42b53834abae9ee1b275901698adf7658c18d90d9b4d97e33ca88a84528ddc049b0e33a14d553978
7
- data.tar.gz: 71f70a96e8f4666d3212e7ad0955c2f7840a45f783144c3d8f33ef900d41c5ec7118bab6fbabfbfac2ff034b0f3d9b094141fad5fa5ab382fb1eefb6ea3c0763
6
+ metadata.gz: 8b6068bb39e71e1da784e0b27812655bb20f40dc5d53d45c0e39d7f7b5db83f58111198ceff99af51251377e49d57acdfbfac2b65b6b02650e4e64e18172477e
7
+ data.tar.gz: 76f41644a7518861956b3d363bec04aa66e6e552a0260163e41cf587fa76971938076a9ebb296ff788dc46ef8f174fb5bdca90fae8bf71806806f04a95d55f61
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ pkg/*
6
6
  .byebug_history
7
7
  .yardoc/
8
8
  doc/
9
+ .ruby-version
@@ -3,6 +3,7 @@
3
3
 
4
4
  AllCops:
5
5
  TargetRubyVersion: 2.3
6
+ DisplayCopNames: true
6
7
 
7
8
  LineLength:
8
9
  Max: 120
@@ -21,3 +22,12 @@ Style/CaseEquality:
21
22
 
22
23
  MethodLength:
23
24
  Max: 30
25
+
26
+ Metrics/ClassLength:
27
+ Max: 120
28
+
29
+ Metrics/BlockLength:
30
+ Enabled: false
31
+
32
+ Style/FrozenStringLiteralComment:
33
+ Enabled: false
@@ -1,6 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0.0
4
- - 2.1.10
5
- - 2.2.5
6
- - 2.3.1
3
+ - 2.2.7
4
+ - 2.3.4
5
+ - 2.4.1
data/Gemfile CHANGED
@@ -1,9 +1,4 @@
1
- # frozen_string_literal: true
2
1
  source 'http://rubygems.org'
3
2
 
4
3
  # Specify your gem's dependencies in sexy_settings.gemspec
5
4
  gemspec
6
-
7
- group :development do
8
- gem 'rubocop'
9
- end
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011 Roman Parashchenko
1
+ Copyright (c) 2017 Roman Parashchenko
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -16,6 +16,13 @@ It is a Ruby-based library used to specify application settings in different way
16
16
  * Using the YAML file (default and custom settings).
17
17
  * Using the command line.
18
18
 
19
+ ### What's new in 0.1.0
20
+
21
+ - Stop supporting Ruby < 2.2.2
22
+ - Validate missing defaults for all settings
23
+ - Fix issue [Exception on empty custom.yml](https://github.com/romikoops/sexy_settings/issues/6)
24
+ - Fix issue [Raise error instead of nil on missing setting](https://github.com/romikoops/sexy_settings/issues/7)
25
+
19
26
  ### What's new in 0.0.2
20
27
 
21
28
  - Ability to override delimiter on fly for command line settings
@@ -26,7 +33,7 @@ It is a Ruby-based library used to specify application settings in different way
26
33
 
27
34
  ### Prerequisites
28
35
 
29
- It was tested with Ruby 2.0 but it expected to also work with other Ruby versions
36
+ Ruby 2.2.2+
30
37
 
31
38
  ### Installation
32
39
 
@@ -58,10 +65,9 @@ config\
58
65
 
59
66
  ### Usage
60
67
 
61
- There are 4 possible settings values. The priority ranks with respect to the settings location are as follows:
62
-
68
+ There are 3 possible settings values. The priority ranks with respect to the settings location are as follows:
63
69
 
64
- > **command line** < **custom** < **default** < **nil**_(in case setting was not specified anywhere)_
70
+ > **command line** < **custom** < **default**
65
71
 
66
72
  Thus, specifying some setting in the command line will override the same setting value specified in the <_default config file_> or <_custom config file_>
67
73
 
@@ -131,6 +137,6 @@ community](https://github.com/romikoops/sexy_settings/graphs/contributors).
131
137
  License
132
138
  -------
133
139
 
134
- SexySettngs is Copyright © 2011-2016 Roman Parashchenko. It is free
140
+ SexySettngs is Copyright © 2011-2017 Roman Parashchenko. It is free
135
141
  software, and may be redistributed under the terms specified in the
136
142
  [LICENSE](/LICENSE_MIT) file.
data/Rakefile CHANGED
@@ -1,4 +1,3 @@
1
- # frozen_string_literal: true
2
1
  require 'rubygems'
3
2
  require 'bundler'
4
3
  Bundler.setup
@@ -15,4 +14,4 @@ YARD::Rake::YardocTask.new { |_t| }
15
14
 
16
15
  RuboCop::RakeTask.new
17
16
 
18
- task default: [:rubocop, :spec]
17
+ task default: %i[rubocop spec]
@@ -1,4 +1,3 @@
1
- # frozen_string_literal: true
2
1
  require 'sexy_settings/version'
3
2
  require 'sexy_settings/configuration'
4
3
  require 'sexy_settings/base'
@@ -1,7 +1,7 @@
1
- # frozen_string_literal: true
2
1
  require 'singleton'
3
2
  require 'yaml'
4
3
  require_relative 'printable'
4
+ require_relative 'exceptions'
5
5
 
6
6
  module SexySettings
7
7
  # This class represents core functionality
@@ -11,12 +11,18 @@ module SexySettings
11
11
  include Singleton
12
12
  include Printable
13
13
 
14
- # Priorities: command_line > custom.yml > default.yml > nil
14
+ # Priorities: command_line > custom.yml > default.yml
15
15
  def initialize
16
- @default = load_settings(config.path_to_default_settings)
17
- @custom = load_settings(config.path_to_custom_settings)
16
+ @default = load_default_settings
17
+ @custom = load_custom_settings
18
18
  init_command_line_settings
19
19
  init_all_settings
20
+ validate_default_settings
21
+ define_dynamic_methods
22
+ end
23
+
24
+ def inspect
25
+ 'SexySettings::Base'
20
26
  end
21
27
 
22
28
  private
@@ -25,30 +31,46 @@ module SexySettings
25
31
  SexySettings.configuration
26
32
  end
27
33
 
28
- def load_settings(path)
29
- File.exist?(path) ? YAML.load_file(path) : {}
34
+ def define_dynamic_methods
35
+ @default.keys.each do |setting|
36
+ self.class.instance_eval do
37
+ define_method(setting) { @all[setting] }
38
+ define_method("#{setting}=") do |value|
39
+ @all[setting] = value
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ def validate_default_settings
46
+ incorrect_settings = @all.keys - @default.keys
47
+ return if incorrect_settings.empty?
48
+ path = config.path_to_default_settings
49
+ raise SexySettings::MissingDefaultError, "Please specify defaults in '#{path}' config file:\n" +
50
+ incorrect_settings.map { |el| "\t\t#{el}: someValue" }.join("\n")
51
+ end
52
+
53
+ def load_default_settings
54
+ path = config.path_to_default_settings
55
+ YAML.load_file(path) || {}
56
+ end
57
+
58
+ def load_custom_settings
59
+ path = config.path_to_custom_settings
60
+ return {} unless File.exist?(path)
61
+ YAML.load_file(path) || {}
30
62
  end
31
63
 
32
64
  # Parse the compound setting.
33
65
  # Parts of this config_parser must be defined earlier.
34
66
  # You can define an option as option=${another_option_name}/something
35
67
  def get_compound_value(value)
36
- if /\$\{(.*?)\}/ =~ value.to_s
37
- var = /\$\{(.*?)\}/.match(value.to_s)[1]
38
- exist_var = @all[var]
39
- raise ArgumentError, "Did you define this setting '#{var}' before?" if exist_var.nil?
40
- value["${#{var}}"] = exist_var.to_s if var
41
- get_compound_value(value)
42
- end
43
- value
44
- end
45
-
46
- def method_missing(name, *args)
47
- if name.to_s =~ /=$/
48
- @all[name.to_s] = args[0] if @all.key?(name.to_s)
49
- else
50
- @all[name.to_s]
51
- end
68
+ return value unless /\$\{(.*?)\}/ =~ value.to_s
69
+ var = /\$\{(.*?)\}/.match(value.to_s)[1]
70
+ exist_var = @all[var]
71
+ raise ArgumentError, "Did you define this setting '#{var}' before?" if exist_var.nil?
72
+ value["${#{var}}"] = exist_var.to_s if var
73
+ get_compound_value(value)
52
74
  end
53
75
 
54
76
  # Try to convert a value from String to other types (int, boolean, float)
@@ -95,7 +117,7 @@ module SexySettings
95
117
  value = value.chomp.strip if value
96
118
  new_value = ''
97
119
  if value
98
- new_value = (value =~ /^["](.*)["]$/) ? Regexp.last_match(1) : value
120
+ new_value = value =~ /^["](.*)["]$/ ? Regexp.last_match(1) : value
99
121
  end
100
122
  new_value = try_convert_value(new_value) if new_value.class == String
101
123
  [param.chomp.strip, new_value]
@@ -1,4 +1,3 @@
1
- # frozen_string_literal: true
2
1
  module SexySettings
3
2
  # This class holds all configuration settings
4
3
  class Configuration
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  # Core module
4
2
  module SexySettings
5
3
  # Used internally to ensure examples get reloaded between multiple runs in
@@ -0,0 +1,4 @@
1
+ # This module holds all custom sexy_settings exceptions
2
+ module SexySettings
3
+ MissingDefaultError = Class.new(StandardError) #:nodoc:
4
+ end
@@ -1,4 +1,3 @@
1
- # frozen_string_literal: true
2
1
  require_relative 'sensitive_data_protector'
3
2
  module SexySettings
4
3
  # This module holds print methods
@@ -1,4 +1,3 @@
1
- # frozen_string_literal: true
2
1
  module SexySettings
3
2
  # This class holds logic sensitive data hiding
4
3
  class SensitiveDataProtector
@@ -24,7 +23,7 @@ module SexySettings
24
23
  end
25
24
 
26
25
  def hide_protected_data_in_url(value)
27
- return value if value.nil? || !(URL_REGEXP =~ value)
26
+ return value if value.nil? || URL_REGEXP !~ value
28
27
  userpass = URL_REGEXP.match(value)[:userpass]
29
28
  return value if userpass.nil? || userpass.empty?
30
29
  value.sub(userpass, protected_userpass(userpass))
@@ -1,4 +1,3 @@
1
- # frozen_string_literal: true
2
1
  module SexySettings
3
- VERSION = '0.0.2'
2
+ VERSION = '0.1.0'.freeze
4
3
  end
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
- # frozen_string_literal: true
3
1
  $LOAD_PATH.push File.expand_path('../lib', __FILE__)
4
2
  require 'sexy_settings/version'
5
3
 
@@ -12,6 +10,8 @@ Gem::Specification.new do |s|
12
10
  s.summary = 'Flexible specifying of application settings'
13
11
  s.description = 'Library for flexible specifying of application settings different ways'
14
12
  s.rubyforge_project = 'sexy_settings'
13
+ s.license = 'MIT'
14
+ s.required_ruby_version = '>= 2.2.2'
15
15
 
16
16
  s.files = `git ls-files`.split("\n")
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -20,4 +20,5 @@ Gem::Specification.new do |s|
20
20
  s.add_development_dependency 'rspec', '~>3.5'
21
21
  s.add_development_dependency('rake')
22
22
  s.add_development_dependency('yard')
23
+ s.add_development_dependency('rubocop')
23
24
  end
@@ -0,0 +1,3 @@
1
+ # test config to validate commented settings do not raise errors
2
+ # foo: 1
3
+ # bar: 2
@@ -0,0 +1,3 @@
1
+ # test config to validate commented settings do not raise errors
2
+ # foo: 1
3
+ # bar: 2
@@ -14,3 +14,10 @@ test2_url: http://${email}@host/wd/hub
14
14
  test3_url: http://:${user_pass}@host:80/wd/hub
15
15
  test4_url:
16
16
  test5_url: http://host/wd/hub
17
+ string: 'default'
18
+ int: 'default'
19
+ float: 'default'
20
+ boolean_true: 'default'
21
+ boolean_false: 'default'
22
+ symbol: 'default'
23
+ reference: 'default'
@@ -1,136 +1,228 @@
1
- # frozen_string_literal: true
2
1
  require 'spec_helper'
3
2
 
4
3
  RSpec.describe 'Base' do
5
- before :all do
6
- SexySettings.configure do |config|
7
- config.path_to_default_settings =
8
- File.expand_path('config.yaml', File.join(File.dirname(__FILE__), '..', '_config'))
9
- config.path_to_custom_settings =
10
- File.expand_path('overwritten.yaml', File.join(File.dirname(__FILE__), '..', '_config'))
11
- config.path_to_project = File.dirname(__FILE__)
12
- config.env_variable_with_options = 'OPTIONS'
4
+ context 'when default and custom settings exists and not blank' do
5
+ before :all do
6
+ SexySettings.configure do |config|
7
+ config.path_to_default_settings =
8
+ File.expand_path('config.yaml', File.join(File.dirname(__FILE__), '..', '_config'))
9
+ config.path_to_custom_settings =
10
+ File.expand_path('overwritten.yaml', File.join(File.dirname(__FILE__), '..', '_config'))
11
+ config.path_to_project = File.dirname(__FILE__)
12
+ config.env_variable_with_options = 'OPTIONS'
13
+ end
14
+ @original_options = if ENV.key?(SexySettings.configuration.env_variable_with_options)
15
+ ENV[SexySettings.configuration.env_variable_with_options]
16
+ else
17
+ nil
18
+ end
19
+ ENV[SexySettings.configuration.env_variable_with_options] = 'console_property=console CONSOLE value'
20
+ @settings ||= settings
13
21
  end
14
- @original_options = if ENV.key?(SexySettings.configuration.env_variable_with_options)
15
- ENV[SexySettings.configuration.env_variable_with_options]
16
- else
17
- nil
18
- end
19
- ENV[SexySettings.configuration.env_variable_with_options] = 'console_property=console CONSOLE value'
20
- @settings ||= settings
21
- end
22
22
 
23
- after :all do
24
- @original_options = ENV[SexySettings.configuration.env_variable_with_options]
25
- unless @original_options
26
- ENV[SexySettings.configuration.env_variable_with_options] = @original_options
23
+ after :all do
24
+ @original_options = ENV[SexySettings.configuration.env_variable_with_options]
25
+ unless @original_options
26
+ ENV[SexySettings.configuration.env_variable_with_options] = @original_options
27
+ end
27
28
  end
28
- end
29
29
 
30
- it 'should be singleton object' do
31
- expect(SexySettings::Base.respond_to?(:instance)).to be_truthy
32
- expect(SexySettings::Base.instance).to be_a(SexySettings::Base)
33
- end
30
+ it 'should be singleton object' do
31
+ expect(SexySettings::Base.respond_to?(:instance)).to be_truthy
32
+ expect(SexySettings::Base.instance).to be_a(SexySettings::Base)
33
+ end
34
34
 
35
- it 'should have getter for default setting' do
36
- expect(@settings).to be_respond_to(:default)
37
- expected_default_settings = {
38
- 'default_property' => 'default DEFAULT value',
39
- 'overwritten_property' => 'default OVERWRITTEN value',
40
- 'console_property' => 'default CONSOLE value'
41
- }
42
- expect(@settings.default).to include(expected_default_settings)
43
- end
35
+ it 'should have getter for default setting' do
36
+ expect(@settings).to be_respond_to(:default)
37
+ expected_default_settings = {
38
+ 'default_property' => 'default DEFAULT value',
39
+ 'overwritten_property' => 'default OVERWRITTEN value',
40
+ 'console_property' => 'default CONSOLE value'
41
+ }
42
+ expect(@settings.default).to include(expected_default_settings)
43
+ end
44
44
 
45
- it 'should have getter for custom setting' do
46
- expect(@settings).to be_respond_to(:default)
47
- expected_custom_settings = {
48
- 'overwritten_property' => 'overwritten OVERWRITTEN value',
49
- 'console_property' => 'overwritten CONSOLE value'
50
- }
51
- expect(@settings.custom).to eq(expected_custom_settings)
52
- end
45
+ it 'should have getter for custom setting' do
46
+ expect(@settings).to be_respond_to(:default)
47
+ expected_custom_settings = {
48
+ 'overwritten_property' => 'overwritten OVERWRITTEN value',
49
+ 'console_property' => 'overwritten CONSOLE value'
50
+ }
51
+ expect(@settings.custom).to eq(expected_custom_settings)
52
+ end
53
53
 
54
- it 'should have getter for all setting' do
55
- expect(@settings).to be_respond_to(:default)
56
- expected_all_settings = {
57
- 'default_property' => 'default DEFAULT value',
58
- 'overwritten_property' => 'overwritten OVERWRITTEN value',
59
- 'console_property' => 'console CONSOLE value'
60
- }
54
+ it 'should have getter for all setting' do
55
+ expect(@settings).to be_respond_to(:default)
56
+ expected_all_settings = {
57
+ 'default_property' => 'default DEFAULT value',
58
+ 'overwritten_property' => 'overwritten OVERWRITTEN value',
59
+ 'console_property' => 'console CONSOLE value'
60
+ }
61
61
 
62
- expect(@settings.all).to include(expected_all_settings)
63
- end
62
+ expect(@settings.all).to include(expected_all_settings)
63
+ end
64
64
 
65
- it 'should return specified pretty formatted settings for output' do
66
- # rubocop:disable Lint/EmptyInterpolation
67
- expected = <<-eos
65
+ it 'should return specified pretty formatted settings for output' do
66
+ # rubocop:disable Lint/EmptyInterpolation
67
+ # rubocop:disable Lint/EmptyExpression
68
+ # rubocop:disable Style/IndentHeredoc
69
+ expected = <<-TXT
68
70
  #######################################################
69
71
  # All Settings #
70
72
  #######################################################
71
73
 
72
74
  api_key = ********2333
73
75
  api_token = ********23ef
76
+ boolean_false = default
77
+ boolean_true = default
74
78
  console_property = console CONSOLE value
75
79
  default_property = default DEFAULT value
76
80
  email = user@example.com
81
+ float = default
82
+ int = default
77
83
  my_secret = ********vqww
78
84
  overwritten_property = overwritten OVERWRITTEN value
79
85
  pass = ********
80
86
  passenger_name = Ivan Petrov
81
87
  password_confirmation = ********pass
88
+ reference = default
89
+ string = default
90
+ symbol = default
82
91
  test1_url = http://********.com:********orld@host:80/wd/hub
83
92
  test2_url = http://********.com@host/wd/hub
84
93
  test3_url = http://********:********orld@host:80/wd/hub
85
94
  test4_url = #{}
86
95
  test5_url = http://host/wd/hub
87
96
  user_pass = ********orld
88
- eos
89
- # rubocop:enable Lint/EmptyInterpolation
90
- expect(@settings.as_formatted_text).to eq(expected)
91
- end
92
-
93
- context 'command line' do
94
- let(:clone_settings) { settings.class.clone.instance }
95
- before do
96
- SexySettings.configure.env_variable_with_options = 'SEXY_SETTINGS'
97
- ENV['SEXY_SETTINGS'] = 'string=Test, int=1, float=1.09, boolean_true=true,' \
98
- ' boolean_false=false, symbol=:foo, reference = ${string}'
97
+ TXT
98
+ # rubocop:enable Lint/EmptyInterpolation
99
+ # rubocop:enable Lint/EmptyExpression
100
+ # rubocop:enable Style/IndentHeredoc
101
+ expect(@settings.as_formatted_text).to eq(expected)
99
102
  end
100
103
 
101
- after do
102
- SexySettings.configure.env_variable_with_options = 'OPTIONS'
104
+ context 'command line' do
105
+ let(:clone_settings) { settings.class.clone.instance }
106
+ before do
107
+ SexySettings.configure.env_variable_with_options = 'SEXY_SETTINGS'
108
+ ENV['SEXY_SETTINGS'] = 'string=Test, int=1, float=1.09, boolean_true=true,' \
109
+ ' boolean_false=false, symbol=:foo, reference = ${string}'
110
+ end
111
+
112
+ after do
113
+ SexySettings.configure.env_variable_with_options = 'OPTIONS'
114
+ end
115
+
116
+ it 'should convert command line string value to String type' do
117
+ expect(clone_settings.string).to eq('Test')
118
+ end
119
+
120
+ it 'should convert command line integer value to Integer type' do
121
+ expect(clone_settings.int).to eq(1)
122
+ expect(clone_settings.int).to be_a(Integer)
123
+ end
124
+
125
+ it 'should convert command line float value to Float type' do
126
+ expect(clone_settings.float).to eq(1.09)
127
+ expect(clone_settings.float.class).to eq(Float)
128
+ end
129
+
130
+ it 'should convert command line true value to TrueClass type' do
131
+ expect(clone_settings.boolean_true).to be_truthy
132
+ end
133
+
134
+ it 'should convert command line false value to FalseClass type' do
135
+ expect(clone_settings.boolean_false).to be_falsy
136
+ expect(clone_settings.boolean_false.class).to eq(FalseClass)
137
+ end
138
+
139
+ it 'should convert command line symbol value to Symbol type' do
140
+ expect(clone_settings.symbol).to eq(:foo)
141
+ end
142
+
143
+ it 'should replace command line reference to correct value' do
144
+ expect(clone_settings.reference).to eq('Test')
145
+ end
146
+
147
+ context 'when some settings without defaults' do
148
+ before do
149
+ ENV['SEXY_SETTINGS'] = 'options_without_default1=1, options_without_default2=2'
150
+ end
151
+ it 'raises error related with missing default settings' do
152
+ file = File.expand_path('config.yaml', File.join(File.dirname(__FILE__), '..', '_config'))
153
+ expect { clone_settings }.to raise_error(
154
+ SexySettings::MissingDefaultError,
155
+ "Please specify defaults in '#{file}' config file:\n" \
156
+ "\t\toptions_without_default1: someValue\n" \
157
+ "\t\toptions_without_default2: someValue"
158
+ )
159
+ end
160
+ end
103
161
  end
104
162
 
105
- it 'should convert command line string value to String type' do
106
- expect(clone_settings.string).to eq('Test')
163
+ context 'when unknown setting name' do
164
+ let(:clone_settings) { settings.class.clone.instance }
165
+ it 'raise undefined method error' do
166
+ expect { clone_settings.emial }.to raise_error(
167
+ NoMethodError,
168
+ /undefined method `emial' for SexySettings::Base:#{clone_settings.class}/
169
+ )
170
+ end
107
171
  end
108
-
109
- it 'should convert command line integer value to Fixnum type' do
110
- expect(clone_settings.int).to eq(1)
111
- expect(clone_settings.int.class).to eq(Fixnum)
172
+ end
173
+ context 'when missing default settings' do
174
+ let(:klass) { SexySettings::Base.clone }
175
+ let(:default_path) { File.expand_path('missing_config.yaml', File.join(File.dirname(__FILE__), '..', '_config')) }
176
+ let(:custom_path) { File.expand_path('overwritten.yaml', File.join(File.dirname(__FILE__), '..', '_config')) }
177
+ before do
178
+ SexySettings.configure do |config|
179
+ config.path_to_default_settings = default_path
180
+ config.path_to_custom_settings = custom_path
181
+ config.path_to_project = File.dirname(__FILE__)
182
+ end
112
183
  end
113
184
 
114
- it 'should convert command line float value to Float type' do
115
- expect(clone_settings.float).to eq(1.09)
116
- expect(clone_settings.float.class).to eq(Float)
185
+ it 'raise error' do
186
+ expect { klass.instance }.to raise_error(
187
+ Errno::ENOENT,
188
+ "No such file or directory @ rb_sysopen - #{default_path}"
189
+ )
117
190
  end
191
+ end
118
192
 
119
- it 'should convert command line true value to TrueClass type' do
120
- expect(clone_settings.boolean_true).to be_truthy
193
+ context 'when missing custom settings' do
194
+ let(:klass) { SexySettings::Base.clone }
195
+ let(:default_path) { File.expand_path('config.yaml', File.join(File.dirname(__FILE__), '..', '_config')) }
196
+ let(:custom_path) { File.expand_path('missing_custom.yaml', File.join(File.dirname(__FILE__), '..', '_config')) }
197
+ before do
198
+ SexySettings.configure do |config|
199
+ config.path_to_default_settings = default_path
200
+ config.path_to_custom_settings = custom_path
201
+ config.path_to_project = File.dirname(__FILE__)
202
+ end
121
203
  end
122
204
 
123
- it 'should convert command line false value to FalseClass type' do
124
- expect(clone_settings.boolean_false).to be_falsy
125
- expect(clone_settings.boolean_false.class).to eq(FalseClass)
205
+ it 'returns blank custom settings' do
206
+ expect(klass.instance.custom).to eq({})
126
207
  end
208
+ end
127
209
 
128
- it 'should convert command line symbol value to Symbol type' do
129
- expect(clone_settings.symbol).to eq(:foo)
210
+ context 'when blank settings' do
211
+ let(:klass) { SexySettings::Base.clone }
212
+ let(:default_path) { File.expand_path('blank_default.yml', File.join(File.dirname(__FILE__), '..', '_config')) }
213
+ let(:custom_path) { File.expand_path('blank_custom.yml', File.join(File.dirname(__FILE__), '..', '_config')) }
214
+ before do
215
+ SexySettings.configure do |config|
216
+ config.path_to_default_settings = default_path
217
+ config.path_to_custom_settings = custom_path
218
+ config.path_to_project = File.dirname(__FILE__)
219
+ config.env_variable_with_options = 'OPTS'
220
+ end
130
221
  end
131
222
 
132
- it 'should replace command line reference to correct value' do
133
- expect(clone_settings.reference).to eq('Test')
223
+ it 'returns blank default and custom settings' do
224
+ expect(klass.instance.default).to eq({})
225
+ expect(klass.instance.custom).to eq({})
134
226
  end
135
227
  end
136
228
  end
@@ -1,4 +1,3 @@
1
- # frozen_string_literal: true
2
1
  require 'spec_helper'
3
2
 
4
3
  describe 'Configuration' do
@@ -1,4 +1,3 @@
1
- # frozen_string_literal: true
2
1
  require 'spec_helper'
3
2
 
4
3
  describe 'Core' do
@@ -1,4 +1,3 @@
1
- # frozen_string_literal: true
2
1
  require 'spec_helper'
3
2
 
4
3
  describe 'Version' do
@@ -1,2 +1 @@
1
- # frozen_string_literal: true
2
1
  require 'sexy_settings'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sexy_settings
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Parashchenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-19 00:00:00.000000000 Z
11
+ date: 2017-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Library for flexible specifying of application settings different ways
56
70
  email:
57
71
  - romikoops1@gmail.com
@@ -72,10 +86,13 @@ files:
72
86
  - lib/sexy_settings/base.rb
73
87
  - lib/sexy_settings/configuration.rb
74
88
  - lib/sexy_settings/core.rb
89
+ - lib/sexy_settings/exceptions.rb
75
90
  - lib/sexy_settings/printable.rb
76
91
  - lib/sexy_settings/sensitive_data_protector.rb
77
92
  - lib/sexy_settings/version.rb
78
93
  - sexy_settings.gemspec
94
+ - spec/_config/blank_custom.yml
95
+ - spec/_config/blank_default.yml
79
96
  - spec/_config/config.yaml
80
97
  - spec/_config/overwritten.yaml
81
98
  - spec/sexy_settings/base_spec.rb
@@ -84,7 +101,8 @@ files:
84
101
  - spec/sexy_settings/version_spec.rb
85
102
  - spec/spec_helper.rb
86
103
  homepage: https://github.com/romikoops/sexy_settings
87
- licenses: []
104
+ licenses:
105
+ - MIT
88
106
  metadata: {}
89
107
  post_install_message:
90
108
  rdoc_options: []
@@ -94,7 +112,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
94
112
  requirements:
95
113
  - - ">="
96
114
  - !ruby/object:Gem::Version
97
- version: '0'
115
+ version: 2.2.2
98
116
  required_rubygems_version: !ruby/object:Gem::Requirement
99
117
  requirements:
100
118
  - - ">="
@@ -102,11 +120,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
120
  version: '0'
103
121
  requirements: []
104
122
  rubyforge_project: sexy_settings
105
- rubygems_version: 2.5.1
123
+ rubygems_version: 2.6.11
106
124
  signing_key:
107
125
  specification_version: 4
108
126
  summary: Flexible specifying of application settings
109
127
  test_files:
128
+ - spec/_config/blank_custom.yml
129
+ - spec/_config/blank_default.yml
110
130
  - spec/_config/config.yaml
111
131
  - spec/_config/overwritten.yaml
112
132
  - spec/sexy_settings/base_spec.rb
@@ -114,3 +134,4 @@ test_files:
114
134
  - spec/sexy_settings/core_spec.rb
115
135
  - spec/sexy_settings/version_spec.rb
116
136
  - spec/spec_helper.rb
137
+ has_rdoc: