url_regexp 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f350bc548233f7897ce4c1e4c5c2905835454549
4
- data.tar.gz: c3dc80a9fe0e099cc1ca8cb6b00fb8575616fe3b
3
+ metadata.gz: 62ed69e94460e3c50d9d20160d88c50e31fe0928
4
+ data.tar.gz: 2ca60a8b537b2b446e0979f2fb575db9aecb78bc
5
5
  SHA512:
6
- metadata.gz: 2d0c2c0083914456cbf852a57ae904d2432063ef89fb1e1b335c79790180cfb181dcd50e5237f769d58ea8afde9a5834c0c2fe66e8005c1ea8077ced9f7d72bd
7
- data.tar.gz: 95b44f1711e304625684f70cf7a4fad0c5c383b2b2ac4b3465c6c7b5d30a49d76f7d97c9a0083e1360e63c728acf3497aa3dcb86583815d5b13f2990081d2c7a
6
+ metadata.gz: a904285e2bf5e22d4f7ad48056227814d811b986919a402a649b9a3ae878caa01eb1f819fafe6300121f68b7268c27aea62882c88a20594bc8810390cd27d00c
7
+ data.tar.gz: 69cc43725809e521e016d00a8c6e7178482835040bbf68ea48783349cb2f11561d7bd5b8885e32c43e74d717f5d63397b54d33a7911a05c69762bfec3e9b9bcf
data/.gemrelease ADDED
@@ -0,0 +1,2 @@
1
+ bump:
2
+ tag: true
data/.rubocop.yml CHANGED
@@ -4,7 +4,7 @@ AllCops:
4
4
  - 'lib/**/*'
5
5
  - 'spec/**/*'
6
6
  Metrics/AbcSize:
7
- Max: 32
7
+ Max: 40
8
8
  Metrics/LineLength:
9
9
  Max: 99
10
10
  Metrics/CyclomaticComplexity:
@@ -13,6 +13,8 @@ Metrics/PerceivedComplexity:
13
13
  Max: 20
14
14
  Metrics/MethodLength:
15
15
  Max: 30
16
+ Metrics/BlockNesting:
17
+ Max: 4
16
18
  Documentation:
17
19
  Enabled: false
18
20
  Style/SignalException:
data/Gemfile CHANGED
@@ -2,8 +2,11 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'simplecov'
4
4
  gem 'coveralls'
5
- gem 'rubocop', require: false
5
+ # FIXME:
6
+ # Wait for the merge of https://github.com/bbatsov/rubocop/pull/2936
7
+ gem 'rubocop', '~> 0.37.0', require: false
6
8
  gem 'rubocop-rspec', require: false
7
9
  gem 'pry'
10
+ gem 'gem-release'
8
11
 
9
12
  gemspec
data/README.md CHANGED
@@ -36,7 +36,24 @@ root.to_regexp
36
36
  # => /^http:\/\/www\.example\.com\/(foo|boo)\/bar(\/wow)?([?#]|$)/
37
37
  ```
38
38
 
39
- You can set the options globally and locally. Locally set option overwrites the one globally set. Just add any settings necessary for your mailers from the list below.
39
+ ## Options
40
+
41
+ ### wildcard_threshold (default: 5)
42
+
43
+ You can change the threshold to group paths as wildcard.
44
+
45
+ ```ruby
46
+ root = UrlRegexp::Root.new(wildcard_threshold: 2)
47
+ root.append('http://www.example.com/foo')
48
+ root.to_regexp
49
+ # => /^http:\/\/www\.example\.com\/foo([?#]|$)/
50
+ root.append('http://www.example.com/bar')
51
+ root.to_regexp
52
+ # => /^http:\/\/www\.example\.com\/(foo|bar)([?#]|$)/
53
+ root.append('http://www.example.com/wow')
54
+ root.to_regexp
55
+ # => /^http:\/\/www\.example\.com\/([^#?]*)([?#]|$)/
56
+ ```
40
57
 
41
58
  ## Test
42
59
 
@@ -1,7 +1,8 @@
1
1
  module UrlRegexp
2
2
  class Host < Node
3
- def initialize
3
+ def initialize(options = {})
4
4
  @hosts = Set.new
5
+ @options = options
5
6
  end
6
7
 
7
8
  def append(host)
@@ -6,10 +6,11 @@ module UrlRegexp
6
6
  attr_reader :label, :paths
7
7
  attr_accessor :path_end
8
8
 
9
- def initialize(label = nil, parent = nil)
9
+ def initialize(label = nil, parent = nil, options = {})
10
10
  @label = label
11
11
  @parent = parent
12
- @paths = PathSet.new
12
+ @options = options
13
+ @paths = PathSet.new(nil, @options)
13
14
  @path_end = false
14
15
  end
15
16
 
@@ -28,7 +29,7 @@ module UrlRegexp
28
29
 
29
30
  def append(path)
30
31
  if path == ''
31
- @paths.append(Path.new('', self))
32
+ @paths.append(Path.new('', self, @options))
32
33
  elsif @parent.nil?
33
34
  _, label, rest = path.split('/', 3)
34
35
  else
@@ -37,7 +38,7 @@ module UrlRegexp
37
38
  if label
38
39
  p = @paths.find { |pp| pp.label == label }
39
40
  if p.nil?
40
- p = Path.new(label, self)
41
+ p = Path.new(label, self, @options)
41
42
  @paths.append(p)
42
43
  end
43
44
  if rest.nil?
@@ -15,8 +15,10 @@ module UrlRegexp
15
15
 
16
16
  def_delegators :@set, :size, *Enumerable.public_instance_methods(false)
17
17
 
18
- def initialize(set = Set.new)
19
- @set = set
18
+ def initialize(set = nil, options = {})
19
+ @set = set || Set.new
20
+ @options = options
21
+ @wildcard_threshold = options[:wildcard_threshold] || 5
20
22
  end
21
23
 
22
24
  def append(path)
@@ -35,11 +37,11 @@ module UrlRegexp
35
37
  end
36
38
 
37
39
  def &(other)
38
- self.class.new(@set & other.set)
40
+ self.class.new(@set & other.set, @options)
39
41
  end
40
42
 
41
43
  def |(other)
42
- self.class.new(@set & other.set)
44
+ self.class.new(@set & other.set, @options)
43
45
  end
44
46
 
45
47
  def include?(path)
@@ -47,14 +49,25 @@ module UrlRegexp
47
49
  end
48
50
 
49
51
  def to_regexp_s
50
- if 5 < size
52
+ if @wildcard_threshold < size
51
53
  '([^#?]*)'
52
54
  elsif 1 < size
53
55
  children_paths = map(&:paths).reduce { |a, e| a & e }
54
56
  if children_paths.size == 1 && all? { |p| !p.path_end }
55
57
  "(#{map(&:label).join('|')})/#{children_paths.to_regexp_s}"
56
58
  else
57
- "(#{map(&:to_regexp_s).join('|')})"
59
+ regexps = map(&:to_regexp_s)
60
+ match = ''
61
+ if regexps.size > 1
62
+ base = regexps[0]
63
+ base.split(//).each do |c|
64
+ tmp = match + c
65
+ break unless regexps[1..-1].all? { |r| r.start_with? tmp }
66
+ match = tmp
67
+ end
68
+ regexps = regexps.map { |r| r[match.size..-1] }
69
+ end
70
+ "#{match}(#{regexps.join('|')})"
58
71
  end
59
72
  elsif 1 == size
60
73
  to_a.first.to_regexp_s
@@ -1,24 +1,31 @@
1
1
  module UrlRegexp
2
2
  class Query
3
- def initialize
3
+ def initialize(options = {})
4
+ @include_nil = false
4
5
  @queries = []
6
+ @options = options
5
7
  end
6
8
 
7
9
  def append(query)
8
- return if query.nil?
9
- @queries << query.to_s.split('&').reject(&:empty?)
10
+ query = query.to_s
11
+ if query.empty?
12
+ @include_nil = true
13
+ return
14
+ end
15
+ @queries << query.split('&')
10
16
  end
11
17
 
12
18
  def to_regexp_s
13
19
  common_queries = @queries.reduce { |a, e| a & e } || []
14
20
  common_queries = common_queries.map { |q| Regexp.quote(q) }
15
- if 1 < common_queries.size
21
+ regexp_s = if 1 < common_queries.size
16
22
  "\\?(#{common_queries.permutation.map { |qs| "(.*&)?#{qs.join('.*&')}(&.*)?" }.join('|')})"
17
23
  elsif 1 == common_queries.size
18
24
  "\\?(.*&)?#{common_queries.first}(&.*)?"
19
25
  else
20
26
  '(\\?.*)?'
21
27
  end
28
+ @include_nil ? "(#{regexp_s})?" : regexp_s
22
29
  end
23
30
  end
24
31
  end
@@ -4,11 +4,12 @@ end
4
4
 
5
5
  module UrlRegexp
6
6
  class Root < Node
7
- def initialize
8
- @scheme = Scheme.new
9
- @host = Host.new
10
- @path = Path.new
11
- @query = Query.new
7
+ def initialize(options = {})
8
+ @scheme = Scheme.new(options)
9
+ @host = Host.new(options)
10
+ @path = Path.new(nil, nil, options)
11
+ @query = Query.new(options)
12
+ @options = options
12
13
  end
13
14
 
14
15
  def append(url)
@@ -2,8 +2,9 @@ require_relative './node'
2
2
 
3
3
  module UrlRegexp
4
4
  class Scheme < Node
5
- def initialize
5
+ def initialize(options = {})
6
6
  @schemes = Set.new
7
+ @options = options
7
8
  end
8
9
 
9
10
  def append(scheme)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module UrlRegexp
4
- VERSION = '0.1.2'.freeze
4
+ VERSION = '0.1.3'.freeze
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: url_regexp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daisuke Taniwaki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-20 00:00:00.000000000 Z
11
+ date: 2017-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -59,6 +59,7 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".gemrelease"
62
63
  - ".gitignore"
63
64
  - ".rubocop.yml"
64
65
  - ".travis.yml"
@@ -96,9 +97,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
97
  version: '0'
97
98
  requirements: []
98
99
  rubyforge_project:
99
- rubygems_version: 2.5.1
100
+ rubygems_version: 2.6.10
100
101
  signing_key:
101
102
  specification_version: 4
102
103
  summary: Generate regular expression for URL
103
104
  test_files: []
104
- has_rdoc: