herbert 0.0.1 → 0.0.2

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.
@@ -1,5 +1,9 @@
1
1
  module Herbert
2
+
3
+ # Enhances AJAJ/AJAX support
2
4
  module Ajaxify
5
+
6
+ # Headers to send with each request
3
7
  Headers = {
4
8
  'Access-Control-Allow-Methods' => %w{POST GET PUT DELETE OPTIONS},
5
9
  'Access-Control-Allow-Headers' => %w{Content-Type X-Requested-With},
@@ -8,6 +12,14 @@ module Herbert
8
12
  'X-Build' => [Herbert::Utils.version]
9
13
  }
10
14
 
15
+ # * Loads config/headers.rb
16
+ #
17
+ # * Enables header processing
18
+ #
19
+ # * Registers CORS proxy for external services
20
+ #
21
+ # @param [Sinatra::Base descendant]
22
+ #
11
23
  def self.registered(app)
12
24
  # Heeeaderzz!!! Gimme heaaaderzzz!!!
13
25
  path = File.join(app.settings.root, 'config','headers.rb')
@@ -23,7 +35,7 @@ module Herbert
23
35
  end
24
36
 
25
37
  app.before do
26
- # Add the headers to the response
38
+ # Add the headers to the response
27
39
  Headers.each {|name, value|
28
40
  value = [value] unless value.is_a?(Array)
29
41
  value.map! {|val|
@@ -35,16 +47,15 @@ module Herbert
35
47
 
36
48
  # Proxy for not CORS enables services such as
37
49
  # Google Maps
38
- # /proxy/<url to fetch>
39
- if app.get '/proxy/:url' do
40
- url = URI.parse(URI.decode(params[:url]))
41
- res = Net::HTTP.start(url.host, 80) {|http|
42
- http.get(url.path + (url.query ? '?' + url.query : ''))
43
- }
44
- response['content-type'] = res['content-type']
45
- res.body
46
- end
50
+ # /proxy/url?=
51
+ app.get '/proxy/' do
52
+ url = URI.parse(URI.encode(params[:url]))
53
+ res = Net::HTTP.start(url.host, 80) {|http|
54
+ http.get(url.path + '?' + url.query)
55
+ }
56
+ response['content-type'] = res['content-type']
57
+ res.body
58
+ end
47
59
  end
48
- end
49
- end
60
+ end
50
61
  end
@@ -2,14 +2,22 @@ module Herbert
2
2
  # Full-fledged request & response logger with
3
3
  # several storage providers (console, mongo, cache)
4
4
  class AppLogger
5
+
6
+ # Provider getter
5
7
  def self.provider
6
8
  @@provider
7
9
  end
8
-
10
+
11
+ # Provider setter
9
12
  def self.provider=(prov)
10
13
  @@provider = prov
11
14
  end
12
15
 
16
+ # Creates log message and passes it to stograge provider
17
+ #
18
+ # @param [Sinatra::Request]
19
+ # @param [Sinatra::Response]
20
+ #
13
21
  def self.log(request, response)
14
22
  log = {
15
23
  "request"=> {
@@ -44,7 +52,7 @@ module Herbert
44
52
  }
45
53
  }
46
54
 
47
- # Extract tha headerz
55
+ # Extract the headers
48
56
  request.env.keys.each do |key|
49
57
  if key =~ /^HTTP_/ then
50
58
  log['request']['headers'][key.gsub(/^HTTP_/,'')] = request.env[key]
@@ -52,7 +60,7 @@ module Herbert
52
60
  end
53
61
  # do not log bodies from GET/DELETE/HEAD
54
62
  log["request"].delete("body") if %{GET DELETE HEAD}.include?(log["request"]["method"])
55
- # If an error occured, add it
63
+ # If an error has occured, add it
56
64
  log["response"]["error"] = request.env['sinatra.error'].to_hash if request.env['sinatra.error']
57
65
  id = @@provider.save(log)
58
66
  response['X-RequestId'] = id.to_s if @@provider.respond_to?(:id) && response.app.settings.append_log_id
@@ -60,6 +68,8 @@ module Herbert
60
68
  end
61
69
 
62
70
  module LoggingProviders
71
+
72
+ # Dumps all logs to STDOUT with pretty formating
63
73
  class StdoutProvider
64
74
  def initialize
65
75
  require 'pp'
@@ -70,18 +80,22 @@ module Herbert
70
80
  end
71
81
  end
72
82
 
83
+ # Persists log in DB
73
84
  class MongoProvider
74
-
75
- Collection = 'logs'
76
-
85
+ Collection = 'logs'
77
86
  def initialize(db)
78
87
  @db = db
79
88
  end
80
89
 
90
+ # @param [Hash]
81
91
  def save(log)
82
92
  @db[Collection].save(log)
83
93
  end
84
94
 
95
+ # FIXME
96
+ # "Flag" indicating that this provider returns IDs
97
+ #
98
+ # @return [Boolean]
85
99
  def id
86
100
  true
87
101
  end
@@ -51,6 +51,8 @@ end
51
51
 
52
52
  module Sinatra
53
53
  class NotFound
54
+
55
+ # Enables Sinatra built-in exceptions to be logged
54
56
  def to_hash
55
57
  {
56
58
  :code => 1003,
@@ -1,6 +1,10 @@
1
1
  module Herbert
2
2
  module Configurator
3
+
4
+ # Sets up the environment so we can set up Herbert
3
5
  module Prepatch
6
+
7
+ #
4
8
  def self.registered(app)
5
9
  # Enable envs such as development;debug, where debug is herberts debug flag
6
10
  env = ENV['RACK_ENV'].split(';')
@@ -20,7 +20,7 @@ module Sinatra
20
20
  class Sinatra::Request
21
21
 
22
22
  @is_json = false
23
- # Encapsulates #Rack::Request.body in order to remove #IO.String
23
+ # Encapsulates Rack::Request.body in order to remove #IO.String
24
24
  # and therefore to enable repeated reads
25
25
  def body_raw
26
26
  @body_raw ||= body(true).read
@@ -39,7 +39,7 @@ module Sinatra
39
39
  end
40
40
  end
41
41
 
42
- # Overrides #Rack::Request.body, returns native #Hash
42
+ # Overrides Rack::Request.body, returns native #Hash
43
43
  # Preserves access to underlying @env['rack.input'] #IO.String
44
44
  def body(rack = false)
45
45
  if rack then
@@ -1,19 +1,15 @@
1
1
  module Herbert
2
- # This class allows you to organize code by REST resources.
3
- # Any class that subclasses Herbert::Resource is automatically "merged"
4
- # into the application. Resource name will be derived from the class name.
2
+ # When extended, it virtually "merges" the overriding class into the app.
5
3
  #
6
- # For instance,
7
- # class Messages < Herbert::Resource
8
- # get '/' do
9
- # "here's a message for you!"
10
- # end
4
+ # class Messages
5
+ # get '/'
11
6
  # end
12
- # will respond to
13
- # GET /messages/
14
- #
15
-
7
+ # end
8
+ # will enable your app to respond to
9
+ # GET /messages/
16
10
  class Resource
11
+
12
+ # Instantizing this class is forbidden
17
13
  def self.new
18
14
  raise StandardError.new('You are not allowed to instantize this class directly')
19
15
  end
@@ -28,15 +24,17 @@ module Herbert
28
24
  end
29
25
  end
30
26
 
31
- # Loads all Herbert resources
27
+ # Loads all Herberts' resources
32
28
  module ResourceLoader
29
+
30
+ # Loads all application resources
33
31
  def self.registered(app)
34
32
  # Inject refence to the app into Resource
35
33
  Resource.class_eval do
36
34
  define_singleton_method :app do
37
35
  app
38
36
  end
39
- end
37
+ end
40
38
 
41
39
  # And load all resource definitions
42
40
  path = File.join(app.settings.root, 'Resources')
@@ -4,6 +4,8 @@ require 'memcache'
4
4
  require 'sinatra/base'
5
5
  require 'kwalify'
6
6
  require 'active_support'
7
+ $:.unshift(File.dirname(__FILE__))
8
+ require 'version'
7
9
 
8
10
  module Herbert
9
11
  ::Logger.class_eval do
@@ -19,23 +21,27 @@ module Herbert
19
21
  # Plug it in, the monkey style :]
20
22
  module ::Kernel
21
23
  @@logger = Logger.new(STDOUT)
24
+
25
+ # @return [Logger] The globally available logger
22
26
  def log
23
27
  @@logger
24
28
  end
25
29
  end
26
30
 
31
+ # Bootstraps Herbert
27
32
  module Loader
28
33
  $HERBERT_PATH = File.dirname(__FILE__)
29
- log.h_info("Here comes Herbert. He's a berserker!")
34
+ log.h_info("Here comes Herbert (v#{Herbert::VERSION}). He's a berserker!")
30
35
  # because order matters
31
36
  %w{Utils Jsonify Configurator Error Services Ajaxify AppLogger Log Resource}.each {|file|
32
37
  require $HERBERT_PATH + "/#{file}.rb"
33
38
  }
34
-
39
+
40
+ # Sets up some default settings and loads all components
35
41
  def self.registered(app)
36
42
  # Set some default
37
43
  # TODO to external file?
38
- app.set :log_requests, :db
44
+ app.set :log_requests, :db unless app.respond_to? :log_requests
39
45
  app.enable :append_log_id # If logs go to Mongo, IDs will be appended to responses
40
46
  ## register the ;debug flag patch first to enable proper logging
41
47
  app.register Herbert::Configurator::Prepatch
@@ -52,12 +58,14 @@ module Herbert
52
58
  app.helpers Sinatra::Database
53
59
  app.register Sinatra::Cache
54
60
  app.helpers Sinatra::Cache
55
- app.register Sinatra::Validation::Extension
56
- app.helpers Sinatra::Validation::Helpers
61
+ if app.respond_to?(:validation) && app.validation then
62
+ app.register Sinatra::Validation::Extension
63
+ app.helpers Sinatra::Validation::Helpers
64
+ end
57
65
  app.register Herbert::Ajaxify
58
66
  app.helpers Sinatra::Log
59
67
  app.register Sinatra::Log::Extension
60
- app.register Herbert::ResourceLoader
68
+ app.register Herbert::ResourceLoader if app.respond_to?(:resources) && app.resources
61
69
  end
62
70
  end
63
71
  end
@@ -1,3 +1,3 @@
1
1
  module Herbert
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Pavel Kalvoda
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-06-18 00:00:00 +02:00
17
+ date: 2011-06-24 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -134,7 +134,6 @@ files:
134
134
  - Gemfile
135
135
  - Rakefile
136
136
  - herbert.gemspec
137
- - lib/file.rb
138
137
  - lib/herbert.rb
139
138
  - lib/herbert/Ajaxify.rb
140
139
  - lib/herbert/AppLogger.rb
@@ -1,2 +0,0 @@
1
- puts "file got loaded"
2
-