muster 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -12,6 +12,7 @@ easier consumption in things like AR/DataMapper scopes and queries, making API d
12
12
  query = env['muster.query']
13
13
 
14
14
  @people = Person.select( query[:select] ).order( query[:order] )
15
+ @people = Person.select( query.select ).order( query.order )
15
16
 
16
17
  ## Strategies
17
18
 
@@ -7,6 +7,7 @@ module Muster
7
7
  # Query parsed results helper class
8
8
  #
9
9
  # As with most Muster classes, all hashes returned and options specified support with indifferent access.
10
+ # You can also access results using the dot notation for the key name.
10
11
  #
11
12
  # @param data [Hash] the hash of query string results after parsing to load
12
13
  #
@@ -17,6 +18,8 @@ module Muster
17
18
  #
18
19
  # # Filter values one at a time
19
20
  # results.data #=> { 'select' => [:id, :name, :created_at] }
21
+ # results[:select] #=> [:id, :name, :created_at]
22
+ # results.select #=> [:id, :name, :created_at]
20
23
  # results.filter(:select, :only => [:id, :name]) #=> [:id, :name]
21
24
  # results.filter(:select, :except => :created_at) #=> [:id, :name]
22
25
  # results.filter(:page, 1) #=> 1
@@ -26,6 +29,8 @@ module Muster
26
29
  # results.add_filter(:select, :only => [:id, :name])
27
30
  # results.add_filter(:page, 1)
28
31
  # results.filtered #=> { 'select' => [:id, :name], 'page' => 1 }
32
+ # results.filtered[:select] #=> [:id, :name]
33
+ # results.filtered.select #=> [:id, :name]
29
34
  class Results < ActiveSupport::HashWithIndifferentAccess
30
35
 
31
36
  # @attribute [r] data
@@ -75,8 +80,8 @@ module Muster
75
80
  #
76
81
  # @example
77
82
  #
78
- # results.add_filter(:select, :only => [:id, :name]
79
- # results.add_filter(:select, :except => [:id]
83
+ # results.add_filter(:select, :only => [:id, :name])
84
+ # results.add_filter(:select, :except => [:id])
80
85
  # results.add_filter(:page, 1)
81
86
  def add_filter( key, *options )
82
87
  self.filters[key] = options
@@ -90,7 +95,7 @@ module Muster
90
95
  #
91
96
  # @example
92
97
  #
93
- # results.add_filter(:select, :only => [:id, :name]
98
+ # results.add_filter(:select, :only => [:id, :name])
94
99
  # results.add_dilter(:page, 1)
95
100
  # results.filtered #=> { 'select' => [:id, :name], 'page' => 1 }
96
101
  def filtered
@@ -127,13 +132,13 @@ module Muster
127
132
  #
128
133
  # @example
129
134
  #
130
- # data = { :select => [:id, :name, :created_at]
135
+ # data = { :select => [:id, :name, :created_at] }
131
136
  # results = Muster::Results.new(data)
132
- # results.filter(:select) #=> [:id, :name, :created_at]
133
- # results.filter(:select, :only => :name) #=> :name
134
- # results.filter(:select, :only => [:other, :name] #=> [:name]
135
- # results.filter(:other, :default) #=> :default
136
- # results.filter(:other) #=> KeyError
137
+ # results.filter(:select) #=> [:id, :name, :created_at]
138
+ # results.filter(:select, :only => :name) #=> :name
139
+ # results.filter(:select, :only => [:other, :name]) #=> [:name]
140
+ # results.filter(:other, :default) #=> :default
141
+ # results.filter(:other) #=> KeyError
137
142
  def filter( key, *options )
138
143
  if options.present? && options.first.instance_of?(Hash)
139
144
  options = options.first.with_indifferent_access
@@ -150,6 +155,20 @@ module Muster
150
155
 
151
156
  private
152
157
 
158
+ def method_missing(meth, *args, &block)
159
+ if self.has_key?(meth)
160
+ value = self[meth]
161
+
162
+ if value.kind_of?(Hash)
163
+ value = OpenStruct.new(value)
164
+ end
165
+
166
+ return value
167
+ end
168
+
169
+ super
170
+ end
171
+
153
172
  def filter_excluded_values( key, excluded )
154
173
  value = self[key]
155
174
  excluded = Array.wrap(excluded)
@@ -1,4 +1,4 @@
1
1
  module Muster
2
2
  # Current version of Muster
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
data/muster.gemspec CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |gem|
18
18
  gem.add_dependency 'activesupport', '~> 3.0'
19
19
  gem.add_dependency 'rack', '~> 1.4'
20
20
 
21
+ gem.add_development_dependency 'pry'
21
22
  gem.add_development_dependency 'rspec', '~> 2.11.0'
22
23
  gem.add_development_dependency 'redcarpet', '~> 2.1'
23
24
  gem.add_development_dependency 'simplecov'
@@ -84,4 +84,37 @@ describe Muster::Results do
84
84
  end
85
85
  end
86
86
  end
87
+
88
+ describe '#method_missing' do
89
+ context 'with matching key' do
90
+ it 'returns the value of the key index' do
91
+ results.name.should eq results[:name]
92
+ results.name.should eq [1, 2, 3]
93
+ end
94
+
95
+ it 'returns an OpenStruct for a hash' do
96
+ data[:pagination] = {:page => 1, :per_page => 10}
97
+
98
+ results.pagination.should be_an_instance_of(OpenStruct)
99
+ results.pagination.page.should eq 1
100
+ results.pagination.per_page.should eq 10
101
+ end
102
+ end
103
+
104
+ context 'without matching key' do
105
+ it 'returns NoMethodError' do
106
+ expect{ results.foop }.to raise_error(NoMethodError)
107
+ end
108
+ end
109
+
110
+ context 'with filtered results' do
111
+ it 'returns Results with method_missing support' do
112
+ data[:name] = [1, 2, 3]
113
+
114
+ results.add_filter(:name, :only => [1])
115
+ results.filtered.name.should eq [1]
116
+ results.filtered[:name].should eq [1]
117
+ end
118
+ end
119
+ end
87
120
  end
data/spec/spec_helper.rb CHANGED
@@ -3,6 +3,7 @@ if ENV['COVERAGE']
3
3
  SimpleCov.start
4
4
  end
5
5
 
6
+ require 'pry'
6
7
  require 'rack/mock'
7
8
  require 'muster'
8
9
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: muster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-06 00:00:00.000000000 Z
12
+ date: 2012-12-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &70339120081800 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70339120081800
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: rack
27
- requirement: &70339120081080 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,10 +37,31 @@ dependencies:
32
37
  version: '1.4'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70339120081080
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.4'
46
+ - !ruby/object:Gem::Dependency
47
+ name: pry
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
36
62
  - !ruby/object:Gem::Dependency
37
63
  name: rspec
38
- requirement: &70339120080560 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
39
65
  none: false
40
66
  requirements:
41
67
  - - ~>
@@ -43,10 +69,15 @@ dependencies:
43
69
  version: 2.11.0
44
70
  type: :development
45
71
  prerelease: false
46
- version_requirements: *70339120080560
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.11.0
47
78
  - !ruby/object:Gem::Dependency
48
79
  name: redcarpet
49
- requirement: &70339120080100 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
50
81
  none: false
51
82
  requirements:
52
83
  - - ~>
@@ -54,10 +85,15 @@ dependencies:
54
85
  version: '2.1'
55
86
  type: :development
56
87
  prerelease: false
57
- version_requirements: *70339120080100
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '2.1'
58
94
  - !ruby/object:Gem::Dependency
59
95
  name: simplecov
60
- requirement: &70339120079660 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
61
97
  none: false
62
98
  requirements:
63
99
  - - ! '>='
@@ -65,10 +101,15 @@ dependencies:
65
101
  version: '0'
66
102
  type: :development
67
103
  prerelease: false
68
- version_requirements: *70339120079660
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
69
110
  - !ruby/object:Gem::Dependency
70
111
  name: yard
71
- requirement: &70339120079120 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
72
113
  none: false
73
114
  requirements:
74
115
  - - ~>
@@ -76,7 +117,12 @@ dependencies:
76
117
  version: 0.8.2
77
118
  type: :development
78
119
  prerelease: false
79
- version_requirements: *70339120079120
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.8.2
80
126
  description: Muster is a gem that turns query strings of varying formats into data
81
127
  structures suitable for easier consumption in AR/DataMapper scopes and queries.
82
128
  email:
@@ -133,7 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
179
  version: '0'
134
180
  requirements: []
135
181
  rubyforge_project:
136
- rubygems_version: 1.8.16
182
+ rubygems_version: 1.8.24
137
183
  signing_key:
138
184
  specification_version: 3
139
185
  summary: Muster various query string formats into a more reusable data structure.