tinyconfig 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZWNjYTc2NjdhZGYzMzJkODIwY2Y3YzYyNWMwZmMyZmU2YTU3MWYyNw==
5
+ data.tar.gz: !binary |-
6
+ ZjAzNWQzYjcxNTkwNjIyODljOWU1MTBiZmRjMTEzZTNiNzUyM2U3Yw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NGI1N2ZiZjgxZTk4OTRkOWM4NjQzODJiMjhhZDM3ZTM4ZTQzYmRjZGMzNzIz
10
+ NThiYzAyN2I1NDg1NjY4NTY4ZTcwOGJjNTRjNTczMjBmMDU2NGJjOWM3ODIx
11
+ ZTc3MDA3MGEyZmY1MTY1ZWIyNDdjMDAwMjM4MjlmOTFkZjQ3OWQ=
12
+ data.tar.gz: !binary |-
13
+ OTI3OWMzYmRmYjA4MjExOWE0Nzc1MTVjNTljZTk5OTlmM2UxYTc2N2Q0NGY3
14
+ MWUyZGQ2NGUzNzc1NzRhNWVlNTVjMTlkZjYzM2YzODhkNTkyMDUwMDhmN2Nm
15
+ MzQ4MDZkMGZlNGM4NDQ5NTMxMDRlY2M4OTczYTQxMWU4ODI5MjA=
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ *~
4
+ .*.swp
5
+ .DS_Store
6
+ /.bundle
7
+ /.config
8
+ /.yardoc
9
+ /Gemfile.lock
10
+ /InstalledFiles
11
+ /coverage
12
+ /doc/public
13
+ /lib/bundler/man
14
+ /pkg
15
+ /spec/reports
16
+ /tmp
17
+ /vendor/cache
18
+ /.rbx
@@ -0,0 +1,12 @@
1
+ ---
2
+ bundler_args: --without developer_workstation
3
+ script: bundle exec thor test:ci
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - jruby-19mode
8
+ - jruby-head
9
+ - rbx-19mode
10
+ notifications:
11
+ hipchat:
12
+ secure: BdOAQHgi1RaQk8OyBbZzlgmrxVIF8RSYmDytZct4ynLrh8N19I/NeXTRFsnBlIcvRkWfrkztQ9YiGDS/IWoVvfLIz6Z3JJuDCE5AfrDdBFHRgjy0EeSxFoQYiKoaXkafdzCeN7lKs1uquU7SvFgE8o1zV9KiqYB2BuDqPkru3Kc=
@@ -0,0 +1,6 @@
1
+ # Changes
2
+
3
+ ## 0.0.1
4
+
5
+ * Initial release
6
+ * Created on Tuesday, 2013-07-23
@@ -0,0 +1,43 @@
1
+ # Contributing
2
+
3
+ ## Developing
4
+
5
+ 1. Fork the repository on GitHub
6
+ 2. Create your feature branch (`git checkout -b feature/awesomeness`)
7
+ 3. Create your changes.
8
+ * Add test cases in `spec/`. It's best if you first write a failing
9
+ test case, commit it, and then fix it in next commit - this makes
10
+ the whole change easier to review.
11
+ * Document your changes.
12
+ 4. Commit your changes (`git commit -am 'Add more awesomeness'`)
13
+ 5. Push to the branch (`git push -u origin feature/awesomeness`)
14
+ 6. Create new Pull Request on GitHub
15
+
16
+ ## Testing
17
+
18
+ ### Install what's needed
19
+
20
+ Make sure you have [http://gembundler.com/](Gem Bundler) version 1.3
21
+ or greater installed. If in doubt, just use [http://rvm.io/](RVM) or
22
+ [http://rbenv.org/](rbenv).
23
+
24
+ $ gem install bundler
25
+
26
+ Clone the project:
27
+
28
+ $ git clone git://github.com/3ofcoins/tinyconfig.git
29
+
30
+ Then, run:
31
+
32
+ $ cd tinyconfig
33
+ $ bundle install
34
+
35
+ Bundler will install all the needed gems and their dependencies.
36
+
37
+ ### Running tests
38
+
39
+ $ bundle exec thor spec
40
+
41
+ To generate test coverage report, tell it to Thor
42
+
43
+ $ bundle exec thor spec --coverage
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ # Helpers used with development, but not needed in runtime, build
6
+ # time, or for tests.
7
+ group :developer_workstation do
8
+ gem 'awesome_print'
9
+ gem 'pry'
10
+ gem 'pry-debugger'
11
+ gem 'pry-rescue'
12
+ gem 'pry-stack_explorer'
13
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (C) 2013 Maciej Pasternacki <maciej@3ofcoins.net>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,149 @@
1
+ # Tinyconfig
2
+
3
+ TinyConfig provides a base class to create a Ruby configuration file
4
+ loader.
5
+
6
+ The resulting configuration file is usable for people not familiar
7
+ with Ruby, but it is possible for a power user to use full power of
8
+ Ruby to script the configuration
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'tinyconfig'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install tinyconfig
23
+
24
+ ## Usage
25
+
26
+ First, define your configuration class by creating a subclass of
27
+ `TinyConfig`. Use `option` method to define known options. You may
28
+ provide a default value as a second argument, and a
29
+ validator/postprocessing as a block.
30
+
31
+ The block receives one argument: value as provided by user. It should
32
+ raise `::ArgumentError` if the provided value is invalid, and return
33
+ the desired value otherwise. See the `example/hello.rb` file for a
34
+ sample usage:
35
+
36
+ ```ruby
37
+ require 'tinyconfig'
38
+
39
+ class HelloConfig < TinyConfig
40
+ option :recipient, 'World'
41
+
42
+ option :repeat, 1 do |value|
43
+ int_value = value.to_i
44
+ if int_value < 1
45
+ raise ::ArgumentError, "#{value.inspect} is not a number or is less than 1"
46
+ end
47
+ int_value
48
+ end
49
+
50
+ option :extra_greeting
51
+ end
52
+
53
+ cfg = HelloConfig.new
54
+ cfg.load ARGV.first if ARGV.first
55
+
56
+ cfg.repeat.times do
57
+ puts "Hello, #{cfg.recipient}!"
58
+ end
59
+ puts cfg.extra_greeting if cfg.extra_greeting
60
+ ```
61
+
62
+ ```
63
+ $ ruby hello.rb
64
+ Hello, World!
65
+ $ cat config1.rb
66
+ recipient 'You'
67
+ $ ruby hello.rb config1.rb
68
+ Hello, You!
69
+ $ cat config2.rb
70
+ repeat 3
71
+ $ ruby hello.rb config2.rb
72
+ Hello, World!
73
+ Hello, World!
74
+ Hello, World!
75
+ $ cat config3.rb
76
+ repeat '2'
77
+ extra_greeting 'Really, hello!'
78
+ $ ruby hello.rb config3.rb
79
+ Hello, World!
80
+ Hello, World!
81
+ Really, hello!
82
+ $ cat config-invalid.rb
83
+ repeat 'whatever'
84
+ $ ruby hello.rb config-invalid.rb
85
+ hello.rb:9:in `block in <class:HelloConfig>': "whatever" is not a number or is less than 1 (ArgumentError)
86
+ from /Users/japhy/Projekty/tinyconfig/lib/tinyconfig.rb:16:in `call'
87
+ from /Users/japhy/Projekty/tinyconfig/lib/tinyconfig.rb:16:in `block in option'
88
+ from ./config-invalid.rb:in `load'
89
+ from /Users/japhy/Projekty/tinyconfig/lib/tinyconfig.rb:36:in `instance_eval'
90
+ from /Users/japhy/Projekty/tinyconfig/lib/tinyconfig.rb:36:in `load'
91
+ from hello.rb:18:in `<main>'
92
+ ```
93
+
94
+ You can use the `load` method multiple times from your code, or you
95
+ can `load` other files from your config files. The method also accepts
96
+ glob expressions (e.g. `load 'config_*.rb'`). The `bulk_load` method load all files
97
+ in the directory next to current config file, of the same name as current config.
98
+
99
+ Example: If file `foo.rb` calls:
100
+
101
+ `bulk_load`
102
+
103
+ it should do the same as
104
+
105
+ `load 'foo/*.rb'`
106
+
107
+ You can also use `cfg.configure` method to update the configuration
108
+ inline in a block.
109
+
110
+ When you provide a lambda as a default or provided value, it will be
111
+ called at runtime to determine the value. This way you can use
112
+ settings that are not yet specified when the config file is being
113
+ read:
114
+
115
+ ```ruby
116
+ class LambdaExample < TinyConfig
117
+ option :foo
118
+ option :bar, ->{ "Bar for foo=#{foo.inspect}" }
119
+ option :baz
120
+ end
121
+
122
+ cfg = LambdaExample.new
123
+ cfg.bar # => "Bar for foo=nil"
124
+
125
+ cfg.configure do
126
+ foo 23
127
+ end
128
+ cfg.bar # => "Bar for foo=23"
129
+
130
+ cfg.configure do
131
+ baz ->{ bar.reverse }
132
+ end
133
+ cfg.baz # => "32=oof rof raB"
134
+ ```
135
+
136
+ For details and corner cases, look into `spec/` for the test cases.
137
+
138
+ ## Acknowledements
139
+
140
+ TinyConfig has been heavily inspired by Opscode's
141
+ [Mixlib::Config](https://github.com/opscode/mixlib-config). We chose
142
+ to implement our own tool, because `Mixlib::Config` configuration is
143
+ global, which makes it very hard to provide isolation between test
144
+ cases in the unit tests. TinyConfig is instance-based, which is easier
145
+ to manage locally.
146
+
147
+ ## Contributing
148
+
149
+ See the [CONTRIBUTING.md](CONTRIBUTING.md) file
@@ -0,0 +1,60 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+ require 'rubygems'
3
+
4
+ require 'bundler/setup'
5
+
6
+ require 'rake/testtask'
7
+ require 'thor/rake_compat'
8
+
9
+ class Default < Thor
10
+ class Gem < Thor
11
+ namespace :gem
12
+
13
+ include Thor::RakeCompat
14
+ Bundler::GemHelper.install_tasks
15
+
16
+ desc "build", "Build tinyconfig-#{TinyConfig::VERSION}.gem into the pkg directory"
17
+ def build
18
+ Rake::Task["build"].execute
19
+ end
20
+
21
+ desc "release", "Create tag v#{TinyConfig::VERSION} and build and push tinyconfig-#{TinyConfig::VERSION}.gem to Rubygems"
22
+ def release
23
+ Rake::Task["release"].execute
24
+ end
25
+
26
+ desc "install", "Build and install tinyconfig-#{TinyConfig::VERSION}.gem into system gems"
27
+ def install
28
+ Rake::Task["install"].execute
29
+ end
30
+ end
31
+
32
+ class Test < Thor
33
+ namespace :test
34
+ default_command :all
35
+
36
+ include Thor::RakeCompat
37
+
38
+ Rake::TestTask.new :spec do |task|
39
+ task.libs << 'spec'
40
+ task.test_files = FileList['spec/**/*_spec.rb']
41
+ end
42
+
43
+ desc 'spec', 'Run specs'
44
+ def spec
45
+ Rake::Task['spec'].execute
46
+ end
47
+
48
+ desc 'all', 'Run all tests'
49
+ def all
50
+ invoke(:spec)
51
+ end
52
+
53
+ desc 'ci', 'Run all tests for continuous integration'
54
+ def ci
55
+ ENV['CI'] = 'true'
56
+ invoke(:all)
57
+ end
58
+ end
59
+ end
60
+
@@ -0,0 +1 @@
1
+ repeat 'whatever'
@@ -0,0 +1 @@
1
+ recipient 'You'
@@ -0,0 +1 @@
1
+ repeat 3
@@ -0,0 +1,2 @@
1
+ repeat '2'
2
+ extra_greeting 'Really, hello!'
@@ -0,0 +1,23 @@
1
+ require 'tinyconfig'
2
+
3
+ class HelloConfig < TinyConfig
4
+ option :recipient, 'World'
5
+
6
+ option :repeat, 1 do |value|
7
+ int_value = value.to_i
8
+ if int_value < 1
9
+ raise ::ArgumentError, "#{value.inspect} is not a number or is less than 1"
10
+ end
11
+ int_value
12
+ end
13
+
14
+ option :extra_greeting
15
+ end
16
+
17
+ cfg = HelloConfig.new
18
+ cfg.load ARGV.first if ARGV.first
19
+
20
+ cfg.repeat.times do
21
+ puts "Hello, #{cfg.recipient}!"
22
+ end
23
+ puts cfg.extra_greeting if cfg.extra_greeting
@@ -0,0 +1,18 @@
1
+ class LambdaExample < TinyConfig
2
+ option :foo
3
+ option :bar, ->{ "Bar for foo=#{foo.inspect}" }
4
+ option :baz
5
+ end
6
+
7
+ cfg = LambdaExample.new
8
+ cfg.bar # => "Bar for foo=nil"
9
+
10
+ cfg.configure do
11
+ foo 23
12
+ end
13
+ cfg.bar # => "Bar for foo=23"
14
+
15
+ cfg.configure do
16
+ baz ->{ bar.reverse }
17
+ end
18
+ cfg.baz # => "32=oof rof raB"
@@ -0,0 +1,94 @@
1
+ require "tinyconfig/version"
2
+
3
+ class TinyConfig < BasicObject
4
+ class << self
5
+ #
6
+ # ### Define new option
7
+ def option(option_name, default=nil, &block)
8
+ option_name = option_name.to_sym
9
+ getter_name = "__get__#{option_name}".to_sym
10
+ validator = block_given? ? block : nil
11
+
12
+ # Private getter method for the default
13
+ # http://www.bofh.org.uk/2007/08/16/a-cunning-evil-trick-with-ruby
14
+ meth = default.respond_to?(:call) ? default : ->{ default }
15
+ define_method(getter_name, &meth)
16
+ private(getter_name)
17
+
18
+ define_method option_name do |*args|
19
+ if args.length.zero?
20
+ # No args -> get value
21
+ self.__send__(getter_name)
22
+ else
23
+ # Args provided -> set value (i.e. define getter method on the singleton)
24
+ if validator
25
+ value = validator.call(*args)
26
+ elsif args.length == 1
27
+ value = args.first
28
+ else
29
+ value = args
30
+ end
31
+ meth = value.respond_to?(:call) ? value : ->{ value }
32
+ (class << self ; self ; end).send(:define_method, getter_name, &meth)
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ # make arrow lambdas work on Rubinius
39
+ if ::RUBY_ENGINE == 'rbx'
40
+ def lambda(*args, &block)
41
+ ::Kernel.lambda(*args, &block)
42
+ end
43
+ end
44
+
45
+ def initialize
46
+ @_values = {}
47
+ end
48
+
49
+ def configure(&block)
50
+ self.instance_eval(&block)
51
+ end
52
+
53
+ def load(glob)
54
+ # If glob is relative, we want to interpret it relative to the
55
+ # calling file (directory that contains the ruby source file that
56
+ # has called the `TinyConfig#load` method) rather than whatever is
57
+ # the process' `Dir.getwd`.
58
+
59
+ glob = ::File.expand_path(glob, ::File.dirname(::Kernel.caller.first))
60
+ load_helper(glob)
61
+ end
62
+
63
+ def bulk_load
64
+ caller_path = ::Kernel.caller.first.sub(/(:\d+)?(:in .*)?$/, '')
65
+ directory_name = ::File.join(
66
+ ::File.dirname(caller_path),
67
+ ::File.basename(caller_path, ".rb"))
68
+ bulk_glob = ::File.join(directory_name, "*.rb")
69
+ load_helper(bulk_glob)
70
+ end
71
+
72
+ #
73
+ # Compat methods
74
+ # --------------
75
+
76
+ def inspect
77
+ _values = @_values.sort.map { |k,v| " #{k}=#{v.inspect}" }.join
78
+ "#<#{__realclass__}#{_values}>"
79
+ end
80
+
81
+ alias_method :to_s, :inspect
82
+
83
+ private
84
+
85
+ def load_helper(source)
86
+ ::Dir.glob(source).sort.each do |path|
87
+ self.instance_eval(::File.read(path), path, 0)
88
+ end
89
+ end
90
+
91
+ def __realclass__
92
+ (class << self; self end).superclass
93
+ end
94
+ end
@@ -0,0 +1,3 @@
1
+ class TinyConfig < BasicObject
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1 @@
1
+ opt 23
@@ -0,0 +1 @@
1
+ load 'basic.rb'
@@ -0,0 +1 @@
1
+ bulk_load
@@ -0,0 +1 @@
1
+ opt 23
@@ -0,0 +1 @@
1
+ opt 17
@@ -0,0 +1 @@
1
+ opt 23
@@ -0,0 +1 @@
1
+ opt 17
@@ -0,0 +1,60 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'minitest/autorun'
5
+ require 'minitest/spec'
6
+ require 'mocha/setup'
7
+ require 'wrong'
8
+
9
+ Wrong.config.alias_assert :expect, override: true
10
+
11
+ module TinyConfigSpec
12
+ module WrongHelper
13
+ include Wrong::Assert
14
+ include Wrong::Helpers
15
+
16
+ def failure_class
17
+ MiniTest::Assertion
18
+ end
19
+
20
+ def increment_assertion_count
21
+ self.assertions += 1
22
+ end
23
+ end
24
+ end
25
+
26
+ class MiniTest::Spec
27
+ include TinyConfigSpec::WrongHelper
28
+
29
+ def fixture(filename)
30
+ File.join(File.dirname(__FILE__), 'fixtures', filename)
31
+ end
32
+ end
33
+
34
+ if ENV['COVERAGE']
35
+ require 'simplecov'
36
+ SimpleCov.start
37
+ SimpleCov.command_name 'rake spec'
38
+ end
39
+
40
+ # Make TinyConfig pretty-printable.
41
+ require "tinyconfig"
42
+ class TinyConfig
43
+ begin
44
+ old_verbose, $VERBOSE = $VERBOSE, nil
45
+ def object_id ; __id__ ; end
46
+ ensure
47
+ $VERBOSE = old_verbose
48
+ end
49
+
50
+ def class
51
+ __realclass__
52
+ end
53
+
54
+ def pretty_print(pp)
55
+ pp.object_address_group(self) do
56
+ pp.breakable
57
+ pp.pp_hash(@_values)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ class TinyConfig
4
+ describe VERSION do
5
+ it 'is equal to itself' do
6
+ expect { VERSION == ::TinyConfig::VERSION }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ class LambdaExample < TinyConfig
4
+ option :foo
5
+ option :bar, ->{ "Bar for foo=#{foo.inspect}" }
6
+ option :baz
7
+ end
8
+
9
+ describe TinyConfig do
10
+ let(:cfg) { LambdaExample.new }
11
+
12
+ it "evaluates lambda default in runtime" do
13
+ expect { cfg.bar == "Bar for foo=nil" }
14
+ cfg.configure do
15
+ foo 23
16
+ end
17
+ expect { cfg.bar == "Bar for foo=23" }
18
+ end
19
+
20
+ it "evaluates lambda value in runtime" do
21
+ cfg.configure do
22
+ baz ->{ bar.reverse }
23
+ end
24
+
25
+ expect { cfg.baz == "lin=oof rof raB" }
26
+
27
+ cfg.configure do
28
+ foo 23
29
+ end
30
+ expect { cfg.baz == "32=oof rof raB" }
31
+ end
32
+
33
+ it "sets instance methods rather than class methods" do
34
+ cfg2 = LambdaExample.new
35
+ cfg.configure do
36
+ foo 23
37
+ end
38
+ expect { cfg.foo == 23 }
39
+ expect { cfg.bar == "Bar for foo=23" }
40
+ expect { cfg2.foo.nil? }
41
+ expect { cfg2.bar == "Bar for foo=nil" }
42
+ end
43
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ class BasicIdea < TinyConfig
4
+ option :opt
5
+ option :defopt, 23
6
+ end
7
+
8
+ describe TinyConfig do
9
+ let(:cfg) { BasicIdea.new }
10
+
11
+ describe ".option" do
12
+ it "defaults options' values to nil" do
13
+ expect { cfg.opt.nil? }
14
+ end
15
+
16
+ it "sets default to a provided value" do
17
+ expect { cfg.defopt == 23 }
18
+ end
19
+ end
20
+
21
+ describe "#configure" do
22
+ it "configures in a block" do
23
+ cfg.configure do
24
+ opt 23
25
+ end
26
+
27
+ expect { cfg.opt == 23 }
28
+ end
29
+ end
30
+
31
+ describe "#load" do
32
+ it "loads configuration from file relative to the caller" do
33
+ cfg.load("fixtures/basic.rb")
34
+ expect { cfg.opt == 23 }
35
+ end
36
+
37
+ it "can be nested" do
38
+ cfg.load("fixtures/basic_nested.rb")
39
+ expect { cfg.opt == 23 }
40
+ end
41
+
42
+ it "can load files by a glob expression" do
43
+ cfg.load("fixtures/glob*.rb")
44
+ expect { cfg.opt == 17 }
45
+ end
46
+
47
+ it 'will handle absolute paths/globs correctly' do
48
+ cfg.load(File.join(File.dirname(__FILE__), 'fixtures/basic.rb'))
49
+ expect { cfg.opt == 23 }
50
+
51
+ cfg.load(File.join(File.dirname(__FILE__), 'fixtures/basic_nested.rb'))
52
+ expect { cfg.opt == 23 }
53
+
54
+ cfg.load(File.join(File.dirname(__FILE__), 'fixtures/glob*.rb'))
55
+ expect { cfg.opt == 17 }
56
+ end
57
+ end
58
+
59
+ describe "#bulk_load" do
60
+ it "loads all files in the directory next to current config file, of the same name as current config" do
61
+ cfg.load("fixtures/directory.rb")
62
+ expect { cfg.opt == 17 }
63
+ end
64
+ end
65
+
66
+ describe "(configuration block)" do
67
+ it "raises an exception when somebody tries to set undefined value" do
68
+ expect { rescuing { cfg.configure { nopt -1 } }.is_a? NoMethodError }
69
+ end
70
+
71
+ it "overrides default values" do
72
+ cfg.configure { defopt 17 }
73
+ expect { cfg.defopt == 17 }
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ class ValidatingConfig < TinyConfig
4
+ option :integer do |value|
5
+ if value.strip !~ /^[-\d]/
6
+ raise ::ArgumentError, "Not an integer: #{value.inspect}"
7
+ else
8
+ value.to_i
9
+ end
10
+ end
11
+ end
12
+
13
+ describe TinyConfig do
14
+ let(:cfg) { ValidatingConfig.new }
15
+
16
+ it 'calls provided block to transform and/or validate value' do
17
+ cfg.configure do
18
+ integer '23'
19
+ end
20
+ expect { cfg.integer == 23 }
21
+ end
22
+
23
+ it 'can raise exception from the validation block' do
24
+ expect do
25
+ rescuing do
26
+ cfg.configure do
27
+ integer 'dupa'
28
+ end
29
+ end.is_a?(ArgumentError)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ # -*- mode: ruby; coding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'tinyconfig/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "tinyconfig"
8
+ spec.version = TinyConfig::VERSION
9
+ spec.authors = ["Maciej Pasternacki"]
10
+ spec.email = ["maciej@3ofcoins.net"]
11
+ spec.description = "Library for defining Ruby-based configuration files"
12
+ spec.summary = "Library for defining Ruby-based configuration files"
13
+ spec.homepage = "https://github.com/3ofcoins/tinyconfig/"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "minitest"
23
+ spec.add_development_dependency "mocha"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "simplecov"
26
+ spec.add_development_dependency "thor", "~> 0.18.1"
27
+ spec.add_development_dependency "wrong", ">= 0.7.0"
28
+ end
metadata ADDED
@@ -0,0 +1,183 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tinyconfig
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Maciej Pasternacki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mocha
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
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'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 0.18.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 0.18.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: wrong
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.7.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.7.0
111
+ description: Library for defining Ruby-based configuration files
112
+ email:
113
+ - maciej@3ofcoins.net
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - .gitignore
119
+ - .travis.yml
120
+ - CHANGELOG.md
121
+ - CONTRIBUTING.md
122
+ - Gemfile
123
+ - LICENSE
124
+ - README.md
125
+ - Thorfile
126
+ - example/config-invalid.rb
127
+ - example/config1.rb
128
+ - example/config2.rb
129
+ - example/config3.rb
130
+ - example/hello.rb
131
+ - example/lambda.rb
132
+ - lib/tinyconfig.rb
133
+ - lib/tinyconfig/version.rb
134
+ - spec/fixtures/basic.rb
135
+ - spec/fixtures/basic_nested.rb
136
+ - spec/fixtures/directory.rb
137
+ - spec/fixtures/directory/config1.rb
138
+ - spec/fixtures/directory/config2.rb
139
+ - spec/fixtures/glob1.rb
140
+ - spec/fixtures/glob2.rb
141
+ - spec/spec_helper.rb
142
+ - spec/tinyconfig/version_spec.rb
143
+ - spec/tinyconfig_lambda_spec.rb
144
+ - spec/tinyconfig_spec.rb
145
+ - spec/tinyconfig_validation_spec.rb
146
+ - tinyconfig.gemspec
147
+ homepage: https://github.com/3ofcoins/tinyconfig/
148
+ licenses:
149
+ - MIT
150
+ metadata: {}
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ required_rubygems_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubyforge_project:
167
+ rubygems_version: 2.0.5
168
+ signing_key:
169
+ specification_version: 4
170
+ summary: Library for defining Ruby-based configuration files
171
+ test_files:
172
+ - spec/fixtures/basic.rb
173
+ - spec/fixtures/basic_nested.rb
174
+ - spec/fixtures/directory.rb
175
+ - spec/fixtures/directory/config1.rb
176
+ - spec/fixtures/directory/config2.rb
177
+ - spec/fixtures/glob1.rb
178
+ - spec/fixtures/glob2.rb
179
+ - spec/spec_helper.rb
180
+ - spec/tinyconfig/version_spec.rb
181
+ - spec/tinyconfig_lambda_spec.rb
182
+ - spec/tinyconfig_spec.rb
183
+ - spec/tinyconfig_validation_spec.rb