optioning 0.0.1.beta

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fc150f3f4fa42753cb3c1011ad5b600ee99161ba
4
+ data.tar.gz: 81fab4b72bd887253736ef73fb4f410c46b70bac
5
+ SHA512:
6
+ metadata.gz: e1755b2e41aa8dd4cb98a9aa04603e9c0670722954ccb711ef6480317ba8d4a070cf30cb01587239a98d99ee8279c4ce670db7ea2bb46a46cc305c3112312c1b
7
+ data.tar.gz: c1072d7a3dd4b834ef7587027f9afc3da134998b5feaa0eae7f3a1da4436dded1b2add9edc2130e71847ce392af650668c39415d947dab658aaddb5ca9733d63
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ script: 'bundle exec rake'
3
+ rvm:
4
+ - 2.1.1
5
+ - 2.0.0
6
+ - 1.9.3
7
+ - jruby-19mode
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in optioning.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Ricardo Valeriano
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,227 @@
1
+ # Optioning
2
+
3
+ An easy way to retrieve, store, filter, transform and deprecate `options` passed
4
+ to a method. Where `options` are the keys our beloved `Hash` as last parameter
5
+ for a method call.
6
+
7
+ ## Status
8
+ [![Gem Version](https://badge.fury.io/rb/optioning.svg)](http://badge.fury.io/rb/hashing)
9
+ [![Build Status](https://travis-ci.org/ricardovaleriano/optioning.svg?branch=master)](http://travis-ci.org/ricardovaleriano/hashing?branch=master)
10
+ [![Code Climate](https://codeclimate.com/github/ricardovaleriano/optioning.png)](https://codeclimate.com/github/ricardovaleriano/hashing)
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ gem 'optioning'
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install optioning
25
+
26
+ ## Contact
27
+
28
+ * API Doc: http://rdoc.info/gems/optioning
29
+ * Bugs, issues and feature requests: https://github.com/ricardovaleriano/optioning/issues
30
+ * Support: http://stackoverflow.com/questions/tagged/optioning-ruby
31
+
32
+ ## Usage
33
+
34
+ Given the following `File` class:
35
+
36
+ ```ruby
37
+ class File
38
+ def initialize(path, commit = nil, content = nil)
39
+ @path, @commit, @content = path, commit, content
40
+ end
41
+ end
42
+ ```
43
+
44
+ And a module called `Hashing`, which defines a method `.serialize` that allow
45
+ you configure which `ivars` should be used to convert instances of `File` into a
46
+ `Hash` like this:
47
+
48
+ ```ruby
49
+ {
50
+ path: @path,
51
+ commit: @commit,
52
+ content: @content
53
+ }
54
+ ```
55
+
56
+ And I can configure a transformation in the values of `path`, `commit` and
57
+ `content` when transforming it into a `Hash` like so:
58
+
59
+ ```ruby
60
+ require 'hashing'
61
+
62
+ class File
63
+ extend Hashing
64
+
65
+ hasherize :path, :commit, to_hash: ->(value) { value.downcase }
66
+ end
67
+ ```
68
+
69
+ As the implementor of this module and the `.hasherize` method, I want to be able
70
+ to use an instance of `Optioning`, so I can store and retrieve the `ivars` and
71
+ the `options` passed to be used along those `ivars`:
72
+
73
+ ```ruby
74
+ module Hashing
75
+ def hasherize(*ivars_and_options)
76
+ @options = Optioning.new ivars_and_options
77
+
78
+ # ...
79
+ end
80
+ end
81
+ ```
82
+
83
+ Now in the `Optioning` instance, I can call the following (among others)
84
+ methods:
85
+
86
+ ```ruby
87
+ @options.raw
88
+ # => [:path, :commit, {to_hash: #<Proc:0x007fa4120bd318@(irb):1 (lambda)>}]
89
+
90
+ @options.values
91
+ # => [:path, :commit]
92
+
93
+ @options.on :to_hash
94
+ # => #<Proc:0x007fa4120bd318@(irb):1 (lambda)>
95
+ ```
96
+
97
+ ### Deprecating options
98
+
99
+ Now, following our example, if you need to deprecat the `:to_hash` option in
100
+ favor of the new `:to` option, you could do:
101
+
102
+ ```ruby
103
+ def hasherize(*ivars_and_options)
104
+ @options = Optioning.new ivars_and_options
105
+ @options.deprecate :to_hash, :to, Date.new(2015, 05, 01)
106
+
107
+ # ...
108
+ end
109
+ ```
110
+
111
+ This will replace the deprecated option `:to_hash` for the new one named `:to`
112
+ so you can do the following invocation to recover the value passed to the
113
+ deprecated `option`:
114
+
115
+ ```ruby
116
+ @options.on :to_hash
117
+
118
+ # => #<Proc:0x007fa4120bd318@(irb):1 (lambda)>
119
+ ```
120
+
121
+ #### Deprecation warnings
122
+
123
+ You can alert your user about those deprecations using the `#deprecated_warn`
124
+ method:
125
+
126
+ ```ruby
127
+ def hasherize(*ivars_and_options)
128
+ @options = Optioning.new ivars_and_options
129
+ @options.deprecate :to_hash, :to
130
+ @options.deprecated_warn
131
+
132
+ # ...
133
+ end
134
+ ```
135
+
136
+ You can inform the date when the deprecation will not be available anymore.
137
+ These date will be parte of the deprecation message:
138
+
139
+ ```ruby
140
+ @options.deprecate :to_hash, :to, Date.new(2015, 05, 01)
141
+ ```
142
+
143
+ Or if you prefer, you can specify a version of your software that pretend to
144
+ remove the deprecated thing:
145
+
146
+ ```ruby
147
+ @options.deprecate :to_hash, :to, "v2.0.0"
148
+ ```
149
+
150
+ ### Ignoring unrecongnized options
151
+
152
+ If you need, you could fitler the options to mantain just the recognized ones
153
+ available. To configure the options that matters to your program, use the method
154
+ `#recognize`. And to warn the user in case a unrecognized option is used, call
155
+ the `#unrecognized_warn` method:
156
+
157
+ ```ruby
158
+ def hasherize(*ivars_and_options)
159
+ @options = Optioning.new ivars_and_options
160
+ @options.recognize :to_hash
161
+ @options.unrecognized_warn
162
+
163
+ # ...
164
+ end
165
+ ```
166
+
167
+ Now, if a user pass an option different than the `:to_hash` one, a warning will
168
+ inform that the option is not recognized and will be ignored.
169
+
170
+ #### Do I Need to register deprecated options as recognized?
171
+
172
+ Fortunatelly no. You just need to register your deprecations as usual:
173
+
174
+ ```ruby
175
+ def hasherize(*ivars_and_options)
176
+ @options = Optioning.new ivars_and_options
177
+ @options.recognize :from
178
+ @options.deprecate :to_hash, :to
179
+ @options.deprecated_warn
180
+ @options.unrecognized_warn
181
+
182
+ # ...
183
+ end
184
+ ```
185
+
186
+ The `#deprecate` method already knows what to do (that is register the `option`
187
+ `:to_hash` as recognized. To sum up, in this last example, the options `:from`
188
+ and `:to` are already recongnized by the `Optioning` instance.
189
+
190
+ ### `#process`
191
+
192
+ The `#process` method will replace all deprecations, warn about them and warn
193
+ about unrecognized options all at once, so you can use it like this:
194
+
195
+ ```ruby
196
+ def hasherize(*ivars_and_options)
197
+ @options = Optioning.new ivars_and_options
198
+ @options.recognize :from
199
+ @options.deprecate :to_hash, :to
200
+ @options.process
201
+
202
+ # ...
203
+ end
204
+ ```
205
+
206
+ ### Fluent interface
207
+
208
+ And finally, just for a matter of taste, `#deprecate`, `#recognize` and
209
+ `#process` returns the `Optioning` instance itself, so you can write the last
210
+ example like this (if you want)
211
+
212
+ ```ruby
213
+ def hasherize(*ivars_and_options)
214
+ @options = Optioning.new(ivars_and_options).recognize(:from)
215
+ @options.deprecate(:to_hash, :to).process
216
+
217
+ # ...
218
+ end
219
+ ```
220
+
221
+ ## Contributing
222
+
223
+ 1. Fork it ( http://github.com/<my-github-username>/optioning/fork )
224
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
225
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
226
+ 4. Push to the branch (`git push origin my-new-feature`)
227
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ Dir[File.join(File.dirname(__FILE__), 'tasks/*.rake')].each { |rake| load rake }
4
+ task default: "test"
@@ -0,0 +1,3 @@
1
+ module Optioning
2
+ VERSION = "0.0.1.beta"
3
+ end
data/lib/optioning.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "optioning/version"
2
+
3
+ module Optioning
4
+ # Your code goes here...
5
+ end
data/optioning.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'optioning/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "optioning"
8
+ spec.version = Optioning::VERSION
9
+ spec.authors = ["Ricardo Valeriano"]
10
+ spec.email = ["ricardo.valeriano@gmail.com"]
11
+ spec.summary = %q{An object oriented way to treat our beloved last parameter: Hash.}
12
+ spec.description = %q{An easy way to retrieve, store, filter and deprecate `options` passed to a method. Where `options` are the keys on our beloved `Hash` as last parameter for a method call.}
13
+ spec.homepage = ""
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.5"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "minitest-reporters", "~> 1.0"
24
+ end
data/tasks/lines.rake ADDED
@@ -0,0 +1,8 @@
1
+ desc 'line number statistics'
2
+ task :lines do
3
+ libdir = File.join File.dirname(__FILE__), 'lib'
4
+ Dir["lib/**/*.rb"].each { |file|
5
+ lines = File.readlines(file).reject { |line| line =~ /^(\s*)#/ }.count
6
+ puts "#{lines.to_s.rjust(3)} in #{file}"
7
+ }
8
+ end
data/tasks/test.rake ADDED
@@ -0,0 +1,26 @@
1
+ desc "run all tests"
2
+
3
+ args = ARGV
4
+ args.shift
5
+ files = args
6
+
7
+ desc "run all the tests"
8
+
9
+ task :test do
10
+ lib = File.expand_path("../lib", __FILE__)
11
+ $: << lib
12
+
13
+ loader = ->(files_list){
14
+ files_list.each do |f|
15
+ if File.directory?(f)
16
+ loader.call(Dir.glob(f + "/**/*_test.rb"))
17
+ else
18
+ load f
19
+ end
20
+ end
21
+ }
22
+
23
+ require_relative "../test/test_helper"
24
+ files = Dir.glob("test/**/*_test.rb") unless files.size > 0
25
+ loader.call(files)
26
+ end
@@ -0,0 +1,5 @@
1
+ require "minitest/autorun"
2
+ require "minitest/reporters"
3
+ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
4
+
5
+ require_relative "../lib/optioning"
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: optioning
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.beta
5
+ platform: ruby
6
+ authors:
7
+ - Ricardo Valeriano
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-07 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.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
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: minitest-reporters
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ description: An easy way to retrieve, store, filter and deprecate `options` passed
56
+ to a method. Where `options` are the keys on our beloved `Hash` as last parameter
57
+ for a method call.
58
+ email:
59
+ - ricardo.valeriano@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - .gitignore
65
+ - .travis.yml
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - lib/optioning.rb
71
+ - lib/optioning/version.rb
72
+ - optioning.gemspec
73
+ - tasks/lines.rake
74
+ - tasks/test.rake
75
+ - test/test_helper.rb
76
+ homepage: ''
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - '>'
92
+ - !ruby/object:Gem::Version
93
+ version: 1.3.1
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.1.11
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: 'An object oriented way to treat our beloved last parameter: Hash.'
100
+ test_files:
101
+ - test/test_helper.rb