chunker 0.1.53 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/LICENSE +1 -1
  2. data/Rakefile +27 -42
  3. data/lib/chunker.rb +22 -24
  4. data/spec/chunker_spec.rb +41 -40
  5. metadata +27 -12
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008, Mahlon E. Smith
1
+ Copyright (c) 2008-2011, Mahlon E. Smith <mahlon@martini.nu>
2
2
 
3
3
  All rights reserved.
4
4
 
data/Rakefile CHANGED
@@ -1,15 +1,14 @@
1
1
  #!/usr/bin/env rake
2
2
  #
3
- # Chunker Rakefile
4
- #
5
3
 
6
4
  require 'rubygems'
7
5
  require 'pathname'
8
6
 
9
7
  require 'rake'
8
+ require 'rspec'
9
+ require 'rspec/core/rake_task'
10
10
  require 'rake/packagetask'
11
11
  require 'rake/gempackagetask'
12
- require 'spec/rake/spectask'
13
12
  require 'rubygems/installer'
14
13
  require 'rubygems/uninstaller'
15
14
 
@@ -23,10 +22,10 @@ BASEDIR = Pathname.new( __FILE__ ).expand_path.dirname.relative_path_from( Pathn
23
22
  TEXT_FILES = %w{ Rakefile README LICENSE }.collect {|f| BASEDIR + f }
24
23
 
25
24
  SPECDIR = BASEDIR + 'spec'
26
- SPEC_FILES = Pathname.glob( SPECDIR + '**/*_spec.rb' ).reject {|f| f =~ /^\.svn/ }
25
+ SPEC_FILES = Pathname.glob( SPECDIR + '**/*_spec.rb' )
27
26
 
28
27
  LIBDIR = BASEDIR + 'lib'
29
- LIB_FILES = Pathname.glob( LIBDIR + '**/*.rb').reject {|i| i =~ /\.svn/ }
28
+ LIB_FILES = Pathname.glob( LIBDIR + '**/*.rb')
30
29
 
31
30
  RELEASE_FILES = TEXT_FILES + LIB_FILES + SPEC_FILES
32
31
 
@@ -54,24 +53,33 @@ end
54
53
  ######################################################################
55
54
 
56
55
  PKG_NAME = 'chunker'
57
- PKG_VERSION = find_pattern( LIBDIR + 'chunker.rb', /VERSION = ['"](\d\.\d(?:\/\d)?)['"]/ )
58
- PKG_REVISION = find_pattern( LIBDIR + 'chunker.rb', /SVNRev = .+Rev: (\d+)/ )
59
- PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}.#{PKG_REVISION}"
56
+ PKG_VERSION = find_pattern( LIBDIR + 'chunker.rb', /VERSION = ['"](.+)['"]/ )
57
+ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
60
58
 
61
59
 
62
60
  ######################################################################
63
61
  ### T A S K S
64
62
  ######################################################################
65
63
 
66
- task :default => [ :test, :package ]
64
+ task :test => 'test:spec'
65
+ task :default => :test
66
+ # task :default => [ :test, :package ]
67
67
 
68
68
 
69
- ### Task: run rspec tests
69
+ ### Tasks: testing via rspec
70
70
  ###
71
- desc "Run tests"
72
- Spec::Rake::SpecTask.new('test') do |task|
73
- task.spec_files = SPEC_FILES
74
- task.spec_opts = %w{ -c -fs }
71
+ namespace :test do
72
+ desc 'Generate verbose and pretty output'
73
+ RSpec::Core::RakeTask.new( :spec ) do |task|
74
+ task.pattern = SPEC_FILES
75
+ task.rspec_opts = ['-b', '-fd', '-c']
76
+ end
77
+
78
+ desc 'Generate quiet non-colored plain-text output'
79
+ RSpec::Core::RakeTask.new( :quiet ) do |task|
80
+ task.pattern = SPEC_FILES
81
+ task.rspec_opts = ['-f', 'p']
82
+ end
75
83
  end
76
84
 
77
85
 
@@ -87,46 +95,23 @@ end
87
95
  ### Task: Create gem from source
88
96
  ###
89
97
  gem = Gem::Specification.new do |gem|
90
- pkg_build = PKG_REVISION || 0
91
-
92
98
  gem.summary = "A convenience library for parsing __END__ tokens consistently."
93
99
  gem.name = PKG_NAME
94
- gem.version = "%s.%s" % [ PKG_VERSION, pkg_build ]
100
+ gem.version = PKG_VERSION
95
101
  gem.author = 'Mahlon E. Smith'
96
102
  gem.email = 'mahlon@martini.nu'
97
103
  gem.homepage = 'http://projects.martini.nu/ruby-modules/wiki/Chunker'
98
- gem.rubyforge_project = 'mahlon'
99
104
  gem.has_rdoc = true
105
+ gem.extra_rdoc_files = ['README']
106
+ gem.rdoc_options << '--main' << 'README'
107
+
100
108
 
101
109
  gem.files = RELEASE_FILES.
102
110
  collect {|f| f.relative_path_from(BASEDIR).to_s }
103
111
  gem.test_files = SPEC_FILES.
104
112
  collect {|f| f.relative_path_from(BASEDIR).to_s }
105
113
 
106
- gem.description = <<-EOF
107
- Ruby provides an automatic constant called DATA, which is an IO object
108
- that references all text in the current file under an __END__ token.
109
-
110
- I find it convenient to use the __END__ area to store all sorts of
111
- stuff, rather than have to worry about distributing separate files.
112
-
113
- The DATA constant is determined from whatever ruby believes $0 to be.
114
- It doesn't work inside of other required libraries, so you'll see stuff
115
- like this all the time:
116
-
117
- END = File.open( __FILE__ ).read.split( /^__END__/, 2 ).last
118
-
119
- It works, but it's more work than I want to do.
120
-
121
- Chunker solves this by parsing __END__ tokens for you, and making it
122
- available in the form of a 'DATA_END' constant. It installs this
123
- constant into the class that includes Chunker, so you can use it again
124
- and again, assuming you use a different file for each class.
125
-
126
- It also automatically parses out other things that look like tokens, so
127
- you can easily have multiple, distinct documents all embedded into the
128
- __END__ block.
129
- EOF
114
+ gem.description = "Embed arbitrary data and multiple, distinct documents within ruby files."
130
115
  end
131
116
 
132
117
  Rake::GemPackageTask.new( gem ) do |pkg|
@@ -1,10 +1,14 @@
1
- #!/usr/bin/ruby
1
+ # vim: set nosta noet ts=4 sw=4:
2
+
3
+ require 'strscan'
4
+ require 'stringio'
5
+
2
6
  #
3
7
  # Chunker: A convenience library for parsing __END__ tokens consistently.
4
8
  #
5
9
  # == Version
6
10
  #
7
- # $Id: chunker.rb 53 2008-11-09 00:27:36Z mahlon $
11
+ # $Id: chunker.rb,v 01a3332bfe0a 2011/01/22 03:41:16 mahlon $
8
12
  #
9
13
  # == Author
10
14
  #
@@ -17,20 +21,14 @@
17
21
  ###
18
22
  module Chunker
19
23
 
20
- require 'strscan'
21
- require 'stringio'
22
-
23
- # SVN Revision
24
- #
25
- SVNRev = %q$Rev: 53 $
24
+ # VCS Revision
25
+ VCSRev = %q$Rev: 01a3332bfe0a $
26
26
 
27
- # SVN Id
28
- #
29
- SVNId = %q$Id: chunker.rb 53 2008-11-09 00:27:36Z mahlon $
27
+ # VCS Id
28
+ VCSId = %q$Id: chunker.rb,v 01a3332bfe0a 2011/01/22 03:41:16 mahlon $
30
29
 
31
30
  # Package version
32
- #
33
- VERSION = '0.1'
31
+ VERSION = '1.0.0'
34
32
 
35
33
 
36
34
  ### Parser class for __END__ data blocks.
@@ -40,11 +38,9 @@ module Chunker
40
38
  class DataParser
41
39
 
42
40
  # The mark for a DATA block.
43
- #
44
41
  END_TOKEN = /^__END__\r?\n/
45
42
 
46
43
  # The mark for a 'sub' block.
47
- #
48
44
  CHUNK_TOKEN = /^__([A-Z\_0-9]+)__\r?\n/
49
45
 
50
46
 
@@ -59,11 +55,14 @@ module Chunker
59
55
  @scanner = StringScanner.new( end_string )
60
56
  io.close
61
57
 
58
+ # put each chunk into its own constant
59
+ #
62
60
  if @scanner.check_until( CHUNK_TOKEN )
63
- # put each chunk into its own constant
64
61
  self.extract_blocks
62
+
63
+ # no sub blocks, put the whole mess into DATA_END
64
+ #
65
65
  else
66
- # no sub blocks, put the whole mess into DATA_END
67
66
  @klass.const_set( :DATA_END, StringIO.new( end_string ) )
68
67
  end
69
68
  end
@@ -93,20 +92,20 @@ module Chunker
93
92
  else
94
93
  label = @scanner[1]
95
94
 
95
+ # Pull the next token text out of the data, set up the next pass
96
+ #
96
97
  if data = @scanner.scan_until( CHUNK_TOKEN )
97
- # Pull the next token text out of the data, set up the next pass
98
- #
99
- data = data[ 0, data.length - @scanner[0].length ]
98
+ data = data[ 0, data.length - @scanner[0].length ]
100
99
  @scanner.pos = self.next_position
100
+
101
+ # No additional blocks
102
+ #
101
103
  else
102
- # No additional blocks
103
- #
104
104
  data = @scanner.rest
105
105
  end
106
106
  end
107
107
 
108
108
  # Add the IO constant to the class that included me.
109
- #
110
109
  @klass.const_set( "DATA_#{label}".to_sym, StringIO.new( data ) )
111
110
  end
112
111
  end
@@ -126,7 +125,6 @@ module Chunker
126
125
  def self.included( klass )
127
126
  # klass.instance_eval{ __FILE__ } awww, nope.
128
127
  # __FILE__ won't work here, so we find the filename via caller().
129
- #
130
128
  io = File.open( caller(1).last.sub(/:.*?$/, ''), 'r' )
131
129
 
132
130
  DataParser.new( klass, io )
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env ruby
1
+ # vim: set nosta noet ts=4 sw=4 ft=rspec:
2
2
 
3
3
  BEGIN {
4
4
  require 'pathname'
@@ -8,9 +8,8 @@ BEGIN {
8
8
  $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
9
9
  }
10
10
 
11
+ require 'rspec'
11
12
  require 'chunker'
12
- require 'rubygems'
13
- require 'spec'
14
13
 
15
14
  ENDSTUFF = <<ENDSTUFF
16
15
  Stuff within the end block.
@@ -65,53 +64,55 @@ __HURGADURGA__
65
64
  EO_FILE_TEXT
66
65
 
67
66
 
68
- describe Chunker::DataParser do
67
+ describe Chunker do
69
68
 
70
- it "doesn't include content above the __END__ token" do
71
- klass = Class.new
72
- dp = Chunker::DataParser.new( klass, StringIO.new( FILE_TEXT_MULTIPLE ))
73
- dp.instance_variable_get( :@scanner ).string.
74
- should_not =~ /This is stuff we shouldn't see/
75
- end
69
+ describe Chunker::DataParser do
70
+
71
+ it "doesn't include content above the __END__ token" do
72
+ klass = Class.new
73
+ dp = Chunker::DataParser.new( klass, StringIO.new( FILE_TEXT_MULTIPLE ))
74
+ dp.instance_variable_get( :@scanner ).string.
75
+ should_not =~ /This is stuff we shouldn't see/
76
+ end
76
77
 
77
- it "doesn't contain the __END__ token itself" do
78
- klass = Class.new
79
- dp = Chunker::DataParser.new( klass, StringIO.new( FILE_TEXT ))
80
- dp.instance_variable_get( :@scanner ).string.should_not =~ /^__END__/
78
+ it "doesn't contain the __END__ token itself" do
79
+ klass = Class.new
80
+ dp = Chunker::DataParser.new( klass, StringIO.new( FILE_TEXT ))
81
+ dp.instance_variable_get( :@scanner ).string.should_not =~ /^__END__/
82
+ end
81
83
  end
82
- end
83
84
 
84
85
 
85
- describe 'A class that includes Chunker' do
86
+ context 'when included from another class' do
86
87
 
87
- it "has all content in DATA_END if there are no sub blocks" do
88
- File.stub!( :open ).and_return( StringIO.new( FILE_TEXT ))
89
- klass = Class.new { include Chunker }
88
+ it "has all content in DATA_END if there are no sub blocks" do
89
+ File.stub!( :open ).and_return( StringIO.new( FILE_TEXT ))
90
+ klass = Class.new { include Chunker }
90
91
 
91
- klass.constants.should_not include( 'DATA_POOP' )
92
- klass.constants.should_not include( 'DATA_HURRRRG' )
93
- klass.constants.should_not include( 'DATA_HURGADURGA' )
94
- klass.constants.should include( 'DATA_END' )
95
- end
92
+ klass.constants.should_not include( 'DATA_POOP' )
93
+ klass.constants.should_not include( 'DATA_HURRRRG' )
94
+ klass.constants.should_not include( 'DATA_HURGADURGA' )
95
+ klass.constants.should include( 'DATA_END' )
96
+ end
96
97
 
97
- it "separates data sub blocks into individual constants" do
98
- File.stub!( :open ).and_return( StringIO.new( FILE_TEXT_MULTIPLE ))
99
- klass = Class.new { include Chunker }
98
+ it "separates data sub blocks into individual constants" do
99
+ File.stub!( :open ).and_return( StringIO.new( FILE_TEXT_MULTIPLE ))
100
+ klass = Class.new { include Chunker }
100
101
 
101
- klass.constants.should include( 'DATA_END' )
102
- klass.constants.should include( 'DATA_POOP' )
103
- klass.constants.should include( 'DATA_HURRRRG' )
104
- klass.constants.should include( 'DATA_HURGADURGA' )
105
- end
102
+ klass.constants.should include( 'DATA_END' )
103
+ klass.constants.should include( 'DATA_POOP' )
104
+ klass.constants.should include( 'DATA_HURRRRG' )
105
+ klass.constants.should include( 'DATA_HURGADURGA' )
106
+ end
106
107
 
107
- it "has IO constants that contain the data block contents" do
108
- File.stub!( :open ).and_return( StringIO.new( FILE_TEXT_MULTIPLE ))
109
- klass = Class.new { include Chunker }
108
+ it "has IO constants that contain the data block contents" do
109
+ File.stub!( :open ).and_return( StringIO.new( FILE_TEXT_MULTIPLE ))
110
+ klass = Class.new { include Chunker }
110
111
 
111
- klass.const_get( :DATA_END ).read.chomp.should == ENDSTUFF
112
- klass.const_get( :DATA_POOP ).read.chomp.should == POOP
113
- klass.const_get( :DATA_HURRRRG ).read.chomp.should == HURRRRG
114
- klass.const_get( :DATA_HURGADURGA ).read.chomp.should == HURGADURGA
112
+ klass.const_get( :DATA_END ).read.chomp.should == ENDSTUFF
113
+ klass.const_get( :DATA_POOP ).read.chomp.should == POOP
114
+ klass.const_get( :DATA_HURRRRG ).read.chomp.should == HURRRRG
115
+ klass.const_get( :DATA_HURGADURGA ).read.chomp.should == HURGADURGA
116
+ end
115
117
  end
116
118
  end
117
-
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chunker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.53
4
+ hash: 23
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
5
11
  platform: ruby
6
12
  authors:
7
13
  - Mahlon E. Smith
@@ -9,18 +15,18 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2008-11-10 00:00:00 -08:00
18
+ date: 2011-01-22 00:00:00 -08:00
13
19
  default_executable:
14
20
  dependencies: []
15
21
 
16
- description: "Ruby provides an automatic constant called DATA, which is an IO object that references all text in the current file under an __END__ token. I find it convenient to use the __END__ area to store all sorts of stuff, rather than have to worry about distributing separate files. The DATA constant is determined from whatever ruby believes $0 to be. It doesn't work inside of other required libraries, so you'll see stuff like this all the time: END = File.open( __FILE__ ).read.split( /^__END__/, 2 ).last It works, but it's more work than I want to do. Chunker solves this by parsing __END__ tokens for you, and making it available in the form of a 'DATA_END' constant. It installs this constant into the class that includes Chunker, so you can use it again and again, assuming you use a different file for each class. It also automatically parses out other things that look like tokens, so you can easily have multiple, distinct documents all embedded into the __END__ block."
22
+ description: Embed arbitrary data and multiple, distinct documents within ruby files.
17
23
  email: mahlon@martini.nu
18
24
  executables: []
19
25
 
20
26
  extensions: []
21
27
 
22
- extra_rdoc_files: []
23
-
28
+ extra_rdoc_files:
29
+ - README
24
30
  files:
25
31
  - Rakefile
26
32
  - README
@@ -29,29 +35,38 @@ files:
29
35
  - spec/chunker_spec.rb
30
36
  has_rdoc: true
31
37
  homepage: http://projects.martini.nu/ruby-modules/wiki/Chunker
32
- post_install_message:
33
- rdoc_options: []
38
+ licenses: []
34
39
 
40
+ post_install_message:
41
+ rdoc_options:
42
+ - --main
43
+ - README
35
44
  require_paths:
36
45
  - lib
37
46
  required_ruby_version: !ruby/object:Gem::Requirement
47
+ none: false
38
48
  requirements:
39
49
  - - ">="
40
50
  - !ruby/object:Gem::Version
51
+ hash: 3
52
+ segments:
53
+ - 0
41
54
  version: "0"
42
- version:
43
55
  required_rubygems_version: !ruby/object:Gem::Requirement
56
+ none: false
44
57
  requirements:
45
58
  - - ">="
46
59
  - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 0
47
63
  version: "0"
48
- version:
49
64
  requirements: []
50
65
 
51
- rubyforge_project: mahlon
52
- rubygems_version: 1.3.1
66
+ rubyforge_project:
67
+ rubygems_version: 1.3.7
53
68
  signing_key:
54
- specification_version: 2
69
+ specification_version: 3
55
70
  summary: A convenience library for parsing __END__ tokens consistently.
56
71
  test_files:
57
72
  - spec/chunker_spec.rb