chooser 0.0.1

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: 400914377a1ff29eecb4968892ed4ca23ba3765c
4
+ data.tar.gz: 5d825e61dc9212243384b286cf8efad66532f001
5
+ SHA512:
6
+ metadata.gz: 19187b4739a791535150822ae36d12e91aeaca23ec726760faa99c1233d8dc8531485f93b38540fbb4747af9c5f8f9464cb45761b59fcaa221adb9b7892b671f
7
+ data.tar.gz: 7a5b50a163549081e75454ed799063738ae9b755c7930df1deec100ca925ba58525ade2fab90c156699766ce5474984d4832eea356737114d0fafe22eeec0858
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/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in chooser.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Alexander Avoyants
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,64 @@
1
+ # Chooser
2
+
3
+ Provides short interface for choosig elements from array of structs.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'chooser'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install chooser
18
+
19
+ ## Usage
20
+
21
+ Given array of struct kind objects.
22
+
23
+ ```rb
24
+ Person = Struct.new(:name, :profession, :address, :age)
25
+
26
+ alex = Person.new("Alex", "Programmer", "123 Maple, Anytown NC", 27)
27
+ dave = Person.new("Dave", "Programmer", "236 Main", 32)
28
+ nick = Person.new("Nick", "Designer", "237 Main st.", 29)
29
+ jack = Person.new("Jack", "QA", "1010 Center st.", 29)
30
+
31
+ people = [alex, dave, nick, jack]
32
+ ```
33
+
34
+ Filtering elements by attribute equality.
35
+
36
+ ```rb
37
+ people.choose(:profession => "Programmer") # => [alex, dave]
38
+ ```
39
+
40
+ Filtering elements by attribute equality and inclusion.
41
+
42
+ ```rb
43
+ people.choose(:profession => "Designer", :age => (29..32)) # => [nick]
44
+ ```
45
+
46
+ Filtering elements by matching regexp.
47
+
48
+ ```rb
49
+ people.choose(:address => /Main/) # => [dave, nick]
50
+ ```
51
+
52
+ Filtering elements by instance evaluating string.
53
+
54
+ ```rb
55
+ people.choose("age >= 29") # => [dave, nick, jack]
56
+ ```
57
+
58
+ ## Contributing
59
+
60
+ 1. Fork it ( http://github.com/<my-github-username>/chooser/fork )
61
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
62
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
63
+ 4. Push to the branch (`git push origin my-new-feature`)
64
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ task default: :spec
data/chooser.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 'chooser/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "chooser"
8
+ spec.version = Chooser::VERSION
9
+ spec.authors = ["Alexander Avoyants"]
10
+ spec.email = ["shhavel@gmail.com"]
11
+ spec.summary = %q{Provides short interface for choosig elements from array of structs.}
12
+ spec.description = %q{Provides short interface for choosig elements from array of structs, e.g. target.choose(:street => "Main", :age => [24..30]) or target.choose("address =~ /Main/")}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
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 "rspec"
24
+ end
@@ -0,0 +1,3 @@
1
+ module Chooser
2
+ VERSION = "0.0.1"
3
+ end
data/lib/chooser.rb ADDED
@@ -0,0 +1,27 @@
1
+ require "chooser/version"
2
+
3
+ module Chooser
4
+ def choose(selector)
5
+ ary = []
6
+ if selector.is_a?(Hash)
7
+ each do |ob|
8
+ ary << ob if selector.all? do |m, v|
9
+ ob.public_send(m) == v ||
10
+ (v.respond_to?(:include?) && v.include?(ob.public_send(m))) ||
11
+ (v.is_a?(Regexp) && v =~ ob.public_send(m))
12
+ end
13
+ end
14
+ elsif selector.is_a?(String)
15
+ each do |ob|
16
+ ary << ob if !!ob.instance_eval(selector)
17
+ end
18
+ else
19
+ raise ArgumentError, 'Supply an options hash (e.g. target.choose :street => "Main", :age => [24..30]) or evaluated string (e.g. target.choose "address =~ /Main/").'
20
+ end
21
+ ary
22
+ end
23
+ end
24
+
25
+ class Array
26
+ include Chooser
27
+ end
@@ -0,0 +1,65 @@
1
+ require "spec_helper"
2
+
3
+ describe "Array#choose" do
4
+ let(:alex) { Person.new("Alex", "Programmer", "123 Maple, Anytown NC", 27) }
5
+ let(:dave) { Person.new("Dave", "Programmer", "236 Main", 32) }
6
+ let(:nick) { Person.new("Nick", "Designer", "237 Main st.", 29) }
7
+ let(:jack) { Person.new("Jack", "QA", "1010 Center st.", 29) }
8
+ let(:people) { [alex, dave, nick, jack] }
9
+
10
+ context "choose elements by attribute equality" do
11
+ it "chooses elements with requested profession" do
12
+ expect(people.choose(:profession => "Programmer")).to match_array([alex, dave])
13
+ end
14
+
15
+ it "chooses elements with requested age" do
16
+ expect(people.choose(:age => 29)).to match_array([nick, jack])
17
+ end
18
+
19
+ it "chooses elements with requested profession and age" do
20
+ expect(people.choose(:profession => "Designer", :age => 29)).to match_array([nick])
21
+ end
22
+
23
+ it "returns empty array if no match found" do
24
+ expect(people.choose(:profession => "Designer", :age => 34)).to eq([])
25
+ end
26
+ end
27
+
28
+ context "choose elements by attribute inclusion" do
29
+ it "chooses elements with age included into requested array" do
30
+ expect(people.choose(:age => [29, 32])).to match_array([dave, nick, jack])
31
+ end
32
+
33
+ it "chooses elements with age included into requested array and with requested profession" do
34
+ expect(people.choose(:age => [29, 32], :profession => "QA")).to match_array([jack])
35
+ end
36
+
37
+ it "chooses elements with age included into requested range and with requested profession" do
38
+ expect(people.choose(:age => (27..29))).to match_array([alex, nick, jack])
39
+ end
40
+
41
+ it "chooses elements with age included into requested range and with matching profession" do
42
+ expect(people.choose(:age => (27..29), :profession => /Designer|QA/)).to match_array([nick, jack])
43
+ end
44
+
45
+ it "chooses elements with natched address" do
46
+ expect(people.choose(:address => /Main/)).to match_array([dave, nick])
47
+ end
48
+ end
49
+
50
+ context "choose elements by passing evaluated string of code" do
51
+ it "chooses elements with matched address" do
52
+ expect(people.choose("address =~ /Main/")).to match_array([dave, nick])
53
+ end
54
+
55
+ it "chooses elements with age less or euqual than requested" do
56
+ expect(people.choose("age <= 29")).to match_array([alex, nick, jack])
57
+ end
58
+ end
59
+
60
+ context "incorrect arguments" do
61
+ it "raises exception if receives incorrect argument" do
62
+ expect { people.choose([27, 29]) }.to raise_error ArgumentError
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,7 @@
1
+ require "chooser"
2
+
3
+ Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
4
+
5
+ RSpec.configure do |config|
6
+ config.mock_with :rspec
7
+ end
@@ -0,0 +1 @@
1
+ Person = Struct.new(:name, :profession, :address, :age)
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chooser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Avoyants
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-16 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: rspec
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
+ description: Provides short interface for choosig elements from array of structs,
56
+ e.g. target.choose(:street => "Main", :age => [24..30]) or target.choose("address
57
+ =~ /Main/")
58
+ email:
59
+ - shhavel@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".gitignore"
65
+ - Gemfile
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - chooser.gemspec
70
+ - lib/chooser.rb
71
+ - lib/chooser/version.rb
72
+ - spec/chooser_spec.rb
73
+ - spec/spec_helper.rb
74
+ - spec/support/person.rb
75
+ homepage: ''
76
+ licenses:
77
+ - MIT
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 2.2.2
96
+ signing_key:
97
+ specification_version: 4
98
+ summary: Provides short interface for choosig elements from array of structs.
99
+ test_files:
100
+ - spec/chooser_spec.rb
101
+ - spec/spec_helper.rb
102
+ - spec/support/person.rb