url_params_manager 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 20007cb9733a6548af2f7fb5dbb1c3e1bf4cf4c1
4
+ data.tar.gz: fd0c71ec50dd016dd88291ab42118c05a139dcbd
5
+ SHA512:
6
+ metadata.gz: f255f9748eef06fb3f09fc28b13cd5d092ddaecfe9ead9d9d11375cd0fc86539f24c222b194d0cce83ee77d9220f43c4d9a72a843c2c2b86edbbbfc06b8d11e6
7
+ data.tar.gz: 64f773adecfad17d95a6d29aedf715c866ace65113d366b5cb0a48e42251d04d17c7e890a4c5b46eeb2220bef9dab75fa51bb46c21b1682879cca35aa7d26ba0
@@ -0,0 +1,10 @@
1
+ /.idea
2
+ /.bundle/
3
+ /.yardoc
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,19 @@
1
+ language: ruby
2
+ cache: bundler
3
+
4
+ addons:
5
+ code_climate:
6
+ repo_token: 0af3f52c81bbe7c92359d70d648edc9fae739e6555719fa2164c8d76dd71a314
7
+
8
+ rvm:
9
+ - 2.1.6
10
+ - 2.2.2
11
+
12
+ script: 'bundle exec rake spec'
13
+
14
+ notifications:
15
+ email:
16
+ recipients:
17
+ - eturino@eturino.com
18
+ on_failure: change
19
+ on_success: never
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in feature_toggle_service.gemspec
4
+ gemspec
5
+ gem 'codeclimate-test-reporter', group: :test, require: nil
@@ -0,0 +1,206 @@
1
+ # UrlParamsManager
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/url_params_manager.svg)](http://badge.fury.io/rb/url_params_manager)
4
+ [![Build Status](https://travis-ci.org/artirix/url_params_manager.svg?branch=master)](https://travis-ci.org/artirix/url_params_manager)
5
+ [![Code Climate](https://codeclimate.com/github/artirix/url_params_manager/badges/gpa.svg)](https://codeclimate.com/github/artirix/url_params_manager)
6
+ [![Test Coverage](https://codeclimate.com/github/artirix/url_params_manager/badges/coverage.svg)](https://codeclimate.com/github/artirix/url_params_manager/coverage)
7
+
8
+ Allows SEO Friendly urls for search pages to be built easily.
9
+
10
+ The urls will look like: `example.org/my-search/color-black/color-red/size-big/page-3` and will end up in this params: `{ color: ['black', 'red'], size: 'big', page: '3' }`.
11
+
12
+ ## Usage
13
+
14
+ With this gem you can specify what parameters will be in the path and what will be added to the querystring.
15
+
16
+ By default all parameters will be in the querystring, unless specified otherwise. Those are the *indexed params*.
17
+
18
+ The indexed params follow these rules:
19
+
20
+ 1. they will be added in a `"#{param_prefix}-#{value}` pairs.
21
+ 2. the order of the pairs in the URL is determined by the priority of the params in the config
22
+ 3. in case of multivalued, multiple param-value pairs will be added, following value's alphabetical order
23
+
24
+ ### Param name vs Param Prefix
25
+
26
+ We use this to "translate" the params from how they're known in the app to what they're known in the URLs. With this, we can change how the param is named in the URLs without changing it in the app. This will help us with white-labels config, multi-language configs, or SEO/UX related changes.
27
+
28
+ The "Param Name" or "Param name in the App" is how the param is known in the app, how it'll be accessed in Rails' params.
29
+ The "Param Prefix" or "Param alias in the URL" is how the param will be shown in the URL, either in the path or in the querystring.
30
+
31
+ The "prefix -> name" map are set on the config of the UrlParamsManager.
32
+
33
+ By default, if the config does not say otherwise, the prefix and the name are the same.
34
+
35
+ important: if the param is an indexed param (it's shown in the path not in the querystring), then we have to add it to this hash, even with the same name:
36
+ ie:
37
+
38
+ ```ruby
39
+ map = {
40
+ prefix: :real_name,
41
+ same_name: :same_name,
42
+ page: :page,
43
+ }
44
+ ```
45
+
46
+ ### Indexed vs non Indexed params
47
+
48
+ Indexed params appear in the path, ordered (following a priority order set in the config of the UrlParamsManager).
49
+
50
+ Non Indexed params are every other param, and they appear in the querystring.
51
+
52
+ note: We specify the indexed params using the Param Prefix (aka Param alias in the URL)
53
+
54
+ note: Indexed Params may have multiple values but those will be *UNORDERED*. (See the example for reasoning).
55
+
56
+ ### Default Values
57
+
58
+ The config can specify default values for specific params. That means that:
59
+
60
+ - if the param does not appear in the URL, we'll give the param the default value in the app.
61
+ - if the param is given the default app, the resulting URL will not have the param: if the param has the default value it is ignored when building the URL.
62
+
63
+ The default value can be a list.
64
+
65
+ note: We specify the default values using the Param Name.
66
+
67
+ ## Example of use and Config
68
+
69
+ ### UrlParamsManager object
70
+
71
+ ```ruby
72
+ # List of Params Prefixes to be considered as indexed params (in the path, not in the querystring)
73
+ indexed_url_params_order = [
74
+ :feat,
75
+ :cap,
76
+ :ndef,
77
+ # ALWAYS LAST
78
+ :page
79
+ ]
80
+
81
+ # Param Prefix => Param name in the app
82
+ url_to_filter_params = {
83
+ feat: :feature, # indexed => in URL
84
+ cap: :capacity, # indexed => in URL
85
+ some: :something, # not indexed => in querystring
86
+ ndef: :non_default, # value with default
87
+ page: :page,
88
+ }
89
+
90
+ # Default values for the params
91
+ default_params = {
92
+ something: 99,
93
+ non_default: 'paco',
94
+ with_default_value: 2,
95
+ with_default_list: [1, 2],
96
+ }
97
+
98
+ # UrlParamsManager object
99
+ @upm = UrlParamsManager.for url_to_filter_params: url_to_filter_params, # Param Name Map
100
+ indexed_url_params_order: indexed_url_params_order, # Indexed Params list
101
+ app_url_helpers: Rails.application.routes.url_helpers, # Object to receive the URL's Path calls (usually Rails URL Helpers)
102
+ default_params: default_params # Default Params map
103
+ ```
104
+
105
+ ### Building URLs
106
+
107
+ ```ruby
108
+ pars = {
109
+ capacity: ['25+'],
110
+ page: 2,
111
+ feature: ['swimming-pool', 'helipad'],
112
+ something: ['other', 'another'],
113
+ with_default_value: 2,
114
+ with_default_list: [2, 1],
115
+ non_default: 'ohmy',
116
+ }
117
+
118
+ expected_path = @upm.my_search_path(pars)
119
+ # => '/search/feat-helipad/feat-swimming-pool/cap-25+/ndef-ohmy/page-2?some%5B%5D=another&some%5B%5D=other'
120
+
121
+ # capacity => indexed with prefix 'cap'
122
+ # page => indexed with prefix 'page'
123
+ # feature => indexed with prefix 'feat'. Both values are shown, alpha-ordered.
124
+ # something => not indexed, using prefix (or 'Param Alias in URL') as key and the values alpha-ordered.
125
+ # with_default_value => since it has the default value, it does not appear
126
+ # with_default_list => since it has the default value, it does not appear. Note that we gave it the same values but in different order
127
+ # non_default => indexed with prefix 'ndef'
128
+
129
+ ```
130
+
131
+ ### Rails config for interpreting the URL
132
+
133
+ routes.rb file:
134
+ ```ruby
135
+
136
+ Rails.application.routes.draw do
137
+
138
+ get 'search(/*filters)', to: 'articles#index', as: :articles_search
139
+ end
140
+ ```
141
+
142
+ With that routes config, we'll have in `params` in the controller the indexed params plus a param "filters" with the string of all the indexed params.
143
+
144
+ We'll use the UrlParamsManager defined before to convert that into a hash of params that we can use internally.
145
+
146
+ This will put together the indexed params in the path with the non indexed params in the querystring, and it will translate the param names back to the Param name to use in the app.
147
+
148
+ ```ruby
149
+ class ArticlesController < ApplicationController
150
+
151
+ SEARCH_IGNORE_PARAMS = ['controller', 'action'].map &:freeze
152
+
153
+ def index
154
+ @articles = Article.search(search_params)
155
+ end
156
+
157
+ private
158
+ def search_params
159
+ @upm.filters_from_url_params params.reject { |k, _| SEARCH_IGNORE_PARAMS.include? k }
160
+ end
161
+ end
162
+ ```
163
+
164
+ With a URL like we built before: `'/search/feat-helipad/feat-swimming-pool/cap-25+/ndef-ohmy/page-2?some%5B%5D=another&some%5B%5D=other'` and this config, `Article.search` will receive a hash with:
165
+
166
+ ```ruby
167
+ {
168
+ capacity: ['25+'],
169
+ page: 2,
170
+ feature: ['helipad', 'swimming-pool'],
171
+ something: ['another', 'other'],
172
+ with_default_value: 2,
173
+ with_default_list: [1, 2],
174
+ non_default: 'ohmy',
175
+ }
176
+ ```
177
+
178
+ ## Installation
179
+
180
+ Add this line to your application's Gemfile:
181
+
182
+ ```ruby
183
+ gem 'url_params_manager'
184
+ ```
185
+
186
+ And then execute:
187
+
188
+ $ bundle
189
+
190
+ Or install it yourself as:
191
+
192
+ $ gem install url_params_manager
193
+
194
+ ## Development
195
+
196
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
197
+
198
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
199
+
200
+ ## Contributing
201
+
202
+ 1. Fork it ( https://github.com/artirix/url_params_manager/fork )
203
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
204
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
205
+ 4. Push to the branch (`git push origin my-new-feature`)
206
+ 5. Create a new Pull Request
@@ -0,0 +1,11 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'bundler/gem_tasks'
3
+
4
+ # Default directory to look in is `/specs`
5
+ # Run with `rake spec`
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ task.rspec_opts = ['--color']
8
+ end
9
+
10
+ task default: :spec
11
+
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "url_params_manager"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,13 @@
1
+ require 'active_support/all'
2
+ require 'url_params_manager/unrecognised_prefix_error'
3
+ require 'url_params_manager/service'
4
+ require 'url_params_manager/version'
5
+
6
+ module UrlParamsManager
7
+ def self.for(url_to_filter_params: nil, indexed_url_params_order: nil, app_url_helpers: nil, default_params: {})
8
+ Service.new url_to_filter_params: url_to_filter_params,
9
+ indexed_url_params_order: indexed_url_params_order,
10
+ app_url_helpers: app_url_helpers,
11
+ default_params: default_params
12
+ end
13
+ end
@@ -0,0 +1,128 @@
1
+ module UrlParamsManager
2
+ class Service
3
+ attr_reader :app_url_helpers, :url_to_filter_params, :indexed_url_params_order, :filter_to_url_params, :default_params
4
+
5
+ def initialize(url_to_filter_params: nil, indexed_url_params_order: nil, app_url_helpers: nil, default_params: {})
6
+ @url_to_filter_params = url_to_filter_params
7
+ @filter_to_url_params = url_to_filter_params.invert
8
+ @indexed_url_params_order = indexed_url_params_order
9
+ @app_url_helpers = app_url_helpers
10
+ @default_params = default_params
11
+ end
12
+
13
+ # for url/path methods from filter args
14
+ def method_missing(method, args)
15
+ path_method method, args
16
+ end
17
+
18
+ # for filters from url/path params
19
+ def filters_from_url_params(params)
20
+ params = params.to_h.symbolize_keys
21
+
22
+ filters = {}.merge default_params
23
+
24
+ params.delete(:filters).to_s.split('/').each do |part|
25
+ filter, value = recognise_prefix(part)
26
+ if filters.has_key? filter
27
+ filters[filter] = Array(filters[filter])
28
+ filters[filter] << value
29
+ else
30
+ filters[filter] = value
31
+ end
32
+ end
33
+
34
+ filters.merge querystring_to_filters(params)
35
+ end
36
+
37
+ def querystring_to_filters(querystring_params)
38
+ querystring_params.inject({}) do |h, (k, v)|
39
+ new_key = url_to_filter_params[k] || k
40
+ h[new_key] = v
41
+ h
42
+ end
43
+ end
44
+
45
+ private
46
+ def path_method(method, filter_args)
47
+ url_args = url_args_from_filters(filter_args)
48
+ app_url_helpers.send(method, url_args)
49
+ end
50
+
51
+ EMPTY_STRING = ''.freeze
52
+
53
+ def recognise_prefix(url_part)
54
+ url_to_filter_params.each do |url_prefix, filter|
55
+ pref = "#{url_prefix}-"
56
+ if url_part.start_with? pref
57
+ return [filter, url_part.sub(pref, EMPTY_STRING)]
58
+ end
59
+ end
60
+
61
+ raise UnrecognisedPrefixError, "url part: #{url_part}"
62
+ end
63
+
64
+ def url_args_from_filters(filter_args)
65
+ valid_filter_args = remove_defaults(filter_args)
66
+ bare_args = translate_filter_keys(valid_filter_args)
67
+
68
+ in_uri_args = bare_args.select { |(k, _)| indexed_url_params_order.include? k }
69
+ query_string_args = bare_args.reject { |(k, _)| indexed_url_params_order.include? k }
70
+
71
+ # sorting indexed part
72
+ sorted_uri_args = sort_uri_filters(in_uri_args)
73
+
74
+ #converting into string
75
+ filters_uri_part = generate_uri_part(sorted_uri_args)
76
+
77
+ # query string args + filter param for the urlpath helper methods
78
+ query_string_args.merge filters: filters_uri_part.join('/')
79
+ end
80
+
81
+ def sort_uri_filters(in_uri_args)
82
+ keys_sorted = Hash[
83
+ in_uri_args.to_a.sort_by do |k, _|
84
+ @indexed_url_params_order.index(k)
85
+ end
86
+ ]
87
+
88
+ Hash[
89
+ keys_sorted.map do |k, v|
90
+ sorted_v = v.respond_to?(:sort) ? v.sort : v
91
+ [k, sorted_v]
92
+ end
93
+ ]
94
+
95
+ end
96
+
97
+ def translate_filter_keys(filter_args)
98
+ Hash[
99
+ filter_args.map do |k, v|
100
+ [
101
+ filter_to_url_params[k] || k, # new key -> translated one, or the original if no translation available
102
+ v
103
+ ]
104
+ end
105
+ ]
106
+ end
107
+
108
+ def generate_uri_part(in_uri_args)
109
+ in_uri_args.inject([]) do |uri, (key, value)|
110
+ Array(value).each do |v|
111
+ uri << "#{key}-#{v}"
112
+ end
113
+ uri
114
+ end
115
+ end
116
+
117
+ def remove_defaults(filter_args)
118
+ default_params.each do |k, v|
119
+ next unless filter_args.key?(k) && filter_args[k].present?
120
+ if filter_args[k] == v || Array(filter_args[k]).sort == Array(v).sort
121
+ filter_args.delete k
122
+ end
123
+ end
124
+
125
+ filter_args
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,4 @@
1
+ module UrlParamsManager
2
+ class UnrecognisedPrefixError < StandardError
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module UrlParamsManager
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'url_params_manager/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'url_params_manager'
8
+ spec.version = UrlParamsManager::VERSION
9
+ spec.authors = ['Eduardo Turiño', 'Reuben Sutton']
10
+ spec.email = ['eturino@eturino.com', 'reuben.sutton@gmail.com']
11
+
12
+ spec.summary = %q{Allows SEO Friendly urls for search pages to be built easily. Intended to be used with Rails.}
13
+ # spec.description = %q{TODO: Write a longer description or delete this line.}
14
+ spec.homepage = 'https://github.com/artirix/url_params_manager'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = 'exe'
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ['lib']
20
+
21
+ # if spec.respond_to?(:metadata)
22
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to prevent pushes to rubygems.org, or delete to allow pushes to any server."
23
+ # end
24
+
25
+ spec.add_dependency 'activesupport', '~> 4'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.9'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'rspec'
30
+ spec.add_development_dependency 'rspec-given'
31
+ spec.add_development_dependency 'rspec-nc'
32
+ spec.add_development_dependency 'pry'
33
+ spec.add_development_dependency 'pry-nav'
34
+ spec.add_development_dependency 'pry-rescue'
35
+ spec.add_development_dependency 'pry-stack_explorer'
36
+ spec.add_development_dependency 'pry-doc'
37
+ end
metadata ADDED
@@ -0,0 +1,214 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: url_params_manager
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Eduardo Turiño
8
+ - Reuben Sutton
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2015-05-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '4'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '4'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.9'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.9'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '10.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '10.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec-given
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec-nc
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: pry
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: pry-nav
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: pry-rescue
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: pry-stack_explorer
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: pry-doc
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ description:
169
+ email:
170
+ - eturino@eturino.com
171
+ - reuben.sutton@gmail.com
172
+ executables: []
173
+ extensions: []
174
+ extra_rdoc_files: []
175
+ files:
176
+ - ".gitignore"
177
+ - ".rspec"
178
+ - ".travis.yml"
179
+ - Gemfile
180
+ - README.md
181
+ - Rakefile
182
+ - bin/console
183
+ - bin/setup
184
+ - lib/url_params_manager.rb
185
+ - lib/url_params_manager/service.rb
186
+ - lib/url_params_manager/unrecognised_prefix_error.rb
187
+ - lib/url_params_manager/version.rb
188
+ - url_params_manager.gemspec
189
+ homepage: https://github.com/artirix/url_params_manager
190
+ licenses: []
191
+ metadata: {}
192
+ post_install_message:
193
+ rdoc_options: []
194
+ require_paths:
195
+ - lib
196
+ required_ruby_version: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ required_rubygems_version: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ requirements: []
207
+ rubyforge_project:
208
+ rubygems_version: 2.4.6
209
+ signing_key:
210
+ specification_version: 4
211
+ summary: Allows SEO Friendly urls for search pages to be built easily. Intended to
212
+ be used with Rails.
213
+ test_files: []
214
+ has_rdoc: