king_tokens 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -17,4 +17,7 @@ nbproject/*
17
17
 
18
18
  ## PROJECT::GENERAL
19
19
  rdoc
20
- pkg
20
+ pkg
21
+ Gemfile.lock
22
+ vendor/
23
+ coverage/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/Rakefile CHANGED
@@ -1,23 +1,8 @@
1
- require 'rubygems'
2
1
  require 'rake'
2
+ require "bundler/gem_helper"
3
3
  require 'rake/testtask'
4
- require 'rake/rdoctask'
5
-
6
- begin
7
- require 'jeweler'
8
- Jeweler::Tasks.new do |gem|
9
- gem.name = "king_tokens"
10
- gem.summary = %Q{Access tokens for any active record object}
11
- gem.description = %Q{Tokens are a usefull way to give users access to an application. This can be for a limited time or just once. Just think of password resets, changing email, protected rss feed urls, timed out private links}
12
- gem.email = "gl@salesking.eu"
13
- gem.homepage = "http://github.com/schorsch/king_tokens"
14
- gem.authors = ["Georg Leciejewski", "Michael Bumann"]
15
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
- end
17
- Jeweler::GemcutterTasks.new
18
- rescue LoadError
19
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
20
- end
4
+ require 'rdoc/task'
5
+ Bundler::GemHelper.install_tasks
21
6
 
22
7
  desc 'Default: run unit tests.'
23
8
  task :default => :test
data/king_tokens.gemspec CHANGED
@@ -1,59 +1,36 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'king_tokens/version'
5
4
 
6
5
  Gem::Specification.new do |s|
7
6
  s.name = %q{king_tokens}
8
- s.version = "1.0.1"
7
+ s.summary = %q{Access tokens for any active record object}
8
+ s.description = %q{Tokens are a usefull way to give users access to an application. This can be for a limited time or just once. Just think of password resets, changing email, protected rss feed urls, timed out private links}
9
+ s.version = KingTokens::VERSION
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
12
  s.authors = ["Georg Leciejewski", "Michael Bumann"]
12
13
  s.date = %q{2010-05-04}
13
- s.description = %q{Tokens are a usefull way to give users access to an application. This can be for a limited time or just once. Just think of password resets, changing email, protected rss feed urls, timed out private links}
14
14
  s.email = %q{gl@salesking.eu}
15
- s.extra_rdoc_files = [
16
- "README.rdoc"
17
- ]
18
- s.files = [
19
- ".document",
20
- ".gitignore",
21
- "MIT-LICENSE",
22
- "README.rdoc",
23
- "Rakefile",
24
- "VERSION",
25
- "coverage/index.html",
26
- "coverage/lib-token_code_rb.html",
27
- "coverage/lib-tokenizer_rb.html",
28
- "init.rb",
29
- "king_tokens.gemspec",
30
- "lib/king_tokens.rb",
31
- "lib/king_tokens/token_code.rb",
32
- "lib/king_tokens/tokenizer.rb",
33
- "tasks/tokenizer_tasks.rake",
34
- "test/schema.rb",
35
- "test/test_helper.rb",
36
- "test/tokenizer_test.rb"
37
- ]
38
15
  s.homepage = %q{http://github.com/schorsch/king_tokens}
39
- s.rdoc_options = ["--charset=UTF-8"]
16
+
17
+ s.extra_rdoc_files = ["README.rdoc"]
40
18
  s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.3.6}
42
- s.summary = %q{Access tokens for any active record object}
43
- s.test_files = [
44
- "test/schema.rb",
45
- "test/test_helper.rb",
46
- "test/tokenizer_test.rb"
47
- ]
48
-
49
- if s.respond_to? :specification_version then
50
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
51
- s.specification_version = 3
52
-
53
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
54
- else
55
- end
56
- else
57
- end
19
+
20
+ s.rubygems_version = %q{1.6.2}
21
+
22
+ s.executables = nil
23
+ s.files = `git ls-files`.split("\n")
24
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
+
26
+ s.require_paths = ["lib"]
27
+
28
+ s.add_development_dependency 'test-unit'
29
+ s.add_development_dependency 'activerecord'
30
+ s.add_development_dependency 'activesupport'
31
+ s.add_development_dependency 'rake'
32
+ s.add_development_dependency 'rdoc'
33
+ s.add_development_dependency 'sqlite3'
34
+
58
35
  end
59
36
 
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require "digest/sha1"
2
3
 
3
4
  # Class to handle polymorphic tokens
@@ -5,11 +6,11 @@ class TokenCode < ActiveRecord::Base
5
6
 
6
7
  belongs_to :object, :polymorphic => true
7
8
  before_create :set_token
8
-
9
+
9
10
  validates_presence_of :name
10
11
  validates_format_of :name, :with => /^[a-zA-Z0-9\_\-]+$/
11
12
  validates_uniqueness_of :name, :scope => [:object_id, :object_type] #second not really needed if uuid
12
-
13
+
13
14
  def to_s
14
15
  self.token
15
16
  end
@@ -42,17 +43,17 @@ class TokenCode < ActiveRecord::Base
42
43
  def valid_for_use?
43
44
  valid? && !used? && !expired?
44
45
  end
45
-
46
+
46
47
  # Delete all tokens which have been used
47
48
  def self.delete_used
48
49
  delete_all "used_at IS NOT NULL"
49
50
  end
50
-
51
+
51
52
  # Delete all tokens which are expired
52
53
  def self.delete_expired
53
- delete_all ["valid_until IS NOT NULL AND valid_until < ? ", Time.now]
54
+ delete_all ["valid_until IS NOT NULL AND valid_until < ? ", Time.now]
54
55
  end
55
-
56
+
56
57
  private
57
58
 
58
59
  # Generate a token with a default length of 12.
@@ -66,7 +67,7 @@ class TokenCode < ActiveRecord::Base
66
67
  end while !validity.call(token) if block_given?
67
68
  token
68
69
  end
69
-
70
+
70
71
  def secure_digest(*args)
71
72
  Digest::SHA1.hexdigest(args.flatten.join('--'))
72
73
  end
@@ -74,5 +75,5 @@ class TokenCode < ActiveRecord::Base
74
75
  def set_token
75
76
  self.token = generate_token { |token| TokenCode.find_by_token(token).nil? }
76
77
  end
77
-
78
+
78
79
  end
@@ -1,11 +1,12 @@
1
+ # encoding: utf-8
1
2
  module KingTokens
2
3
  # Module which adds the token methods to the including class
3
4
  module Tokenizer
4
-
5
+
5
6
  def self.included(base)
6
7
  base.extend(ClassMethods)
7
8
  end
8
-
9
+
9
10
  module ClassMethods
10
11
 
11
12
  # Define what kind of tokens the class should have
@@ -15,11 +16,8 @@ module KingTokens
15
16
  options = tokens.extract_options!
16
17
  options[:tokens] = tokens
17
18
  options[:days_valid] ||= 5
18
- options[:object_type] = ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s
19
-
20
- class_inheritable_accessor :can_has_tokens_options
21
- self.can_has_tokens_options = options
22
-
19
+ options[:object_type] = self.base_class.name.to_s
20
+
23
21
  has_many :token_codes, :as => :object, :dependent => :destroy
24
22
 
25
23
  extend KingTokens::Tokenizer::SingletonMethods
@@ -42,23 +40,19 @@ module KingTokens
42
40
  end
43
41
  end
44
42
  end
45
-
43
+
46
44
  end
47
-
45
+
48
46
  module SingletonMethods
49
47
 
50
48
  # Find a token.
51
49
  #
52
50
  # ==== Parameter
53
51
  # args<Hash{Symbol=>}>:: arguments passed to the conditions of the TokenCode.find method
54
- # ==== Options (args)
55
- # :object_type<String>:: the name of the object tpye, normally the class name of the related object
56
- #
57
52
  #
58
53
  # ==== Returns
59
54
  # Object:: the object to which the token belongs
60
55
  def find_token(args={})
61
- args.merge!({:object_type => can_has_tokens_options[:object_type]})
62
56
  TokenCode.find(:first, :conditions => args)
63
57
  end
64
58
 
@@ -88,7 +82,7 @@ module KingTokens
88
82
  return token.object if token && token.valid_for_use?
89
83
  end
90
84
  end
91
-
85
+
92
86
  module InstanceMethods
93
87
  # Create a token
94
88
  # ==== Parameter
@@ -104,7 +98,7 @@ module KingTokens
104
98
  self.token(name).destroy
105
99
  end
106
100
  args[:name] = "#{name}"
107
- args[:valid_until] ||= (args.delete(:valid) || self.can_has_tokens_options[:days_valid].days).from_now
101
+ args[:valid_until] ||= ( args.delete(:valid) || 5.days ).from_now
108
102
  self.token_codes.create(args)
109
103
  end
110
104
 
@@ -114,8 +108,8 @@ module KingTokens
114
108
  def token(name)
115
109
  self.token_codes.find_by_name("#{name}")
116
110
  end
117
-
111
+
118
112
  end
119
-
113
+
120
114
  end #module
121
115
  end # namespace
@@ -0,0 +1,3 @@
1
+ module KingTokens
2
+ VERSION= '2.0.0'
3
+ end
data/test/schema.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  ActiveRecord::Schema.define(:version => 0) do
2
3
 
3
4
  create_table :token_codes do |t|
@@ -6,7 +7,7 @@ ActiveRecord::Schema.define(:version => 0) do
6
7
  t.datetime :used_at, :valid_until
7
8
  t.timestamps
8
9
  end
9
-
10
+
10
11
  create_table :users do |t|
11
12
  t.string :name
12
13
  end
data/test/test_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'test/unit'
2
3
  require 'rubygems'
3
4
  require 'active_record'
@@ -9,7 +10,8 @@ require 'active_support/test_case'
9
10
  #require 'active_support/testing/assertions'
10
11
  #require ActiveSupport::TestCase
11
12
  require "#{File.dirname(__FILE__)}/../lib/king_tokens"
12
-
13
+ Encoding.default_external = Encoding::UTF_8
14
+ Encoding.default_internal = Encoding::UTF_8
13
15
  ActiveRecord::Base.establish_connection({
14
16
  'adapter' => 'sqlite3',
15
17
  'database' => ':memory:'
@@ -1,5 +1,8 @@
1
+ # encoding: utf-8
1
2
  require(File.join(File.dirname(__FILE__), 'test_helper'))
3
+ require 'logger'
2
4
 
5
+ ActiveRecord::Base.logger = Logger.new(STDERR)
3
6
  # TODO:
4
7
  # - make some nice mock objects!
5
8
  # - Tests still mixed for two classes
@@ -16,7 +19,7 @@ class TokenizerTest < Test::Unit::TestCase
16
19
  assert_respond_to User.new, m
17
20
  end
18
21
  end
19
-
22
+
20
23
  def test_should_set_the_token_automatically
21
24
  user = User.create(:name=>"joe")
22
25
  assert_difference "TokenCode.count" do
@@ -30,7 +33,7 @@ class TokenizerTest < Test::Unit::TestCase
30
33
  assert_equal false, user.forgot_password_token?
31
34
  user.set_forgot_password_token
32
35
  assert user.forgot_password_token?
33
-
36
+
34
37
  end
35
38
 
36
39
  def test_unique_name_in_polymorphic_scope
@@ -40,7 +43,7 @@ class TokenizerTest < Test::Unit::TestCase
40
43
  user.set_forgot_password_token
41
44
  end
42
45
  end
43
-
46
+
44
47
  def test_same_token_should_be_deleted
45
48
  user = User.create(:name=>"joe")
46
49
  user.set_forgot_password_token
@@ -58,7 +61,7 @@ class TokenizerTest < Test::Unit::TestCase
58
61
  user.set_forgot_password_token
59
62
  assert_in_delta user.token(:forgot_password).valid_until.to_i, 5.days.from_now.to_i, 10
60
63
  end
61
-
64
+
62
65
  def test_token_to_string
63
66
  user = User.create(:name=>"joe")
64
67
  user.set_forgot_password_token(:valid=>2.days)
@@ -70,7 +73,7 @@ class TokenizerTest < Test::Unit::TestCase
70
73
  user.set_forgot_password_token(:valid=>2.days)
71
74
  assert_in_delta user.token(:forgot_password).valid_until.to_i, 2.days.from_now.to_i,10
72
75
  end
73
-
76
+
74
77
  def test_should_use_and_return_unavailable
75
78
  user = User.create(:name=>"joe")
76
79
  user.set_forgot_password_token
@@ -136,6 +139,6 @@ class TokenizerTest < Test::Unit::TestCase
136
139
  assert_equal user, User.find_by_valid_token(:forgot_password, token.token)
137
140
  end
138
141
  def test_should_not_leak_token_options
139
-
142
+
140
143
  end
141
144
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: king_tokens
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 15
5
+ prerelease:
5
6
  segments:
6
- - 1
7
+ - 2
8
+ - 0
7
9
  - 0
8
- - 1
9
- version: 1.0.1
10
+ version: 2.0.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Georg Leciejewski
@@ -15,10 +16,92 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2010-05-04 00:00:00 +02:00
19
- default_executable:
20
- dependencies: []
21
-
19
+ date: 2010-05-04 00:00:00 Z
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: test-unit
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: activerecord
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: activesupport
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: rake
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :development
76
+ version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
78
+ name: rdoc
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :development
90
+ version_requirements: *id005
91
+ - !ruby/object:Gem::Dependency
92
+ name: sqlite3
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :development
104
+ version_requirements: *id006
22
105
  description: Tokens are a usefull way to give users access to an application. This can be for a limited time or just once. Just think of password resets, changing email, protected rss feed urls, timed out private links
23
106
  email: gl@salesking.eu
24
107
  executables: []
@@ -28,55 +111,52 @@ extensions: []
28
111
  extra_rdoc_files:
29
112
  - README.rdoc
30
113
  files:
31
- - .document
32
114
  - .gitignore
115
+ - Gemfile
33
116
  - MIT-LICENSE
34
117
  - README.rdoc
35
118
  - Rakefile
36
- - VERSION
37
- - coverage/index.html
38
- - coverage/lib-token_code_rb.html
39
- - coverage/lib-tokenizer_rb.html
40
- - init.rb
41
119
  - king_tokens.gemspec
42
120
  - lib/king_tokens.rb
43
121
  - lib/king_tokens/token_code.rb
44
122
  - lib/king_tokens/tokenizer.rb
123
+ - lib/king_tokens/version.rb
45
124
  - tasks/tokenizer_tasks.rake
46
125
  - test/schema.rb
47
126
  - test/test_helper.rb
48
127
  - test/tokenizer_test.rb
49
- has_rdoc: true
50
128
  homepage: http://github.com/schorsch/king_tokens
51
129
  licenses: []
52
130
 
53
131
  post_install_message:
54
- rdoc_options:
55
- - --charset=UTF-8
132
+ rdoc_options: []
133
+
56
134
  require_paths:
57
135
  - lib
58
136
  required_ruby_version: !ruby/object:Gem::Requirement
137
+ none: false
59
138
  requirements:
60
139
  - - ">="
61
140
  - !ruby/object:Gem::Version
141
+ hash: 3
62
142
  segments:
63
143
  - 0
64
144
  version: "0"
65
145
  required_rubygems_version: !ruby/object:Gem::Requirement
146
+ none: false
66
147
  requirements:
67
148
  - - ">="
68
149
  - !ruby/object:Gem::Version
150
+ hash: 3
69
151
  segments:
70
152
  - 0
71
153
  version: "0"
72
154
  requirements: []
73
155
 
74
156
  rubyforge_project:
75
- rubygems_version: 1.3.6
157
+ rubygems_version: 1.8.15
76
158
  signing_key:
77
159
  specification_version: 3
78
160
  summary: Access tokens for any active record object
79
- test_files:
80
- - test/schema.rb
81
- - test/test_helper.rb
82
- - test/tokenizer_test.rb
161
+ test_files: []
162
+
data/.document DELETED
@@ -1,3 +0,0 @@
1
- README.rdoc
2
- lib/**/*.rb
3
- LICENSE
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.0.1
data/coverage/index.html DELETED
@@ -1,112 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
3
- <head>
4
- <title>
5
- C0 code coverage information
6
- </title>
7
- <style type='text/css'>
8
- body { background-color: rgb(240, 240, 245); }
9
- </style>
10
- <style type='text/css'>
11
- span.cross-ref-title { font-size: 140%; } span.cross-ref a {
12
- text-decoration: none; } span.cross-ref { background-color:#f3f7fa;
13
- border: 1px dashed #333; margin: 1em; padding: 0.5em; overflow: hidden; }
14
- a.crossref-toggle { text-decoration: none; } span.marked0 {
15
- background-color: rgb(185, 210, 200); display: block; } span.marked1 {
16
- background-color: rgb(190, 215, 205); display: block; } span.inferred0 {
17
- background-color: rgb(175, 200, 200); display: block; } span.inferred1 {
18
- background-color: rgb(180, 205, 205); display: block; } span.uncovered0 {
19
- background-color: rgb(225, 110, 110); display: block; } span.uncovered1 {
20
- background-color: rgb(235, 120, 120); display: block; } span.overview {
21
- border-bottom: 8px solid black; } div.overview { border-bottom: 8px solid
22
- black; } body { font-family: verdana, arial, helvetica; } div.footer {
23
- font-size: 68%; margin-top: 1.5em; } h1, h2, h3, h4, h5, h6 {
24
- margin-bottom: 0.5em; } h5 { margin-top: 0.5em; } .hidden { display: none;
25
- } div.separator { height: 10px; } /* Commented out for better readability,
26
- esp. on IE */ /* table tr td, table tr th { font-size: 68%; } td.value
27
- table tr td { font-size: 11px; } */ table.percent_graph { height: 12px;
28
- border: #808080 1px solid; empty-cells: show; } table.percent_graph
29
- td.covered { height: 10px; background: #00f000; } table.percent_graph
30
- td.uncovered { height: 10px; background: #e00000; } table.percent_graph
31
- td.NA { height: 10px; background: #eaeaea; } table.report {
32
- border-collapse: collapse; width: 100%; } table.report td.heading {
33
- background: #dcecff; border: #d0d0d0 1px solid; font-weight: bold;
34
- text-align: center; } table.report td.heading:hover { background: #c0ffc0;
35
- } table.report td.text { border: #d0d0d0 1px solid; } table.report
36
- td.value, table.report td.lines_total, table.report td.lines_code {
37
- text-align: right; border: #d0d0d0 1px solid; } table.report tr.light {
38
- background-color: rgb(240, 240, 245); } table.report tr.dark {
39
- background-color: rgb(230, 230, 235); }
40
- </style>
41
- <script type='text/javascript'>
42
- // <![CDATA[ function toggleCode( id ) { if ( document.getElementById )
43
- elem = document.getElementById( id ); else if ( document.all ) elem =
44
- eval( "document.all." + id ); else return false; elemStyle = elem.style;
45
- if ( elemStyle.display != "block" ) { elemStyle.display = "block" } else {
46
- elemStyle.display = "none" } return true; } // Make cross-references
47
- hidden by default document.writeln( "<style
48
- type=\"text/css\">span.cross-ref { display: none }</style>" ) // ]]>
49
- </script>
50
- </head>
51
- <body>
52
- <h3>
53
- C0 code coverage information
54
- </h3>
55
- <p>
56
- Generated on Sun Dec 07 02:06:42 +0100 2008 with
57
- <a href='http://eigenclass.org/hiki/rcov'>
58
- rcov 0.8.1.2
59
- </a>
60
- </p>
61
- <hr />
62
- <table class='report'> <thead> <tr> <td class='heading'> Name </td> <td
63
- class='heading'> Total lines </td> <td class='heading'> Lines of code </td>
64
- <td class='heading'> Total coverage </td> <td class='heading'> Code coverage
65
- </td> </tr> </thead> <tbody> <tr class='light'> <td> TOTAL </td> <td
66
- class='lines_total'> <tt> 201 </tt> </td> <td class='lines_code'> <tt> 109
67
- </tt> </td> <td> <table cellspacing='0' align='right' cellpadding='0'> <tr>
68
- <td> <tt class='coverage_total'> 100.0% </tt> &nbsp; </td> <td> <table
69
- class='percent_graph' cellspacing='0' width='100' cellpadding='0'> <tr> <td
70
- class='covered' width='100' /> <td class='uncovered' width='0' /> </tr>
71
- </table> </td> </tr> </table> </td> <td> <table cellspacing='0'
72
- align='right' cellpadding='0'> <tr> <td> <tt class='coverage_code'> 100.0%
73
- </tt> &nbsp; </td> <td> <table class='percent_graph' cellspacing='0'
74
- width='100' cellpadding='0'> <tr> <td class='covered' width='100' /> <td
75
- class='uncovered' width='0' /> </tr> </table> </td> </tr> </table> </td>
76
- </tr> <tr class='dark'> <td> <a href='lib-token_code_rb.html'>
77
- lib/token_code.rb </a> </td> <td class='lines_total'> <tt> 80 </tt> </td>
78
- <td class='lines_code'> <tt> 46 </tt> </td> <td> <table cellspacing='0'
79
- align='right' cellpadding='0'> <tr> <td> <tt class='coverage_total'> 100.0%
80
- </tt> &nbsp; </td> <td> <table class='percent_graph' cellspacing='0'
81
- width='100' cellpadding='0'> <tr> <td class='covered' width='100' /> <td
82
- class='uncovered' width='0' /> </tr> </table> </td> </tr> </table> </td>
83
- <td> <table cellspacing='0' align='right' cellpadding='0'> <tr> <td> <tt
84
- class='coverage_code'> 100.0% </tt> &nbsp; </td> <td> <table
85
- class='percent_graph' cellspacing='0' width='100' cellpadding='0'> <tr> <td
86
- class='covered' width='100' /> <td class='uncovered' width='0' /> </tr>
87
- </table> </td> </tr> </table> </td> </tr> <tr class='light'> <td> <a
88
- href='lib-tokenizer_rb.html'> lib/tokenizer.rb </a> </td> <td
89
- class='lines_total'> <tt> 121 </tt> </td> <td class='lines_code'> <tt> 63
90
- </tt> </td> <td> <table cellspacing='0' align='right' cellpadding='0'> <tr>
91
- <td> <tt class='coverage_total'> 100.0% </tt> &nbsp; </td> <td> <table
92
- class='percent_graph' cellspacing='0' width='100' cellpadding='0'> <tr> <td
93
- class='covered' width='100' /> <td class='uncovered' width='0' /> </tr>
94
- </table> </td> </tr> </table> </td> <td> <table cellspacing='0'
95
- align='right' cellpadding='0'> <tr> <td> <tt class='coverage_code'> 100.0%
96
- </tt> &nbsp; </td> <td> <table class='percent_graph' cellspacing='0'
97
- width='100' cellpadding='0'> <tr> <td class='covered' width='100' /> <td
98
- class='uncovered' width='0' /> </tr> </table> </td> </tr> </table> </td>
99
- </tr> </tbody> </table>
100
- <hr />
101
- <p> Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'> rcov
102
- code coverage analysis tool for Ruby </a> version 0.8.1.2. </p>
103
- <p>
104
- <a href='http://validator.w3.org/check/referer'>
105
- <img src='http://www.w3.org/Icons/valid-xhtml11' height='31' alt='Valid XHTML 1.1!' width='88' />
106
- </a>
107
- <a href='http://jigsaw.w3.org/css-validator/check/referer'>
108
- <img src='http://jigsaw.w3.org/css-validator/images/vcss' alt='Valid CSS!' style='border:0;width:88px;height:31px' />
109
- </a>
110
- </p>
111
- </body>
112
- </html>