king_tokens 1.0.1 → 2.0.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.
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>