muster 0.0.10 → 0.0.11

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.
@@ -4,7 +4,6 @@ require 'muster/strategies/rack'
4
4
 
5
5
  module Muster
6
6
  module Strategies
7
-
8
7
  # Query string parsing strategy with additional value handling options for separating values and uniqueness
9
8
  #
10
9
  # @example
@@ -12,7 +11,6 @@ module Muster
12
11
  # strategy = Muster::Strategies::Hash.new(:unique_values => true, :value_separator => ',')
13
12
  # results = strategy.parse('name=value&choices=1,2,1') #=> { 'name' => 'value', 'choices' => ['1', '2'] }
14
13
  class Hash < Muster::Strategies::Rack
15
-
16
14
  # @attribute [r] value_separator
17
15
  # @return [String,RegEx] when specified, each field value will be split into multiple values using the specified separator
18
16
  attr_reader :value_separator
@@ -34,7 +32,7 @@ module Muster
34
32
  #
35
33
  # strategy = Muster::Strategies::Hash.new(:fields => [:name, :state], :value_separator => '|')
36
34
  # strategy = Muster::Strategies::Hash.new(:unique_values => false)
37
- def initialize( options={} )
35
+ def initialize(options = {})
38
36
  super
39
37
 
40
38
  @unique_values = self.options.fetch(:unique_values, true)
@@ -48,29 +46,29 @@ module Muster
48
46
  # @return [Muster::Results]
49
47
  #
50
48
  # @example
51
- #
49
+ #
52
50
  # results = strategy.parse('name=value&choices=1,2') #=> { 'name' => 'value', 'choices' => ['1', '2'] }
53
- def parse( query_string )
51
+ def parse(query_string)
54
52
  parameters = super
55
53
 
56
54
  parameters.each do |key, value|
57
- if self.value_separator.present?
58
- parameters[key] = self.separate_values(value)
55
+ if value_separator.present?
56
+ parameters[key] = separate_values(value)
59
57
  end
60
58
 
61
- if self.unique_values == true && value.instance_of?(Array)
59
+ if unique_values == true && value.instance_of?(Array)
62
60
  parameters[key].uniq!
63
61
  end
64
62
  end
65
63
 
66
- return parameters
64
+ parameters
67
65
  end
68
66
 
69
67
  protected
70
68
 
71
69
  # Separates values into an Array of values using :values_separator
72
70
  #
73
- # @param value [String,Array] the original query string field value to separate
71
+ # @param values_string [String,Array] the original query string field value to separate
74
72
  #
75
73
  # @return [String,Array] String if a single value exists, Array otherwise
76
74
  #
@@ -78,16 +76,15 @@ module Muster
78
76
  #
79
77
  # value = self.separate_values('1') #=> '1'
80
78
  # value = self.separate_values('1,2') #=> ['1', '2']
81
- def separate_values( value )
82
- values = Array.wrap(value)
79
+ def separate_values(values_string)
80
+ values = Array.wrap(values_string)
83
81
 
84
82
  values = values.map do |value|
85
- value.split(self.value_separator)
83
+ value.split(value_separator)
86
84
  end.flatten
87
85
 
88
- return (values.size > 1) ? values : value
86
+ (values.size > 1) ? values : values_string
89
87
  end
90
-
91
88
  end
92
89
  end
93
90
  end
@@ -2,7 +2,6 @@ require 'muster/strategies/hash'
2
2
 
3
3
  module Muster
4
4
  module Strategies
5
-
6
5
  # Query string parsing strategy with additional value handling options for separating filtering expressions
7
6
  #
8
7
  # @example
@@ -10,7 +9,6 @@ module Muster
10
9
  # strategy = Muster::Strategies::JoinsExpression.new
11
10
  # results = strategy.parse('joins=author.name,activity') #=> { 'joins' => [{'author' => 'name'}, 'activity'] }
12
11
  class JoinsExpression < Muster::Strategies::Hash
13
-
14
12
  # @attribute [r] expression_separator
15
13
  # @return [String,RegEx] when specified, each field value will be split into multiple expressions using the specified separator
16
14
  attr_reader :expression_separator
@@ -34,12 +32,12 @@ module Muster
34
32
  #
35
33
  # strategy = Muster::Strategies::FilterExpression.new
36
34
  # strategy = Muster::Strategies::FilterExpression.new(:unique_values => true)
37
- def initialize( options={} )
35
+ def initialize(options = {})
38
36
  super
39
37
 
40
- @expression_separator = self.options.fetch(:expression_separator, /,\s*/)
41
- @field_separator = self.options.fetch(:field_separator, '.')
42
- @unique_values = self.options.fetch(:unique_values, true)
38
+ @expression_separator = options.fetch(:expression_separator, /,\s*/)
39
+ @field_separator = options.fetch(:field_separator, '.')
40
+ @unique_values = options.fetch(:unique_values, true)
43
41
  end
44
42
 
45
43
  # Processes a query string and returns an array of hashes that represent an ActiveRecord joins expression
@@ -49,18 +47,19 @@ module Muster
49
47
  # @return [Muster::Results]
50
48
  #
51
49
  # @example
52
- #
50
+ #
53
51
  # results = strategy.parse('joins=author.name,activity') #=> { 'joins' => [{'author' => 'name'}, 'activity'] }
54
- def parse( query_string )
55
- parameters = Muster::Results.new( self.fields_to_parse(query_string) )
52
+ def parse(query_string)
53
+ parameters = Muster::Results.new(fields_to_parse(query_string))
56
54
 
57
55
  parameters.each do |key, value|
58
- value = value.uniq.first if self.unique_values == true && value.instance_of?(Array)
59
- parameters[key] = self.make_nested_hash(value)
56
+ value = value.uniq.first if unique_values == true && value.instance_of?(Array)
57
+ parameters[key] = make_nested_hash(value)
60
58
  end
61
59
  end
62
60
 
63
61
  protected
62
+
64
63
  # Converts the array that represents the value to a nested hash
65
64
  #
66
65
  # @param value [Array] the value to convert
@@ -70,15 +69,13 @@ module Muster
70
69
  # @example
71
70
  #
72
71
  # value = self.make_nested_hash('activity,author.country.name') #=> ['activity', {'author' => {'country' => 'name'}}]
73
- def make_nested_hash( value )
72
+ def make_nested_hash(value)
74
73
  expressions = value.split(expression_separator)
75
- expressions.map do |e|
76
- fields = e.split(field_separator)
77
- fields[0..-2].reverse.reduce(fields.last) { |a, n| { n => a } }
74
+ expressions.map do |expression|
75
+ fields = expression.split(field_separator)
76
+ fields[0..-2].reverse.reduce(fields.last) { |a, e| { e => a } }
78
77
  end
79
78
  end
80
-
81
79
  end
82
80
  end
83
81
  end
84
-
@@ -4,7 +4,6 @@ require 'muster/strategies/hash'
4
4
 
5
5
  module Muster
6
6
  module Strategies
7
-
8
7
  # Query string parsing strategy with logic to handle pagination options
9
8
  #
10
9
  # @example
@@ -12,7 +11,6 @@ module Muster
12
11
  # strategy = Muster::Strategies::Pagination.new
13
12
  # results = strategy.parse('page=3&per_page=10') #=> { 'pagination' => {'page' => 3, 'per_page' => 10}, 'limit' => 10, 'offset' => 20 }
14
13
  class Pagination < Muster::Strategies::Rack
15
-
16
14
  # @attribute [r] default_page_size
17
15
  # @return [Fixnum] when specified, will override the default page size of 30 when no page_size is parsed
18
16
  attr_accessor :default_page_size
@@ -31,13 +29,14 @@ module Muster
31
29
  #
32
30
  # strategy = Muster::Strategies::Pagination.new
33
31
  # strategy = Muster::Strategies::Pagination.new(:default_page_size => 10)
34
- def initialize( options={} )
32
+ def initialize(options = {})
35
33
  super
36
34
 
37
- self.default_page_size = self.options[:default_page_size].to_i
38
- if self.default_page_size < 1
39
- self.default_page_size = 30
40
- end
35
+ self.default_page_size = options[:default_page_size].to_i
36
+
37
+ return unless default_page_size < 3
38
+
39
+ self.default_page_size = 30
41
40
  end
42
41
 
43
42
  # Processes a query string and returns a hash of its fields/values
@@ -47,25 +46,24 @@ module Muster
47
46
  # @return [Muster::Results]
48
47
  #
49
48
  # @example
50
- #
49
+ #
51
50
  # results = strategy.parse('page=3&per_page=10') #=> { 'pagination' => {'page' => 3, 'per_page' => 10}, 'limit' => 10, 'offset' => 20 }
52
- def parse( query_string )
53
- parameters = self.parse_query_string(query_string)
54
-
55
- page = self.parse_page(parameters)
56
- page_size = self.parse_page_size(parameters)
51
+ def parse(query_string)
52
+ parameters = parse_query_string(query_string)
57
53
 
54
+ page = parse_page(parameters)
55
+ page_size = parse_page_size(parameters)
58
56
 
59
57
  offset = (page - 1) * page_size
60
58
  offset = nil if offset < 1
61
59
 
62
- parameters = parameters.merge(:pagination => {:page => page, :per_page => page_size}, :limit => page_size, :offset => offset)
63
-
64
- if self.fields.present?
65
- parameters = parameters.slice(*self.fields)
60
+ parameters = parameters.merge(:pagination => { :page => page, :per_page => page_size }, :limit => page_size, :offset => offset)
61
+
62
+ if fields.present?
63
+ parameters = parameters.slice(*fields)
66
64
  end
67
65
 
68
- return Muster::Results.new(parameters)
66
+ Muster::Results.new(parameters)
69
67
  end
70
68
 
71
69
  protected
@@ -80,9 +78,9 @@ module Muster
80
78
  #
81
79
  # @example
82
80
  #
83
- # page = self.parse_page(:page => 2) #=> 2
84
- # page = self.parse_page(:page => nil) #=> 1
85
- def parse_page( parameters )
81
+ # page = parse_page(:page => 2) #=> 2
82
+ # page = parse_page(:page => nil) #=> 1
83
+ def parse_page(parameters)
86
84
  page = parameters.delete(:page).to_i
87
85
  page = 1 unless page > 0
88
86
  page
@@ -98,15 +96,14 @@ module Muster
98
96
  #
99
97
  # @example
100
98
  #
101
- # page_size = self.parse_page(:page_size => 10) #=> 10
102
- # page_size = self.parse_page(:per_page => 10) #=> 10
103
- # page_size = self.parse_page(:per_page => nil) #=> 30
104
- def parse_page_size( parameters )
99
+ # page_size = parse_page(:page_size => 10) #=> 10
100
+ # page_size = parse_page(:per_page => 10) #=> 10
101
+ # page_size = parse_page(:per_page => nil) #=> 30
102
+ def parse_page_size(parameters)
105
103
  page_size = (parameters.delete(:page_size) || parameters.delete(:per_page)).to_i
106
- page_size = self.default_page_size unless page_size > 0
104
+ page_size = default_page_size unless page_size > 0
107
105
  page_size
108
106
  end
109
-
110
107
  end
111
108
  end
112
109
  end
@@ -6,7 +6,6 @@ require 'muster/results'
6
6
 
7
7
  module Muster
8
8
  module Strategies
9
-
10
9
  # Query string parsing strategy based on Rack::Utils#parse_query
11
10
  #
12
11
  # @example
@@ -14,7 +13,6 @@ module Muster
14
13
  # strategy = Muster::Strategies::Rack.new
15
14
  # results = strategy.parse('name=value&choices=1&choices=2') #=> { 'name' => 'value', 'choices' => ['1', '2'] }
16
15
  class Rack
17
-
18
16
  # @attribute [r] options
19
17
  # @return [Hash] options specified during initialization
20
18
  attr_reader :options
@@ -33,11 +31,11 @@ module Muster
33
31
  #
34
32
  # strategy = Muster::Strategies::Rack.new(:fields => [:name, :state])
35
33
  # strategy = Muster::Strategies::Rack.new(:field => :name)
36
- def initialize( options={} )
34
+ def initialize(options = {})
37
35
  @options = options.with_indifferent_access
38
36
 
39
37
  @fields = Array.wrap(@options[:field] || @options[:fields])
40
- @fields.map!{ |field| field.to_sym }
38
+ @fields.map!(&:to_sym)
41
39
  end
42
40
 
43
41
  # Processes a query string and returns a hash of its fields/values
@@ -47,10 +45,10 @@ module Muster
47
45
  # @return [Muster::Results]
48
46
  #
49
47
  # @example
50
- #
48
+ #
51
49
  # results = strategy.parse('name=value&choices=1&choices=1') #=> { 'name' => 'value', 'choices' => ['1', '2'] }
52
- def parse( query_string )
53
- Muster::Results.new( self.fields_to_parse(query_string) )
50
+ def parse(query_string)
51
+ Muster::Results.new(fields_to_parse(query_string))
54
52
  end
55
53
 
56
54
  protected
@@ -64,7 +62,7 @@ module Muster
64
62
  # @example
65
63
  #
66
64
  # fields = self.parse_query_string('name=value&choices=1&choices=1') #=> { 'name' => 'value', 'choices' => ['1', '2'] }
67
- def parse_query_string( query_string )
65
+ def parse_query_string(query_string)
68
66
  ::Rack::Utils.parse_query(query_string).with_indifferent_access
69
67
  end
70
68
 
@@ -75,16 +73,15 @@ module Muster
75
73
  # If the :fields option was specified, only those fields will be returned. Otherwise, all fields will be returned.
76
74
  #
77
75
  # @return [Hash]
78
- def fields_to_parse( query_string )
79
- fields = self.parse_query_string(query_string)
76
+ def fields_to_parse(query_string)
77
+ fields = parse_query_string(query_string)
80
78
 
81
79
  if self.fields.present?
82
- fields = fields.select{ |key, value| self.fields.include?(key.to_sym) }
80
+ fields = fields.select { |key, _| self.fields.include?(key.to_sym) }
83
81
  end
84
82
 
85
- return fields.with_indifferent_access
83
+ fields.with_indifferent_access
86
84
  end
87
-
88
85
  end
89
86
  end
90
87
  end
@@ -3,7 +3,6 @@ require 'muster/strategies/hash'
3
3
 
4
4
  module Muster
5
5
  module Strategies
6
-
7
6
  # Query string parsing strategy with additional value handling for sort orders
8
7
  #
9
8
  # @example
@@ -11,7 +10,6 @@ module Muster
11
10
  # strategy = Muster::Strategies::SortExpression.new
12
11
  # results = strategy.parse('sort=name:desc') #=> { 'sort' => 'name desc' }
13
12
  class SortExpression < Muster::Strategies::Hash
14
-
15
13
  # Processes a query string and returns a hash of its fields/values
16
14
  #
17
15
  # @param query_string [String] the query string to parse
@@ -19,15 +17,15 @@ module Muster
19
17
  # @return [Hash]
20
18
  #
21
19
  # @example
22
- #
20
+ #
23
21
  # results = strategy.parse('order=name') #=> { 'order' => 'name asc' }
24
22
  # results = strategy.parse('order=name:desc') #=> { 'order' => 'name desc' }
25
23
  # results = strategy.parse('order=name,date:desc') #=> { 'order' => ['name asc', 'date desc'] }
26
- def parse( query_string )
27
- parameters = super
24
+ def parse(query_string)
25
+ parameters = super
28
26
 
29
27
  parameters.each do |key, value|
30
- parameters[key] = self.parse_sort_expression(value)
28
+ parameters[key] = parse_sort_expression(value)
31
29
  end
32
30
  end
33
31
 
@@ -35,7 +33,7 @@ module Muster
35
33
 
36
34
  # Separates the values into their field and direction
37
35
  #
38
- # @param value [String] the value being parsed
36
+ # @param expression [String] the value being parsed
39
37
  #
40
38
  # @return [String,Arrary] String if a single value, Array otherwise
41
39
  #
@@ -43,17 +41,17 @@ module Muster
43
41
  #
44
42
  # value = self.parse_sort_expression('name:asc') #=> 'name asc'
45
43
  # value = self.parse_sort_expression(['name:asc', 'date']) #=> ['name asc', 'date asc']
46
- def parse_sort_expression( value )
47
- values = Array.wrap(value)
44
+ def parse_sort_expression(expression)
45
+ values = Array.wrap(expression)
48
46
 
49
47
  values = values.map do |value|
50
48
  name, direction = value.split(':', 2)
51
- direction = self.parse_direction(direction)
49
+ direction = parse_direction(direction)
52
50
 
53
51
  "#{name} #{direction}"
54
52
  end.flatten
55
53
 
56
- return (values.size > 1) ? values : values.first
54
+ (values.size > 1) ? values : values.first
57
55
  end
58
56
 
59
57
  # Parse and normalize the sot expression direction
@@ -66,10 +64,9 @@ module Muster
66
64
  #
67
65
  # direction = self.parse_direction('ascending') #=> 'asc'
68
66
  # direction = self.parse_direction('descending') #=> 'desc'
69
- def parse_direction( direction )
67
+ def parse_direction(direction)
70
68
  direction.to_s.match(/^desc/i) ? 'desc' : 'asc'
71
69
  end
72
-
73
70
  end
74
71
  end
75
72
  end
@@ -1,4 +1,5 @@
1
+ # Muster
1
2
  module Muster
2
3
  # Current version of Muster
3
- VERSION = "0.0.10"
4
+ VERSION = '0.0.11'
4
5
  end
@@ -1,26 +1,28 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  require File.expand_path('../lib/muster/version', __FILE__)
3
3
 
4
+ # rubocop:disable Metrics/LineLength
4
5
  Gem::Specification.new do |gem|
5
- gem.authors = ["Christopher H. Laco"]
6
- gem.email = ["claco@chrislaco.com"]
7
- gem.description = %q{Muster is a gem that turns query strings of varying formats into data structures suitable for easier consumption in AR/DataMapper scopes and queries.}
8
- gem.summary = %q{Muster various query string formats into a more reusable data structure.}
9
- gem.homepage = "https://github.com/claco/muster"
6
+ gem.authors = ['Christopher H. Laco']
7
+ gem.email = ['claco@chrislaco.com']
8
+ gem.description = 'Muster is a gem that turns query strings of varying formats into data structures suitable for easier consumption in AR/DataMapper scopes and queries.'
9
+ gem.summary = 'Muster various query string formats into a more reusable data structure.'
10
+ gem.homepage = 'https://github.com/claco/muster'
10
11
 
11
- gem.files = `git ls-files`.split($\)
12
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split($ORS)
13
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
13
14
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = "muster"
15
- gem.require_paths = ["lib"]
15
+ gem.name = 'muster'
16
+ gem.require_paths = ['lib']
16
17
  gem.version = Muster::VERSION
17
18
 
18
19
  gem.add_dependency 'activesupport', '>= 3.0'
19
- gem.add_dependency 'rack', '~> 1.4'
20
+ gem.add_dependency 'rack', '~> 1.4'
20
21
 
21
22
  gem.add_development_dependency 'pry'
22
- gem.add_development_dependency 'rspec', '~> 2.11.0'
23
+ gem.add_development_dependency 'rspec', '~> 2.11.0'
23
24
  gem.add_development_dependency 'redcarpet', '~> 2.1'
25
+ gem.add_development_dependency 'rubocop', '~> 0.33.0'
24
26
  gem.add_development_dependency 'simplecov'
25
- gem.add_development_dependency 'yard', '~> 0.8.2'
27
+ gem.add_development_dependency 'yard', '~> 0.8.2'
26
28
  end