ruby_routes_trie 1.0.1
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 +7 -0
- data/lib/exceptions/route_must_be_unique.rb +7 -0
- data/lib/exceptions/route_not_exist.rb +7 -0
- data/lib/ruby_routes_trie.rb +12 -0
- data/lib/trie/node.rb +22 -0
- data/lib/trie/response.rb +12 -0
- data/lib/trie/trie.rb +72 -0
- metadata +48 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b1008650953eb04076dae1dfde597caa728547d25ee3ffb03d1ab67de38b7118
|
4
|
+
data.tar.gz: 228f90e87c0659b8099a7784deddc0d00daa2b076ba92881f5782b51f217bb92
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e2c4720543ca0f9c32f5cc5d9befda01d0b79766b8932bb9f790a6023ddfd2f8b25fd604a435970be91f99c9c477820cb673330a4ca45b4d1fffe2abc05fc8b2
|
7
|
+
data.tar.gz: 325167936bdc8ee5143f9ab54df866013bf9811786a5292674cddbd744cb0c6ba0eb58b4e6cb8e8ff1d32efcea54cf305cb7776563a1bae9f6077a04c271a128
|
data/lib/trie/node.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module RubyRoutesTrie
|
2
|
+
class Node
|
3
|
+
DYNAMIC = 1
|
4
|
+
STATIC = 0
|
5
|
+
|
6
|
+
attr_reader :value, :children
|
7
|
+
|
8
|
+
attr_accessor :method, :route, :type
|
9
|
+
|
10
|
+
def initialize(value)
|
11
|
+
@children = []
|
12
|
+
@value = value
|
13
|
+
@method = ''
|
14
|
+
@route = ''
|
15
|
+
@type = value[0] == ':' ? DYNAMIC : STATIC
|
16
|
+
end
|
17
|
+
|
18
|
+
def dynamic?
|
19
|
+
@type == DYNAMIC
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/trie/trie.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require_relative '../exceptions/route_must_be_unique'
|
2
|
+
require_relative '../exceptions/route_not_exist'
|
3
|
+
require_relative 'node'
|
4
|
+
require_relative 'response'
|
5
|
+
|
6
|
+
module RubyRoutesTrie
|
7
|
+
class Trie
|
8
|
+
def initialize
|
9
|
+
@root = Node.new("/")
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_route(method, route)
|
13
|
+
levels = levels_split(route)
|
14
|
+
|
15
|
+
raise RouteMustBeUnique if valid?(levels)
|
16
|
+
|
17
|
+
base = @root
|
18
|
+
levels.each { |level| base = add_attributes(level, base.children) }
|
19
|
+
base.method = method
|
20
|
+
base.route = route
|
21
|
+
end
|
22
|
+
|
23
|
+
def find(route)
|
24
|
+
find_route(route) do |found, base|
|
25
|
+
raise RouteNotExist unless found && base.route.empty? == false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def levels_split(route)
|
32
|
+
route.split('/').reject { |e| e.to_s.empty? }
|
33
|
+
end
|
34
|
+
|
35
|
+
def valid?(levels)
|
36
|
+
levels.find_all {|level| levels.count(level) > 1}.any?
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_attributes(value, trie)
|
40
|
+
trie.find {|n| n.value == value} || add_node(value, trie)
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_node(value, trie)
|
44
|
+
Node.new(value).tap { |new_node| trie << new_node }
|
45
|
+
end
|
46
|
+
|
47
|
+
def find_route(route)
|
48
|
+
levels = levels_split(route)
|
49
|
+
base = @root
|
50
|
+
dynamic_value = {}
|
51
|
+
route_found = levels.all? { |level| base = find_attributes(level, base.children, dynamic_value) }
|
52
|
+
|
53
|
+
yield route_found, base if block_given?
|
54
|
+
response(base.method, base.route, dynamic_value)
|
55
|
+
end
|
56
|
+
|
57
|
+
def response(method, route, dynamic_value)
|
58
|
+
Response.new(method, route, dynamic_value)
|
59
|
+
end
|
60
|
+
|
61
|
+
def find_attributes(value, trie, dynamic_value)
|
62
|
+
trie.sort_by{ |n| n.type }.find do |n|
|
63
|
+
if n.dynamic?
|
64
|
+
dynamic_value[n.value] = value
|
65
|
+
true
|
66
|
+
else
|
67
|
+
n.value == value
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby_routes_trie
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Oleksii Protsenko
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-07-08 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/exceptions/route_must_be_unique.rb
|
20
|
+
- lib/exceptions/route_not_exist.rb
|
21
|
+
- lib/ruby_routes_trie.rb
|
22
|
+
- lib/trie/node.rb
|
23
|
+
- lib/trie/response.rb
|
24
|
+
- lib/trie/trie.rb
|
25
|
+
homepage: https://github.com/railkun/ruby_routes_trie
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubygems_version: 3.0.3
|
45
|
+
signing_key:
|
46
|
+
specification_version: 4
|
47
|
+
summary: RubyRoutesTrie - Simple gem for create trie routes
|
48
|
+
test_files: []
|