susanin 0.0.1 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 59b6559ce5c0548853359a6ff22589bd05445937
4
- data.tar.gz: a4f94a1fe9eb848681f264855187ec0174b67e77
2
+ SHA256:
3
+ metadata.gz: a0d2e26626b7792e2bbded08c10b9c219c957cc04b2fc49603254e453cf6728f
4
+ data.tar.gz: 56cc3d7e7bd0b9f530953c3784e2f3b2c097d7942798f115cc1540c2458f165c
5
5
  SHA512:
6
- metadata.gz: 3cca6bf0ac14d8bfdcaa7e9f80fa50f716164f79ad2082acc88f136a2601b4713b85efcb1d545c7c2b8a2155dce80cf66ceda200c20729b90599c9a49bf20c1d
7
- data.tar.gz: 8540146c20a09ef5caadb50a3047f8c90b3b1a57f5ba8df20c291f10dfbb3dbb359408703305ea9fded1375068972a84032612e19ae38b84433b1cbd524d3c50
6
+ metadata.gz: c6efe38491677b7832e87f4a8f19839718797ace7086f58ba2b3e76283fc90957ac1788dee8e9e12aee1b01522bf21ec49b7d527f833af9e5e0c4768a6a91f2a
7
+ data.tar.gz: d702e4e2b8a1221ff0ed7ba9af8075bd622b1c096ec04a60f3f861f4ca6dbd357961b8197175eba4846b9c5dd7c03ae9c42206b99918f5acac9bdedf3a6a1063
@@ -0,0 +1,35 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ ruby-version: ['2.6', '2.7', '3.0']
23
+
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
29
+ # uses: ruby/setup-ruby@v1
30
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
31
+ with:
32
+ ruby-version: ${{ matrix.ruby-version }}
33
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
34
+ - name: Run tests
35
+ run: bundle exec rake
data/README.md CHANGED
@@ -24,12 +24,17 @@ By default gems do nothing. Include module 'susanin' to the controller.
24
24
  class ApplicationController < ActionController::Base
25
25
  include ::Susanin
26
26
 
27
- polymorphic_url_prefix do
28
- {
29
- Admin => ->(resource) { [resource.company, resource] },
30
- Photo => ->(resource) { [resource.admin.company, resource.admin, resource] },
31
- Gallery => ->(resource) { [resource.company, resource] }
32
- }
27
+ susanin do
28
+ [
29
+ [:owner, ->(r) { [:admin] }],
30
+ [[:frontend, Link], ->(r) { [:frontend, r] }],
31
+ [User, ->(r) { [:owner, r] }],
32
+ [Project, ->(r) { [:owner, r] }],
33
+ [Link, ->(r) { [:owner, r] }],
34
+ [Admin, ->(r) { [r.company, r] }],
35
+ [Photo, ->(r) { [r.admin.company, r.admin, r] }],
36
+ [Gallery, ->(r) { [r.company, r] }]
37
+ ]
33
38
  end
34
39
 
35
40
  end
@@ -47,7 +52,6 @@ You are able to write this:
47
52
  link_to user.email, [:edit, user], class: 'button'
48
53
  ```
49
54
 
50
-
51
55
  ## Contributing
52
56
 
53
57
  1. Fork it ( https://github.com/[my-github-username]/susanin/fork )
data/Rakefile CHANGED
@@ -1,2 +1,10 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
2
3
 
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "susanin"
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
data/bin/rake ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rake", "rake")
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,37 @@
1
+ require "active_support/core_ext/array"
2
+
3
+ module Susanin
4
+
5
+ class Pattern
6
+ include Enumerable
7
+
8
+ def initialize(arr)
9
+ @arr = Array.wrap(arr)
10
+ end
11
+
12
+ def each(&block)
13
+ shifts.map do |s|
14
+ a = @arr.slice(*s)
15
+ block.call(a.size == 1 ? a[0] : a)
16
+ end
17
+ end
18
+
19
+ def arr_size
20
+ @arr.size
21
+ end
22
+
23
+ def shifts
24
+ arr_size.downto(1).flat_map do |shift|
25
+ (0).upto(arr_size-shift).map do |i|
26
+ [0+i, shift]
27
+ end
28
+ end
29
+ end
30
+
31
+ def inspect
32
+ map{|i|i}
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,213 @@
1
+ require "active_support/core_ext/array"
2
+ require "active_support/concern"
3
+
4
+ module Susanin
5
+
6
+ class Resource
7
+
8
+ def initialize(values=[])
9
+ @resources = values.dup
10
+ end
11
+
12
+ def url_parameters(record_or_hash_or_array, options={})
13
+ params = self.get(Array.wrap(record_or_hash_or_array)).flatten
14
+ opts, params = params.partition { |i| i.is_a?(Hash) }
15
+ merged_options(params, opts.inject(options) { |acc, i| acc.merge(i) })
16
+ end
17
+
18
+ #
19
+ # get(
20
+ # [:a, :c, :d],
21
+ # [
22
+ # [[:A, :B], ->(r) {:a}]
23
+ # [[:A], ->(r) {:q}]
24
+ # [[:C], ->(r) {:w}]
25
+ # [[:E], ->(r) {:e}]
26
+ # ]
27
+ # )
28
+ #
29
+ # [:qwe, :wer, :d]
30
+ #
31
+ def get(record, resources=@resources)
32
+ new_record, new_resources = replace_with(Array.wrap(record), resources)
33
+ if record == new_record
34
+ new_record
35
+ else
36
+ get(new_record, new_resources)
37
+ end
38
+ end
39
+
40
+ #
41
+ # replace_with(
42
+ # [:a, :b, :c, :d],
43
+ # [
44
+ # [[:A, :B], ->(r) {:a}]
45
+ # [[:C], ->(r) {:w}]
46
+ # [[:E], ->(r) {:e}]
47
+ # ]
48
+ # )
49
+ #
50
+ # [
51
+ # [:a, :c, :d],
52
+ # [
53
+ # [[:C], ->(r) {:w}]
54
+ # [[:E], ->(r) {:e}]
55
+ # ]
56
+ # ]
57
+ #
58
+ def replace_with(record, resources)
59
+ record = record.dup
60
+ resources = resources.dup
61
+ pattern, converter = find_first_pattern(record, resources)
62
+
63
+ [replace_subrecord(record, pattern, converter), resources_except(resources, pattern)]
64
+ end
65
+
66
+ #
67
+ # find_first_pattern(
68
+ # [:a, :b, :c, :d],
69
+ # [
70
+ # [[:A, :B], ->(r) {:a}]
71
+ # [[:C], ->(r) {:w}]
72
+ # [[:E], ->(r) {:e}]
73
+ # ]
74
+ # )
75
+ #
76
+ # [[:A, :B], ->(r) {:a}]
77
+ #
78
+ def find_first_pattern(record, resources)
79
+ record_patterns = patterns(get_key(record))
80
+
81
+ resources.select do |r|
82
+ record_patterns.include?(r[0])
83
+ end.first || []
84
+ end
85
+
86
+ #
87
+ # resources_except(
88
+ # [
89
+ # [[:A, :B], ->(r) {:a}]
90
+ # [[:A], ->(r) {:q}]
91
+ # [[:C], ->(r) {:w}]
92
+ # [[:E], ->(r) {:e}]
93
+ # ],
94
+ # [:A, :B]
95
+ # )
96
+ #
97
+ # [
98
+ # [[:C], ->(r) {:w}]
99
+ # [[:E], ->(r) {:e}]
100
+ # ],
101
+ #
102
+ def resources_except(resources, keys)
103
+ keys = Array.wrap(keys)
104
+ new_resources = resources.dup
105
+ new_resources.reject! { |r| contains_subarray?(keys, Array.wrap(r[0])) }
106
+ new_resources
107
+ end
108
+
109
+ #
110
+ # get_key(a) => A
111
+ # get_key(A) => A
112
+ # get_key([a]) => [A]
113
+ # get_key([a, B]) => [A, B]
114
+ # get_key([A]) => [A]
115
+ # get_key([A]) => [A]
116
+ # get_key(:qwe) => :qwe
117
+ # get_key([:qwe]) => [:qwe]
118
+ # get_key('qwe') => 'qwe'
119
+ #
120
+ def get_key(record)
121
+ case record
122
+ when Class then record
123
+ when Array then record.map { |i| get_key(i) }
124
+ when Symbol then record
125
+ when String then record
126
+ else record.class
127
+ end
128
+ end
129
+
130
+ #
131
+ # merged_options([], {}) #=> []
132
+ # merged_options([a], {}) #=> [a]
133
+ # merged_options([a, {}], {}) #=> [a]
134
+ # merged_options([a, {a: 1}], {}) #=> [a, {a: 1}]
135
+ # merged_options([a, {}], {a: 1}) #=> [a, {a: 1}]
136
+ # merged_options([a, {a: 1}], {a: 2}) #=> [a, {a: 1}]
137
+ #
138
+ def merged_options(params, options={})
139
+ params = params.dup
140
+ default_options = params.extract_options!
141
+ params + ((default_options.any? || options.any?) ? [default_options.merge(options)] : [])
142
+ end
143
+
144
+ #
145
+ # contains_subarray?([1,2,3,4,5], [1,2,3]) => true
146
+ # contains_subarray?([1,2,3,4,5], [3,4]) => true
147
+ # contains_subarray?([1,2,3,4,5], [1,3,4]) => false
148
+ # contains_subarray?([1,2,3,4,5], 5) => true
149
+ #
150
+ def contains_subarray?(source, subarray)
151
+ source = Array.wrap(source)
152
+ subarray = Array.wrap(subarray)
153
+ iteration_count = source.length - subarray.length
154
+ 0.upto(iteration_count).any? do |i|
155
+ source[i..(i+subarray.length-1)] == subarray
156
+ end
157
+ end
158
+
159
+ def patterns(arr)
160
+ Pattern.new(arr)
161
+ end
162
+
163
+ #
164
+ # replace_subrecord(
165
+ # [:a, :b, :c, :a, :b, :b],
166
+ # [:a, :b],
167
+ # ->(){ '_1_' }
168
+ # )
169
+ #
170
+ # ['_1_', :c, '_1_', :b]
171
+ #
172
+ def replace_subrecord(record, pattern, resource)
173
+ record = record.dup
174
+ pattern = Array.wrap(pattern)
175
+
176
+ i = pattern.length
177
+
178
+ return record if i == 0
179
+
180
+ while i <= record.length do
181
+ set = (0+(i-pattern.length))..(i-1)
182
+ subset = record[set]
183
+
184
+ if pattern_match?(subset, pattern)
185
+ value = resource.call(*subset)
186
+ record[set] = value
187
+ i += Array.wrap(value).size
188
+ else
189
+ i += 1
190
+ end
191
+ end
192
+
193
+ opts, r = record.partition { |i| i.is_a?(Hash) }
194
+ opts.any? ? [*r, opts.inject({}, :merge)] : r
195
+ end
196
+
197
+ #
198
+ # pattern_match?([a, b], [A, B]) => true
199
+ # pattern_match?([a, b], [a, b]) => false
200
+ #
201
+ def pattern_match?(record, pattern)
202
+ Array.wrap(get_key(record)).zip(Array.wrap(pattern)).all? do |a, b|
203
+ b.is_a?(Class) && a.is_a?(Class) ? a <= b : b == a
204
+ end
205
+ end
206
+
207
+ def array_unwrap(a)
208
+ a.size == 1 ? a[0] : a
209
+ end
210
+
211
+ end
212
+
213
+ end
@@ -1,3 +1,3 @@
1
1
  module Susanin
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.4"
3
3
  end
data/lib/susanin.rb CHANGED
@@ -1,45 +1,55 @@
1
+ require "active_support/core_ext/array"
2
+ require "active_support/concern"
3
+ require "active_support/dependencies/autoload"
1
4
  require "susanin/version"
2
5
 
3
6
  module Susanin
4
7
  extend ActiveSupport::Concern
5
8
 
9
+ autoload :Resource, 'susanin/resource'
10
+ autoload :Pattern, 'susanin/pattern'
11
+
6
12
  included do
7
- hide_action :polymorphic_url
8
- helper_method :polymorphic_url
13
+ helper_method :polymorphic_url, :polymorphic_path
9
14
  end
10
15
 
11
- class Resource
16
+ module ClassMethods
17
+ def susanin(content = nil, &block)
18
+ content_proc = block_given? ? Proc.new(&block) : Proc.new { content }
12
19
 
13
- def initialize(values={}, default = ->(resource) { resource })
14
- @resources = values.dup
15
- @resources.default = default
20
+ define_method :susanin do
21
+ @susanin ||= Resource.new(Array.wrap(instance_exec(&content_proc)))
22
+ end
16
23
  end
24
+ end
17
25
 
18
- def get(record)
19
- @resources[record.class][record]
20
- end
26
+ def polymorphic_url(record_or_hash_or_array, options={})
27
+ params = susanin_converter(record_or_hash_or_array, options)
21
28
 
29
+ if (params.first.size == 1) && params.first[0].is_a?(String)
30
+ params.first.first
31
+ else
32
+ super(*params)
33
+ end
22
34
  end
23
35
 
24
- module ClassMethods
25
- def polymorphic_url_prefix(content = nil)
26
- content_proc = if block_given?
27
- Proc.new
28
- else
29
- Proc.new { content }
30
- end
31
- define_method :polymorphic_url_prefix do
32
- @polymorphic_url_prefix ||= Resource.new(*Array.wrap(instance_exec(&content_proc)))
33
- end
36
+ def polymorphic_path(record_or_hash_or_array, options={})
37
+ params = susanin_converter(record_or_hash_or_array, options)
38
+
39
+ if (params.first.size == 1) && params.first[0].is_a?(String)
40
+ params.first.first
41
+ else
42
+ super(*params)
34
43
  end
35
44
  end
36
45
 
37
- def polymorphic_url(record_or_hash_or_array, options={})
38
- parameters = Array.wrap(record_or_hash_or_array).map {|i| polymorphic_url_prefix.get(i) }.flatten
39
- super(parameters, options)
46
+ def susanin_converter(record_or_hash_or_array, options={})
47
+ params = susanin.url_parameters(Array.wrap(record_or_hash_or_array))
48
+ params_options = params.extract_options!
49
+ [params, options.merge(params_options)]
40
50
  end
41
51
 
42
- def polymorphic_url_prefix
43
- @polymorphic_url_prefix ||= Resource.new()
52
+ def susanin
53
+ @susanin ||= Resource.new()
44
54
  end
45
55
  end
data/susanin.gemspec CHANGED
@@ -7,19 +7,22 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "susanin"
8
8
  spec.version = Susanin::VERSION
9
9
  spec.authors = ["Alexey Osipenko"]
10
- spec.email = ["alexey@osipenko.in.ua"]
10
+ spec.email = ["alexey@cimon.io"]
11
11
  spec.summary = %q{polymorphic_url extention to help with route generation}
12
- spec.description = %q{This gem simplify the route generation which generates via `polymorphic_url` method }
13
- spec.homepage = "https://github.com/aratak/susanin"
12
+ spec.description = %q{This gem simplify the route generation which generates via `polymorphic_url` method}
13
+ spec.homepage = "https://github.com/cimon-io/susanin"
14
14
  spec.license = "MIT"
15
15
 
16
- spec.files = `git ls-files -z`.split("\x0")
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "actionpack", "~> 4.1.1"
21
+ spec.add_dependency "actionpack", ">= 5.0.0", "< 8.0"
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.6"
23
+ spec.add_development_dependency "bundler"
24
24
  spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "pry"
26
+ spec.add_development_dependency "minitest"
27
+ spec.add_development_dependency "simplecov"
25
28
  end
metadata CHANGED
@@ -1,43 +1,49 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: susanin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Osipenko
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-11 00:00:00.000000000 Z
11
+ date: 2021-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.0.0
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: 4.1.1
22
+ version: '8.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: 4.1.1
29
+ version: 5.0.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '8.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: bundler
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
- version: '1.6'
39
+ version: '0'
34
40
  type: :development
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
- - - "~>"
44
+ - - ">="
39
45
  - !ruby/object:Gem::Version
40
- version: '1.6'
46
+ version: '0'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: rake
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -52,27 +58,78 @@ dependencies:
52
58
  - - ">="
53
59
  - !ruby/object:Gem::Version
54
60
  version: '0'
55
- description: 'This gem simplify the route generation which generates via `polymorphic_url`
56
- method '
61
+ - !ruby/object:Gem::Dependency
62
+ name: pry
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: minitest
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: simplecov
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: This gem simplify the route generation which generates via `polymorphic_url`
104
+ method
57
105
  email:
58
- - alexey@osipenko.in.ua
59
- executables: []
106
+ - alexey@cimon.io
107
+ executables:
108
+ - console
109
+ - rake
110
+ - setup
60
111
  extensions: []
61
112
  extra_rdoc_files: []
62
113
  files:
114
+ - ".github/workflows/ruby.yml"
63
115
  - ".gitignore"
64
116
  - Gemfile
65
117
  - LICENSE.txt
66
118
  - README.md
67
119
  - Rakefile
120
+ - bin/console
121
+ - bin/rake
122
+ - bin/setup
68
123
  - lib/susanin.rb
124
+ - lib/susanin/pattern.rb
125
+ - lib/susanin/resource.rb
69
126
  - lib/susanin/version.rb
70
127
  - susanin.gemspec
71
- homepage: https://github.com/aratak/susanin
128
+ homepage: https://github.com/cimon-io/susanin
72
129
  licenses:
73
130
  - MIT
74
131
  metadata: {}
75
- post_install_message:
132
+ post_install_message:
76
133
  rdoc_options: []
77
134
  require_paths:
78
135
  - lib
@@ -87,10 +144,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
144
  - !ruby/object:Gem::Version
88
145
  version: '0'
89
146
  requirements: []
90
- rubyforge_project:
91
- rubygems_version: 2.2.2
92
- signing_key:
147
+ rubygems_version: 3.2.3
148
+ signing_key:
93
149
  specification_version: 4
94
150
  summary: polymorphic_url extention to help with route generation
95
151
  test_files: []
96
- has_rdoc: