strelka 0.0.1.pre.244 → 0.0.1.pre.252

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data.tar.gz.sig +0 -0
  2. data/ChangeLog +57 -3
  3. data/Manifest.txt +3 -4
  4. data/Rakefile +1 -1
  5. data/bin/strelka +4 -7
  6. data/examples/.env +4 -0
  7. data/examples/Procfile +8 -0
  8. data/examples/apps/auth-demo +3 -5
  9. data/examples/apps/auth-demo2 +10 -9
  10. data/{data/strelka → examples}/apps/hello-world +1 -2
  11. data/examples/apps/sessions-demo +2 -2
  12. data/examples/config.yml +12 -1
  13. data/examples/gen-config.rb +5 -6
  14. data/examples/templates/auth-form.tmpl +4 -0
  15. data/examples/templates/auth-success.tmpl +3 -1
  16. data/lib/strelka.rb +15 -21
  17. data/lib/strelka/app.rb +53 -31
  18. data/lib/strelka/app/auth.rb +260 -132
  19. data/lib/strelka/app/sessions.rb +25 -31
  20. data/lib/strelka/authprovider/basic.rb +33 -9
  21. data/lib/strelka/authprovider/hostaccess.rb +1 -1
  22. data/lib/strelka/constants.rb +0 -11
  23. data/lib/strelka/cookie.rb +17 -1
  24. data/lib/strelka/httpresponse/negotiation.rb +1 -1
  25. data/lib/strelka/session/db.rb +49 -25
  26. data/lib/strelka/session/default.rb +39 -19
  27. data/spec/lib/helpers.rb +3 -24
  28. data/spec/strelka/app/auth_spec.rb +461 -177
  29. data/spec/strelka/app/sessions_spec.rb +7 -26
  30. data/spec/strelka/app_spec.rb +3 -3
  31. data/spec/strelka/authprovider/basic_spec.rb +4 -4
  32. data/spec/strelka/httprequest/session_spec.rb +1 -1
  33. data/spec/strelka/httpresponse/session_spec.rb +1 -1
  34. data/spec/strelka/session/db_spec.rb +6 -1
  35. data/spec/strelka/session/default_spec.rb +3 -3
  36. metadata +7 -8
  37. metadata.gz.sig +2 -2
  38. data/examples/apps/ws-echo +0 -17
  39. data/lib/strelka/logging.rb +0 -301
  40. data/spec/strelka/logging_spec.rb +0 -74
@@ -39,12 +39,7 @@ describe Strelka::App::Sessions do
39
39
  describe "session-class loading" do
40
40
  before( :all ) do
41
41
  # First, hook the anonymous class up to the 'testing' name using the PluginFactory API
42
- @test_session_class = Class.new( Strelka::Session ) do
43
- class << self; attr_accessor :options; end
44
- def self::configure( options )
45
- @options = options
46
- end
47
- end
42
+ @test_session_class = Class.new( Strelka::Session )
48
43
  Strelka::Session.derivatives[ 'testing' ] = @test_session_class
49
44
  end
50
45
 
@@ -53,8 +48,8 @@ describe Strelka::App::Sessions do
53
48
  end
54
49
 
55
50
  it "has a default associated session class" do
56
- Strelka::App::Sessions.session_class.should be_a( Class )
57
- Strelka::App::Sessions.session_class.should < Strelka::Session
51
+ Strelka::App::Sessions.configure
52
+ Strelka::App::Sessions.session_class.should be( Strelka::Session::Default )
58
53
  end
59
54
 
60
55
  it "is can be configured to use a different session class" do
@@ -62,28 +57,14 @@ describe Strelka::App::Sessions do
62
57
  Strelka::App::Sessions.session_class.should == @test_session_class
63
58
  end
64
59
 
65
- it "configures the configured session class with default options" do
66
- Strelka::App::Sessions.configure( :session_class => 'testing' )
67
- Strelka::App::Sessions.session_class.options.should == Strelka::App::Sessions::DEFAULT_OPTIONS
68
- end
69
-
70
- it "merges any config options for the configured session class" do
71
- options = { 'cookie_name' => 'patience' }
72
- Strelka::App::Sessions.configure( :session_class => 'testing', :options => options )
73
- Strelka::App::Sessions.session_class.options.
74
- should == Strelka::App::Sessions::DEFAULT_OPTIONS.merge( options )
75
- end
76
-
77
- it "uses the default session class if the config doesn't have a session section" do
78
- Strelka::App::Sessions.configure
79
- Strelka::App::Sessions.session_class.should be( Strelka::Session::Default )
80
- end
81
-
82
60
  end
83
61
 
84
62
  describe "an including App" do
85
63
 
64
+
86
65
  before( :each ) do
66
+ Strelka::App::Sessions.configure
67
+
87
68
  @app = Class.new( Strelka::App ) do
88
69
  self.log.info "Anonymous App class: %p" % [ self ]
89
70
  self.log.info "ID constant is: %p" % [ const_defined?(:ID) ? const_get(:ID) : "(not defined)" ]
@@ -152,7 +133,7 @@ describe Strelka::App::Sessions do
152
133
  it "saves the session automatically" do
153
134
  req = @request_factory.get( '/foom' )
154
135
  res = @app.new.handle( req )
155
- res.cookies.should include( Strelka::Session::Default.cookie_options[:name] )
136
+ res.cookies.should include( Strelka::Session::Default.cookie_name )
156
137
  end
157
138
 
158
139
  end
@@ -103,7 +103,7 @@ describe Strelka::App do
103
103
  rabbit_path = specs[:rabbit_new].full_gem_path
104
104
  giraffe_path = specs[:giraffe].full_gem_path
105
105
 
106
- Dir.should_receive( :glob ).with( Pathname('data/strelka/{apps,handlers}/**/*') ).
106
+ Dir.should_receive( :glob ).with( 'data/*/{apps,handlers}/**/*' ).
107
107
  and_return( [] )
108
108
  Dir.should_receive( :glob ).with( "#{giraffe_path}/data/giraffe/{apps,handlers}/**/*" ).
109
109
  and_return([ "#{giraffe_path}/data/giraffe/apps/app" ])
@@ -128,7 +128,7 @@ describe Strelka::App do
128
128
  gemspec = make_gemspec( 'blood-orgy', '0.0.3' )
129
129
  Gem::Specification.should_receive( :each ).and_yield( gemspec ).at_least( :once )
130
130
 
131
- Dir.should_receive( :glob ).with( Pathname('data/strelka/{apps,handlers}/**/*') ).
131
+ Dir.should_receive( :glob ).with( 'data/*/{apps,handlers}/**/*' ).
132
132
  and_return( [] )
133
133
  Dir.should_receive( :glob ).with( "#{gemspec.full_gem_path}/data/blood-orgy/{apps,handlers}/**/*" ).
134
134
  and_return([ "#{gemspec.full_gem_path}/data/blood-orgy/apps/kurzweil" ])
@@ -150,7 +150,7 @@ describe Strelka::App do
150
150
  gemspec = make_gemspec( 'blood-orgy', '0.0.3' )
151
151
  Gem::Specification.should_receive( :each ).and_yield( gemspec ).at_least( :once )
152
152
 
153
- Dir.should_receive( :glob ).with( Pathname('data/strelka/{apps,handlers}/**/*') ).
153
+ Dir.should_receive( :glob ).with( 'data/*/{apps,handlers}/**/*' ).
154
154
  and_return( [] )
155
155
  Dir.should_receive( :glob ).with( "#{gemspec.full_gem_path}/data/blood-orgy/{apps,handlers}/**/*" ).
156
156
  and_return([ "#{gemspec.full_gem_path}/data/blood-orgy/apps/kurzweil" ])
@@ -31,8 +31,8 @@ describe Strelka::AuthProvider::Basic do
31
31
  @app = stub( "Strelka::App", :conn => stub("Connection", :app_id => 'test-app') )
32
32
  @provider = Strelka::AuthProvider.create( :basic, @app )
33
33
  @config = {
34
- 'realm' => 'Pern',
35
- 'users' => {
34
+ :realm => 'Pern',
35
+ :users => {
36
36
  "lessa" => "8wiomemUvH/+CX8UJv3Yhu+X26k=",
37
37
  "f'lar" => "NSeXAe7J5TTtJUE9epdaE6ojSYk=",
38
38
  }
@@ -70,8 +70,8 @@ describe Strelka::AuthProvider::Basic do
70
70
 
71
71
  it "can be configured via the Configurability API" do
72
72
  described_class.configure( @config )
73
- described_class.realm.should == @config['realm']
74
- described_class.users.should == @config['users']
73
+ described_class.realm.should == @config[:realm]
74
+ described_class.users.should == @config[:users]
75
75
  end
76
76
 
77
77
 
@@ -96,7 +96,7 @@ describe Strelka::HTTPRequest::Session, "-extended request" do
96
96
  context "with a session ID" do
97
97
 
98
98
  before( :each ) do
99
- cookie_name = Strelka::Session::Default.cookie_options[ :name ]
99
+ cookie_name = Strelka::Session::Default.cookie_name
100
100
  @sess_id = Strelka::Session::Default.get_session_id
101
101
  @req.header.cookie = "#{cookie_name}=#{@sess_id}"
102
102
  end
@@ -110,7 +110,7 @@ describe Strelka::HTTPResponse::Session, "-extended response" do
110
110
  context "for a request with a session ID" do
111
111
 
112
112
  before( :each ) do
113
- @cookie_name = Strelka::Session::Default.cookie_options[ :name ]
113
+ @cookie_name = Strelka::Session::Default.cookie_name
114
114
  @sess_id = Strelka::Session::Default.get_session_id
115
115
  @req.header.cookie = "#{@cookie_name}=#{@sess_id}"
116
116
  end
@@ -34,13 +34,17 @@ describe Strelka::Session::Db do
34
34
  end
35
35
 
36
36
  before( :each ) do
37
- @cookie_name = described_class.cookie_options[:name]
37
+ Strelka.log.debug "BEFORE each"
38
+ @cookie_name = described_class.cookie_name
38
39
  described_class.configure
40
+ Strelka.log.debug "/BEFORE each"
39
41
  end
40
42
 
41
43
  after( :each ) do
44
+ Strelka.log.debug "AFTER each"
42
45
  described_class.db.drop_table( :sessions ) if
43
46
  described_class.db.table_exists?( :sessions )
47
+ Strelka.log.debug "/AFTER each"
44
48
  end
45
49
 
46
50
  after( :all ) do
@@ -61,6 +65,7 @@ describe Strelka::Session::Db do
61
65
 
62
66
 
63
67
  it "can load an existing session from the sessions table" do
68
+ Strelka.log.debug "described_class dataset: %p" % [ described_class.dataset ]
64
69
  described_class.dataset.insert(
65
70
  :session_id => @session_id,
66
71
  :session => @session_data.to_yaml )
@@ -28,7 +28,7 @@ describe Strelka::Session::Default do
28
28
 
29
29
  before( :each ) do
30
30
  described_class.configure
31
- @cookie_name = described_class.cookie_options[:name]
31
+ @cookie_name = described_class.cookie_name
32
32
  end
33
33
 
34
34
  after( :each ) do
@@ -48,8 +48,8 @@ describe Strelka::Session::Default do
48
48
 
49
49
 
50
50
  it "can be configured to store its session ID in a different cookie" do
51
- described_class.configure( :cookie => {:name => 'buh-mahlon'} )
52
- described_class.cookie_options[:name].should == 'buh-mahlon'
51
+ described_class.configure( :cookie_name => 'buh-mahlon' )
52
+ described_class.cookie_name.should == 'buh-mahlon'
53
53
  end
54
54
 
55
55
  it "can load sessions from and save sessions to its in-memory store" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strelka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.pre.244
4
+ version: 0.0.1.pre.252
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -36,7 +36,7 @@ cert_chain:
36
36
  YUhDS0xaZFNLai9SSHVUT3QrZ2JsUmV4OEZBaDhOZUEKY21saFhlNDZwWk5K
37
37
  Z1dLYnhaYWg4NWpJang5NWhSOHZPSStOQU01aUg5a09xSzEzRHJ4YWNUS1Bo
38
38
  cWo1UGp3RgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
39
- date: 2012-05-24 00:00:00.000000000 Z
39
+ date: 2012-05-31 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: trollop
@@ -189,7 +189,7 @@ dependencies:
189
189
  requirements:
190
190
  - - ~>
191
191
  - !ruby/object:Gem::Version
192
- version: '0.2'
192
+ version: '0.3'
193
193
  type: :runtime
194
194
  prerelease: false
195
195
  version_requirements: !ruby/object:Gem::Requirement
@@ -197,7 +197,7 @@ dependencies:
197
197
  requirements:
198
198
  - - ~>
199
199
  - !ruby/object:Gem::Version
200
- version: '0.2'
200
+ version: '0.3'
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: foreman
203
203
  requirement: !ruby/object:Gem::Requirement
@@ -364,11 +364,12 @@ files:
364
364
  - contrib/hoetemplate/data/project/templates/top.tmpl.erb
365
365
  - contrib/hoetemplate/lib/file_name.rb.erb
366
366
  - contrib/hoetemplate/spec/file_name_spec.rb.erb
367
- - data/strelka/apps/hello-world
367
+ - examples/.env
368
+ - examples/Procfile
368
369
  - examples/apps/auth-demo
369
370
  - examples/apps/auth-demo2
371
+ - examples/apps/hello-world
370
372
  - examples/apps/sessions-demo
371
- - examples/apps/ws-echo
372
373
  - examples/config.yml
373
374
  - examples/gen-config.rb
374
375
  - examples/static/examples.css
@@ -403,7 +404,6 @@ files:
403
404
  - lib/strelka/httpresponse.rb
404
405
  - lib/strelka/httpresponse/negotiation.rb
405
406
  - lib/strelka/httpresponse/session.rb
406
- - lib/strelka/logging.rb
407
407
  - lib/strelka/mixins.rb
408
408
  - lib/strelka/paramvalidator.rb
409
409
  - lib/strelka/plugins.rb
@@ -442,7 +442,6 @@ files:
442
442
  - spec/strelka/httpresponse/negotiation_spec.rb
443
443
  - spec/strelka/httpresponse/session_spec.rb
444
444
  - spec/strelka/httpresponse_spec.rb
445
- - spec/strelka/logging_spec.rb
446
445
  - spec/strelka/mixins_spec.rb
447
446
  - spec/strelka/paramvalidator_spec.rb
448
447
  - spec/strelka/plugins_spec.rb
metadata.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- ��I�7RƆP�bi(�61�PG��dD}g��D��(E&�R[�*a!�G�븧��2y3�.����������6�w����^P���A����[�[����w.'�S�I�d�V[�d�F�.$��' C̵�#`"�d����
2
- bV"aSP��$͹�?��gk|�~�9ǣ9_A"�>DT�!/�*޻'P���thS��Q(;��
1
+ �/��J`���=`���)��-��m��uR��T2Z�\�"�"�-�FM
2
+ ��+�� �S��m�𵨋�;v������x���υ"#xGI���)
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # vim: set nosta noet ts=4 sw=4:
3
- #encoding: utf-8
4
-
5
- require 'strelka'
6
-
7
- # A demo of the WebSocketServer -- this does the same thing as the Mongrel2
8
- # echo server, but uses the Strelka WebSocket class.
9
- class WebSocketEchoServer < Strelka::WebSocketServer
10
-
11
- # Use the heartbeat plugin
12
- plugins :heartbeat
13
-
14
-
15
-
16
-
17
- end
@@ -1,301 +0,0 @@
1
- # -*- ruby -*-
2
- # vim: set nosta noet ts=4 sw=4:
3
- # encoding: utf-8
4
-
5
- require 'logger'
6
- require 'date'
7
-
8
- require 'strelka' unless defined?( Strelka )
9
- require 'strelka/mixins'
10
-
11
-
12
- # A mixin that provides a top-level logging subsystem based on Logger.
13
- module Strelka::Logging
14
-
15
- ### Logging
16
- # Log levels
17
- LOG_LEVELS = {
18
- 'debug' => Logger::DEBUG,
19
- 'info' => Logger::INFO,
20
- 'warn' => Logger::WARN,
21
- 'error' => Logger::ERROR,
22
- 'fatal' => Logger::FATAL,
23
- }.freeze
24
- LOG_LEVEL_NAMES = LOG_LEVELS.invert.freeze
25
-
26
-
27
- ### Inclusion hook
28
- def self::extended( mod )
29
- super
30
-
31
- class << mod
32
- # the log formatter that will be used when the logging subsystem is reset
33
- attr_accessor :default_log_formatter
34
-
35
- # the logger that will be used when the logging subsystem is reset
36
- attr_accessor :default_logger
37
-
38
- # the logger that's currently in effect
39
- attr_accessor :logger
40
- alias_method :log, :logger
41
- alias_method :log=, :logger=
42
- end
43
-
44
- mod.default_logger = mod.logger = Logger.new( $stderr )
45
- mod.default_logger.level = case
46
- when $DEBUG then Logger::DEBUG
47
- when $VERBOSE then Logger::INFO
48
- else Logger::WARN end
49
- mod.default_log_formatter = Strelka::Logging::Formatter.new( mod.default_logger )
50
- end
51
-
52
-
53
- ### Reset the global logger object to the default
54
- def reset_logger
55
- self.logger = self.default_logger
56
- self.logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
57
- self.logger.formatter = self.default_log_formatter
58
- end
59
-
60
-
61
- ### Returns +true+ if the global logger has not been set to something other than
62
- ### the default one.
63
- def using_default_logger?
64
- return self.logger == self.default_logger
65
- end
66
-
67
-
68
- # A alternate formatter for Logger instances.
69
- class Formatter < Logger::Formatter
70
-
71
- # The format to output unless debugging is turned on
72
- DEFAULT_FORMAT = "[%1$s.%2$06d %3$d/%4$s] %5$5s -- %7$s\n"
73
-
74
- # The format to output if debugging is turned on
75
- DEFAULT_DEBUG_FORMAT = "[%1$s.%2$06d %3$d/%4$s] %5$5s {%6$s} -- %7$s\n"
76
-
77
-
78
- ### Initialize the formatter with a reference to the logger so it can check for log level.
79
- def initialize( logger, format=DEFAULT_FORMAT, debug=DEFAULT_DEBUG_FORMAT ) # :notnew:
80
- @logger = logger
81
- @format = format
82
- @debug_format = debug
83
-
84
- super()
85
- end
86
-
87
- ######
88
- public
89
- ######
90
-
91
- # The Logger object associated with the formatter
92
- attr_accessor :logger
93
-
94
- # The logging format string
95
- attr_accessor :format
96
-
97
- # The logging format string that's used when outputting in debug mode
98
- attr_accessor :debug_format
99
-
100
-
101
- ### Log using either the DEBUG_FORMAT if the associated logger is at ::DEBUG level or
102
- ### using FORMAT if it's anything less verbose.
103
- def call( severity, time, progname, msg )
104
- args = [
105
- time.strftime( '%Y-%m-%d %H:%M:%S' ), # %1$s
106
- time.usec, # %2$d
107
- Process.pid, # %3$d
108
- Thread.current == Thread.main ? 'main' : Thread.object_id, # %4$s
109
- severity, # %5$s
110
- progname, # %6$s
111
- msg # %7$s
112
- ]
113
-
114
- if @logger.level == Logger::DEBUG
115
- return self.debug_format % args
116
- else
117
- return self.format % args
118
- end
119
- end
120
- end # class Formatter
121
-
122
-
123
- # A ANSI-colorized formatter for Logger instances.
124
- class ColorFormatter < Logger::Formatter
125
-
126
- # Set some ANSI escape code constants (Shamelessly stolen from Perl's
127
- # Term::ANSIColor by Russ Allbery <rra@stanford.edu> and Zenin <zenin@best.com>
128
- ANSI_ATTRIBUTES = {
129
- 'clear' => 0,
130
- 'reset' => 0,
131
- 'bold' => 1,
132
- 'dark' => 2,
133
- 'underline' => 4,
134
- 'underscore' => 4,
135
- 'blink' => 5,
136
- 'reverse' => 7,
137
- 'concealed' => 8,
138
-
139
- 'black' => 30, 'on_black' => 40,
140
- 'red' => 31, 'on_red' => 41,
141
- 'green' => 32, 'on_green' => 42,
142
- 'yellow' => 33, 'on_yellow' => 43,
143
- 'blue' => 34, 'on_blue' => 44,
144
- 'magenta' => 35, 'on_magenta' => 45,
145
- 'cyan' => 36, 'on_cyan' => 46,
146
- 'white' => 37, 'on_white' => 47
147
- }
148
-
149
-
150
- ### Create a string that contains the ANSI codes specified and return it
151
- def self::ansi_code( *attributes )
152
- attributes.flatten!
153
- attributes.collect! {|at| at.to_s }
154
- return '' unless /(?:vt10[03]|xterm(?:-color)?|linux|screen)/i =~ ENV['TERM']
155
- attributes = ANSI_ATTRIBUTES.values_at( *attributes ).compact.join(';')
156
-
157
- if attributes.empty?
158
- return ''
159
- else
160
- return "\e[%sm" % attributes
161
- end
162
- end
163
-
164
-
165
- ### Colorize the given +string+ with the specified +attributes+ and
166
- ### return it, handling line-endings, color reset, etc.
167
- def self::colorize( *args )
168
- string = ''
169
-
170
- if block_given?
171
- string = yield
172
- else
173
- string = args.shift
174
- end
175
-
176
- ending = string[/(\s)$/] || ''
177
- string = string.rstrip
178
-
179
- return self.ansi_code( args.flatten ) + string + self.ansi_code( 'reset' ) + ending
180
- end
181
-
182
-
183
- # Color settings
184
- LEVEL_FORMATS = {
185
- :debug => colorize( :bold, :black ) {"[%1$s.%2$06d %3$d/%4$s] %5$5s {%6$s} -- %7$s\n"},
186
- :info => colorize( :normal ) {"[%1$s.%2$06d %3$d/%4$s] %5$5s -- %7$s\n"},
187
- :warn => colorize( :bold, :yellow ) {"[%1$s.%2$06d %3$d/%4$s] %5$5s -- %7$s\n"},
188
- :error => colorize( :red ) {"[%1$s.%2$06d %3$d/%4$s] %5$5s -- %7$s\n"},
189
- :fatal => colorize( :bold, :red ) {"[%1$s.%2$06d %3$d/%4$s] %5$5s -- %7$s\n"},
190
- }
191
-
192
-
193
- ### Initialize the formatter with a reference to the logger so it can check for log level.
194
- def initialize( logger, settings={} ) # :notnew:
195
- settings = LEVEL_FORMATS.merge( settings )
196
-
197
- @logger = logger
198
- @settings = settings
199
-
200
- super()
201
- end
202
-
203
- ######
204
- public
205
- ######
206
-
207
- # The Logger object associated with the formatter
208
- attr_accessor :logger
209
-
210
- # The formats, by level
211
- attr_accessor :settings
212
-
213
-
214
- ### Log using the format associated with the severity
215
- def call( severity, time, progname, msg )
216
- args = [
217
- time.strftime( '%Y-%m-%d %H:%M:%S' ), # %1$s
218
- time.usec, # %2$d
219
- Process.pid, # %3$d
220
- Thread.current == Thread.main ? 'main' : Thread.object_id, # %4$s
221
- severity, # %5$s
222
- progname, # %6$s
223
- msg # %7$s
224
- ]
225
-
226
- return self.settings[ severity.downcase.to_sym ] % args
227
- end
228
-
229
- end # class Formatter
230
-
231
-
232
- # An alternate formatter for Logger instances that outputs +div+ HTML
233
- # fragments.
234
- class HtmlFormatter < Logger::Formatter
235
-
236
- # The default HTML fragment that'll be used as the template for each log message.
237
- HTML_LOG_FORMAT = %q{
238
- <div class="log-message %5$s">
239
- <span class="log-time">%1$s.%2$06d</span>
240
- [
241
- <span class="log-pid">%3$d</span>
242
- /
243
- <span class="log-tid">%4$s</span>
244
- ]
245
- <span class="log-level">%5$s</span>
246
- :
247
- <span class="log-name">%6$s</span>
248
- <span class="log-message-text">%7$s</span>
249
- </div>
250
- }
251
-
252
- ### Override the logging formats with ones that generate HTML fragments
253
- def initialize( logger, format=HTML_LOG_FORMAT ) # :notnew:
254
- @logger = logger
255
- @format = format
256
- super()
257
- end
258
-
259
-
260
- ######
261
- public
262
- ######
263
-
264
- # The HTML fragment that will be used as a format() string for the log
265
- attr_accessor :format
266
-
267
-
268
- ### Return a log message composed out of the arguments formatted using the
269
- ### formatter's format string
270
- def call( severity, time, progname, msg )
271
- args = [
272
- time.strftime( '%Y-%m-%d %H:%M:%S' ), # %1$s
273
- time.usec, # %2$d
274
- Process.pid, # %3$d
275
- Thread.current == Thread.main ? 'main' : Thread.object_id, # %4$s
276
- severity.downcase, # %5$s
277
- progname, # %6$s
278
- escape_html( msg ).gsub(/\n/, '<br />') # %7$s
279
- ]
280
-
281
- return self.format % args
282
- end
283
-
284
-
285
- #######
286
- private
287
- #######
288
-
289
- ### Escape any HTML special characters in +string+.
290
- def escape_html( string )
291
- return string.
292
- gsub( '&', '&amp;' ).
293
- gsub( '<', '&lt;' ).
294
- gsub( '>', '&gt;' )
295
- end
296
-
297
- end # class HtmlFormatter
298
-
299
-
300
- end # module Strelka
301
-