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.
@@ -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
@@ -0,0 +1,7 @@
1
+ module RubyRoutesTrie
2
+ class RouteMustBeUnique < StandardError
3
+ def message
4
+ "This route element must be unique"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module RubyRoutesTrie
2
+ class RouteNotExist < StandardError
3
+ def message
4
+ "This route not exist"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'trie/trie'
2
+
3
+ module RubyRoutesTrie
4
+ def self.add_route(method, route)
5
+ @trie = Trie.new
6
+ @trie.add_route(method, route)
7
+ end
8
+
9
+ def self.find(route)
10
+ @trie.find(route)
11
+ end
12
+ end
@@ -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
@@ -0,0 +1,12 @@
1
+ module RubyRoutesTrie
2
+ class Response
3
+
4
+ attr_reader :method, :route, :dynamic_value
5
+
6
+ def initialize(method, route, dynamic_value)
7
+ @dynamic_value = dynamic_value
8
+ @route = route
9
+ @method = method
10
+ end
11
+ end
12
+ end
@@ -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: []