orbit-rb 0.1.0 → 0.2.0

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: a93dcc69c57194262bc7554ea04e4c9a38ab2f25
4
- data.tar.gz: 4a477207a30d666dbd6bf3e21cb98b1d00c308b4
3
+ metadata.gz: 5b74c5688905fd2955181080ff01041a27234d65
4
+ data.tar.gz: e6696a577daa1fa3fbf0176d57600e3d164173e3
5
5
  SHA512:
6
- metadata.gz: 1612cf2f1a5a223350c57a07d5a3cca75f1db11f4e8d26cdb9d16f89febe5f8d642060bc8c5d69e51394685a1042a215ea59a91467448ec1508d0a0cc7edb5cb
7
- data.tar.gz: 13a616b9e0712232c944d2df5abb2c3992583b375c0b10a245677e6e3d86ec6af32fee50c59c06db0a58b3f7b58d7ab755b667fe2649445f513ac209bf227a71
6
+ metadata.gz: 011afb5588defb88810229b862eaf925b9020da5665c9b88c7df01e74d36af5ddf6b6eaa1ea68e161b0a27e22b83ac12a44d517acba849234bbf529d542974bc
7
+ data.tar.gz: 9db074c686fb0de31aed54a818227f67e0b27da34776f0934e195b95ce00e85a110b9f5d0a164f992cdf2a764323928b63da15f7cebec17f22432e6bc3c45f1a
@@ -26,6 +26,10 @@ module Orbit
26
26
  @base_path += path
27
27
  end
28
28
 
29
+ def self.routes
30
+ @routes ||= []
31
+ end
32
+
29
33
  def self.base_path
30
34
  @base_path ||= '/'
31
35
  end
@@ -55,6 +59,17 @@ module Orbit
55
59
  end
56
60
 
57
61
  def self.add_route(verb, action, &handler)
62
+ route = "#{verb.downcase}_#{action}"
63
+
64
+ if routes.include?(route)
65
+ update_method(verb, action, &handler)
66
+ else
67
+ routes.push(route)
68
+ create_route(verb, action, &handler)
69
+ end
70
+ end
71
+
72
+ def self.create_route(verb, action, &handler)
58
73
  method_name = create_method(verb, action, &handler)
59
74
 
60
75
  full_path = "#{@base_path}/#{action}"
@@ -100,6 +115,15 @@ module Orbit
100
115
  method_name
101
116
  end
102
117
 
118
+ def self.update_method(verb, action, &handler)
119
+ method = (action == '/') ? "root" : parameterize(action.to_s.gsub("*", "splat"))
120
+ method = "#{verb.downcase}_#{method}".to_sym
121
+
122
+ define_method method, &handler
123
+
124
+ method
125
+ end
126
+
103
127
  def self.parameterize(string)
104
128
  sep = '_'
105
129
  # Turn unwanted chars into the separator
@@ -0,0 +1,25 @@
1
+ module Orbit
2
+ module Interceptors
3
+ class Base < Rack::Response
4
+ def initialize
5
+ super
6
+ @status = 302
7
+ end
8
+
9
+ def self.execute
10
+ new.execute
11
+ end
12
+
13
+ def execute
14
+ @intercept = redirect(intercept, status)
15
+
16
+
17
+ @intercept ? self : nil
18
+ end
19
+
20
+ def intercept
21
+ raise NotImplementedError.new("#intercept method must be implemented on #{self.class.name}")
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ module Orbit
2
+ module Interceptors
3
+ class Item
4
+ attr_accessor :path, :interceptor_class, :excludes
5
+
6
+ def initialize(path, interceptor_class, excludes=[])
7
+ @path = path
8
+ @interceptor_class = interceptor_class
9
+ @excludes = excludes
10
+ end
11
+
12
+ def match_path?(requested_path)
13
+ requested_path.match("^#{path}") && !excludes.include?(requested_path)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ module Orbit
2
+ module Interceptors
3
+ class List
4
+ include Singleton
5
+ attr_reader :interceptors
6
+
7
+ def initialize(interceptors=[])
8
+ @interceptors = interceptors
9
+ end
10
+
11
+ def self.add_interceptor(path, interceptor_class, excludes=[])
12
+ interceptor = Item.new(path, interceptor_class, excludes)
13
+
14
+ instance.interceptors.push(interceptor)
15
+ end
16
+
17
+ def interceptors_for_path(path)
18
+ return [] unless path
19
+
20
+ interceptors.select do |item|
21
+ item.match_path?(path)
22
+ end
23
+ end
24
+
25
+ def self.intercept_path(path)
26
+ instance.interceptors_for_path(path).each do |hash|
27
+ result = hash.interceptor_class.execute
28
+
29
+ return result if result
30
+ end
31
+
32
+ nil
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,15 +1,20 @@
1
1
  module Orbit
2
2
  module Loaders
3
3
  class DirectoryLoader
4
+ attr_reader :reloader
5
+
4
6
  def initialize
5
7
  base_path = "#{Dir.pwd}/#{Orbit::Config.app_path}"
6
8
 
7
9
  @retries = 0
8
10
  @files = Dir["#{base_path}/**/*.rb"]
11
+ @reloader = FileReloader.new(files)
9
12
  end
10
13
 
11
14
  def self.load
12
- new.load
15
+ new.tap do |instance|
16
+ instance.load
17
+ end
13
18
  end
14
19
 
15
20
  def load
@@ -0,0 +1,30 @@
1
+ module Orbit
2
+ module Loaders
3
+ class FileReloader
4
+ def initialize(files)
5
+ @files = files
6
+ @last_updated = {}
7
+ set_last_updated_dates
8
+ end
9
+
10
+ def set_last_updated_dates
11
+ @files.each do |file|
12
+ @last_updated[file] = File.mtime(file).to_i
13
+ end
14
+ end
15
+
16
+ def reload
17
+ @files.each do |file|
18
+ was_updated = File.mtime(file).to_i > @last_updated[file]
19
+
20
+ if was_updated
21
+ p "reloading #{file}"
22
+
23
+ load file
24
+ @last_updated[file] = File.mtime(file).to_i
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -4,5 +4,21 @@ module Orbit
4
4
  super
5
5
  headers['Content-Type'] ||= 'text/html'
6
6
  end
7
+
8
+ def self.not_found(verb, path)
9
+ body = ["Oops! No route for #{verb} #{path}"]
10
+
11
+ [404, {}, body]
12
+ end
13
+
14
+ def self.server_error(exception, verb, path)
15
+ body = "Error processing: #{verb} #{path}\n\n"
16
+ body += "#{exception.class.name}: #{exception.to_s}\n\n"
17
+ body += "Backtrace:\n\t#{exception.backtrace.join("\n\t")}"
18
+
19
+ Config.logger.error body
20
+
21
+ [500, {}, [body]]
22
+ end
7
23
  end
8
24
  end
data/lib/orbit/router.rb CHANGED
@@ -34,7 +34,7 @@ module Orbit
34
34
  options[:route].path.regex.match(path)
35
35
  end
36
36
 
37
- route = route.last
37
+ route = route.last if route
38
38
  end
39
39
 
40
40
  route
data/lib/orbit/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Orbit
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/orbit.rb CHANGED
@@ -16,7 +16,8 @@ module Orbit
16
16
  setup_builder
17
17
  load_middleware
18
18
 
19
- Loaders::DirectoryLoader.load
19
+ loader = Loaders::DirectoryLoader.load
20
+ @reloader = loader.reloader
20
21
  end
21
22
 
22
23
  def setup_builder
@@ -71,6 +72,7 @@ module Orbit
71
72
  end
72
73
 
73
74
  def call(env)
75
+ @reloader.reload
74
76
  @request = config.request_class.new(env)
75
77
  verb = @request.request_method
76
78
  requested_path = @request.path_info
@@ -78,13 +80,21 @@ module Orbit
78
80
  route = Config.router_class.match(verb, requested_path)
79
81
 
80
82
  if route
83
+ intercepted = Interceptors::List.intercept_path(requested_path)
84
+
85
+ return intercepted if intercepted
86
+
81
87
  route_params = route[:route].path.get_params(requested_path) || {}
82
88
 
83
89
  @request.params.merge!(route_params)
84
90
 
85
- route[:class].execute_action(@request, route[:action])
91
+ begin
92
+ route[:class].execute_action(@request, route[:action])
93
+ rescue Exception => exception
94
+ Config.response_class.server_error(exception, verb, requested_path)
95
+ end
86
96
  else
87
- [404, {}, ["Oops! No route for #{verb} #{requested_path}"]]
97
+ Config.response_class.not_found(verb, requested_path)
88
98
  end
89
99
  end
90
100
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: orbit-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Caio Torres
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-12-25 00:00:00.000000000 Z
11
+ date: 2016-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -100,7 +100,11 @@ files:
100
100
  - lib/orbit.rb
101
101
  - lib/orbit/config.rb
102
102
  - lib/orbit/controller.rb
103
+ - lib/orbit/interceptors/base.rb
104
+ - lib/orbit/interceptors/item.rb
105
+ - lib/orbit/interceptors/list.rb
103
106
  - lib/orbit/loaders/directory_loader.rb
107
+ - lib/orbit/loaders/file_reloader.rb
104
108
  - lib/orbit/request.rb
105
109
  - lib/orbit/response.rb
106
110
  - lib/orbit/router.rb