imw 0.1.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 +15 -0
- data/CHANGELOG +0 -0
- data/LICENSE +674 -0
- data/README.rdoc +101 -0
- data/Rakefile +20 -0
- data/VERSION +1 -0
- data/etc/imwrc.rb +76 -0
- data/lib/imw.rb +42 -0
- data/lib/imw/boot.rb +58 -0
- data/lib/imw/dataset.rb +233 -0
- data/lib/imw/dataset/datamapper.rb +66 -0
- data/lib/imw/dataset/datamapper/time_and_user_stamps.rb +37 -0
- data/lib/imw/dataset/loaddump.rb +50 -0
- data/lib/imw/dataset/old/file_collection.rb +88 -0
- data/lib/imw/dataset/old/file_collection_utils.rb +71 -0
- data/lib/imw/dataset/scaffold.rb +132 -0
- data/lib/imw/dataset/scraped_uri.rb +305 -0
- data/lib/imw/dataset/scrub/old_working_scrubber.rb +87 -0
- data/lib/imw/dataset/scrub/scrub.rb +147 -0
- data/lib/imw/dataset/scrub/scrub_simple_url.rb +38 -0
- data/lib/imw/dataset/scrub/scrub_test.rb +60 -0
- data/lib/imw/dataset/scrub/slug.rb +101 -0
- data/lib/imw/dataset/stats.rb +73 -0
- data/lib/imw/dataset/stats/counter.rb +23 -0
- data/lib/imw/dataset/task.rb +38 -0
- data/lib/imw/dataset/workflow.rb +81 -0
- data/lib/imw/files.rb +110 -0
- data/lib/imw/files/archive.rb +113 -0
- data/lib/imw/files/basicfile.rb +122 -0
- data/lib/imw/files/binary.rb +28 -0
- data/lib/imw/files/compressed_file.rb +93 -0
- data/lib/imw/files/compressed_files_and_archives.rb +348 -0
- data/lib/imw/files/compressible.rb +103 -0
- data/lib/imw/files/csv.rb +112 -0
- data/lib/imw/files/json.rb +41 -0
- data/lib/imw/files/sgml.rb +65 -0
- data/lib/imw/files/text.rb +68 -0
- data/lib/imw/files/yaml.rb +46 -0
- data/lib/imw/packagers.rb +8 -0
- data/lib/imw/packagers/archiver.rb +108 -0
- data/lib/imw/packagers/s3_mover.rb +28 -0
- data/lib/imw/parsers.rb +7 -0
- data/lib/imw/parsers/html_parser.rb +382 -0
- data/lib/imw/parsers/html_parser/matchers.rb +306 -0
- data/lib/imw/parsers/line_parser.rb +87 -0
- data/lib/imw/parsers/regexp_parser.rb +72 -0
- data/lib/imw/utils.rb +24 -0
- data/lib/imw/utils/components.rb +61 -0
- data/lib/imw/utils/config.rb +46 -0
- data/lib/imw/utils/error.rb +54 -0
- data/lib/imw/utils/extensions/array.rb +125 -0
- data/lib/imw/utils/extensions/class/attribute_accessors.rb +8 -0
- data/lib/imw/utils/extensions/core.rb +43 -0
- data/lib/imw/utils/extensions/dir.rb +24 -0
- data/lib/imw/utils/extensions/file_core.rb +64 -0
- data/lib/imw/utils/extensions/hash.rb +218 -0
- data/lib/imw/utils/extensions/hpricot.rb +48 -0
- data/lib/imw/utils/extensions/string.rb +49 -0
- data/lib/imw/utils/extensions/struct.rb +42 -0
- data/lib/imw/utils/extensions/symbol.rb +28 -0
- data/lib/imw/utils/extensions/typed_struct.rb +22 -0
- data/lib/imw/utils/extensions/uri.rb +59 -0
- data/lib/imw/utils/log.rb +67 -0
- data/lib/imw/utils/misc.rb +63 -0
- data/lib/imw/utils/paths.rb +115 -0
- data/lib/imw/utils/uri.rb +59 -0
- data/lib/imw/utils/uuid.rb +33 -0
- data/lib/imw/utils/validate.rb +38 -0
- data/lib/imw/utils/version.rb +12 -0
- data/lib/imw/utils/view.rb +113 -0
- data/lib/imw/utils/view/dump_csv.rb +112 -0
- data/lib/imw/utils/view/dump_csv_older.rb +117 -0
- data/spec/data/sample.csv +131 -0
- data/spec/data/sample.tsv +131 -0
- data/spec/data/sample.txt +131 -0
- data/spec/data/sample.xml +653 -0
- data/spec/data/sample.yaml +652 -0
- data/spec/imw/dataset/datamapper/uri_spec.rb +43 -0
- data/spec/imw/dataset/datamapper_spec_helper.rb +11 -0
- data/spec/imw/files/archive_spec.rb +118 -0
- data/spec/imw/files/basicfile_spec.rb +121 -0
- data/spec/imw/files/bz2_spec.rb +32 -0
- data/spec/imw/files/compressed_file_spec.rb +96 -0
- data/spec/imw/files/compressible_spec.rb +100 -0
- data/spec/imw/files/file_spec.rb +144 -0
- data/spec/imw/files/gz_spec.rb +32 -0
- data/spec/imw/files/rar_spec.rb +33 -0
- data/spec/imw/files/tar_spec.rb +31 -0
- data/spec/imw/files/text_spec.rb +23 -0
- data/spec/imw/files/zip_spec.rb +31 -0
- data/spec/imw/files_spec.rb +38 -0
- data/spec/imw/packagers/archiver_spec.rb +125 -0
- data/spec/imw/packagers/s3_mover_spec.rb +7 -0
- data/spec/imw/parsers/line_parser_spec.rb +96 -0
- data/spec/imw/parsers/regexp_parser_spec.rb +42 -0
- data/spec/imw/utils/extensions/file_core_spec.rb +72 -0
- data/spec/imw/utils/extensions/find_spec.rb +113 -0
- data/spec/imw/utils/paths_spec.rb +38 -0
- data/spec/imw/workflow/rip/local_spec.rb +89 -0
- data/spec/imw/workflow/rip_spec.rb +27 -0
- data/spec/rcov.opts +1 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/support/archive_contents_matcher.rb +94 -0
- data/spec/support/custom_matchers.rb +21 -0
- data/spec/support/directory_contents_matcher.rb +61 -0
- data/spec/support/extensions.rb +18 -0
- data/spec/support/file_contents_matcher.rb +50 -0
- data/spec/support/random.rb +210 -0
- data/spec/support/without_regard_to_order_matcher.rb +58 -0
- metadata +196 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#
|
|
2
|
+
# h2. lib/imw/files//compressible.rb -- compression module
|
|
3
|
+
#
|
|
4
|
+
# == About
|
|
5
|
+
#
|
|
6
|
+
# Module used for compression of files. An including
|
|
7
|
+
# <tt>IMW::Files::BasicFile</tt> object gains +compress+ and
|
|
8
|
+
# <tt>compress!</tt> methods.
|
|
9
|
+
#
|
|
10
|
+
# By default, bzip2 is used for compression though gzip can also be
|
|
11
|
+
# specified (the full list of known compression programs is in
|
|
12
|
+
# <tt>IMW::Files::Compressible::COMPRESSION_PROGS</tt>). Zip and Rar
|
|
13
|
+
# compression are handled by the <tt>IMW::Files::Archive</tt> module.
|
|
14
|
+
#
|
|
15
|
+
# Decompression should be handled via the
|
|
16
|
+
# <tt>IMW::Files::CompressedFile</tt> class.
|
|
17
|
+
#
|
|
18
|
+
# Author:: (Philip flip Kromer, Dhruv Bansal) for Infinite Monkeywrench Project (mailto:coders@infochimps.org)
|
|
19
|
+
# Copyright:: Copyright (c) 2008 infochimps.org
|
|
20
|
+
# License:: GPL 3.0
|
|
21
|
+
# Website:: http://infinitemonkeywrench.org/
|
|
22
|
+
#
|
|
23
|
+
# puts "#{File.basename(__FILE__)}: Why is it that when you squeeze a lemon you get lemonade but when you squeeze a banana you just get a mess?" # at bottom
|
|
24
|
+
module IMW
|
|
25
|
+
module Files
|
|
26
|
+
module Compressible
|
|
27
|
+
|
|
28
|
+
# Known compression programs.
|
|
29
|
+
COMPRESSION_PROGS = [:bzip2, :gzip]
|
|
30
|
+
|
|
31
|
+
# Extensions that are appended by each compression program.
|
|
32
|
+
COMPRESSION_EXTS = {
|
|
33
|
+
:bzip2 => '.bz2',
|
|
34
|
+
:gzip => '.gz'
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# Compression flags for each program
|
|
38
|
+
COMPRESSION_FLAGS = {
|
|
39
|
+
:bzip2 => "-f",
|
|
40
|
+
:gzip => "-f"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
protected
|
|
44
|
+
# Check that +program+ is a valid compression program.
|
|
45
|
+
def ensure_valid_compression_program program
|
|
46
|
+
raise IMW::Error.new("#{program} is not a valid compression program (#{COMPRESSION_PROGS.join(' ,')}).") unless COMPRESSION_PROGS.include? program
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Construct the command passed to the shell to compress this
|
|
50
|
+
# file using the given +program+.
|
|
51
|
+
def compression_command program
|
|
52
|
+
ensure_valid_compression_program program
|
|
53
|
+
[IMW::EXTERNAL_PROGRAMS[program],COMPRESSION_FLAGS[program],self.path].join ' '
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Return the object representing this file compressed with
|
|
57
|
+
# +program+.
|
|
58
|
+
def compressed_file_path program
|
|
59
|
+
ensure_valid_compression_program program
|
|
60
|
+
path = File.join(self.dirname,self.basename + COMPRESSION_EXTS[program])
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
public
|
|
64
|
+
# Compress this file in its present directory using +program+,
|
|
65
|
+
# overwriting any existing compressed files and without saving
|
|
66
|
+
# the original file. Returns an
|
|
67
|
+
# <tt>IMW::Files::CompressedFile</tt> object corresponding to
|
|
68
|
+
# the compressed file.
|
|
69
|
+
#
|
|
70
|
+
# Options:
|
|
71
|
+
#
|
|
72
|
+
# <tt>:program</tt> (<tt>:bzip2</tt>):: names the compression
|
|
73
|
+
# program from the choices in <tt>IMW::EXTERNAL_PROGRAMS</tt>.
|
|
74
|
+
def compress! program = :bzip2
|
|
75
|
+
raise IMW::PathError.new("cannot compress #{@path}, doesn't exist!") unless exist?
|
|
76
|
+
FileUtils.cd(@dirname) { IMW.system(self.compression_command(program)) }
|
|
77
|
+
IMW.open(self.compressed_file_path(program))
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Compress this file in its present directory, overwriting any
|
|
81
|
+
# existing compressed files while keeping the original file.
|
|
82
|
+
# Returns an <tt>IMW::Files::CompressedFile</tt> object
|
|
83
|
+
# corresponding to the compressed file.
|
|
84
|
+
#
|
|
85
|
+
# Options:
|
|
86
|
+
#
|
|
87
|
+
# <tt>:program</tt> (<tt>:bzip2</tt>):: names the compression
|
|
88
|
+
# program from the choices in <tt>IMW::EXTERNAL_PROGRAMS</tt>.
|
|
89
|
+
def compress program = :bzip2
|
|
90
|
+
raise IMW::PathError.new("cannot compress #{@path}, doesn't exist!") unless exist?
|
|
91
|
+
begin
|
|
92
|
+
FileUtils.cp(self.path,self.path + 'copy')
|
|
93
|
+
compress! program
|
|
94
|
+
ensure
|
|
95
|
+
FileUtils.mv(self.path + 'copy',self.path)
|
|
96
|
+
end
|
|
97
|
+
IMW.open(self.compressed_file_path(program))
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#
|
|
2
|
+
# h2. lib/imw/files/csv.rb -- CSV, TSV files
|
|
3
|
+
#
|
|
4
|
+
# == About
|
|
5
|
+
#
|
|
6
|
+
# For "comma-separated value" (CSV) and "tab-separated value" (TSV)
|
|
7
|
+
# files.
|
|
8
|
+
#
|
|
9
|
+
# Author:: (Philip flip Kromer, Dhruv Bansal) for Infinite Monkeywrench Project (mailto:coders@infochimps.org)
|
|
10
|
+
# Copyright:: Copyright (c) 2008 infochimps.org
|
|
11
|
+
# License:: GPL 3.0
|
|
12
|
+
# Website:: http://infinitemonkeywrench.org/
|
|
13
|
+
#
|
|
14
|
+
# puts "#{File.basename(__FILE__)}: Something clever" # at bottom
|
|
15
|
+
|
|
16
|
+
require 'fastercsv'
|
|
17
|
+
module IMW
|
|
18
|
+
module Files
|
|
19
|
+
|
|
20
|
+
# A base class from which to subclass various types of tabular
|
|
21
|
+
# data files (CSV, TSV, &c.)
|
|
22
|
+
class TabularDataFile < FasterCSV
|
|
23
|
+
|
|
24
|
+
include IMW::Files::BasicFile
|
|
25
|
+
include IMW::Files::Compressible
|
|
26
|
+
|
|
27
|
+
# Default options to be passed to
|
|
28
|
+
# FasterCSV[http://fastercsv.rubyforge.org/]; see its
|
|
29
|
+
# documentation for more information.
|
|
30
|
+
DEFAULT_OPTIONS = {
|
|
31
|
+
:col_sep => ',',
|
|
32
|
+
:headers => false,
|
|
33
|
+
:return_headers => false,
|
|
34
|
+
:write_headers => true,
|
|
35
|
+
:skip_blanks => false,
|
|
36
|
+
:force_quotes => false
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
def initialize uri, mode='r', options = {}
|
|
40
|
+
options.reverse_merge!(self.class::DEFAULT_OPTIONS)
|
|
41
|
+
self.uri= uri
|
|
42
|
+
super open(uri,mode),options
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Return the contents of this CSV file as an array of arrays.
|
|
46
|
+
def load
|
|
47
|
+
entries
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Dump +data+ to this file.
|
|
51
|
+
#
|
|
52
|
+
# Options include:
|
|
53
|
+
# <tt>:flush</tt> (true):: flush the file buffer, writing it to disk
|
|
54
|
+
# <tt>:close</tt> (true):: close the file after writing +data+
|
|
55
|
+
def dump data, options = {}
|
|
56
|
+
options = options.reverse_merge :close => true, :flush => true
|
|
57
|
+
data.each {|row| self << row}
|
|
58
|
+
self.flush if options[:flush]
|
|
59
|
+
self.close if options[:close]
|
|
60
|
+
self
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Return a random sample of rows.
|
|
64
|
+
def sample length=10
|
|
65
|
+
rows, indices = [], Set.new
|
|
66
|
+
begin
|
|
67
|
+
each_with_index do |row, index|
|
|
68
|
+
break if rows.size == length
|
|
69
|
+
next if index != 0 && rand < 0.75 # skip 3/4 of rows after the 1st
|
|
70
|
+
rows << row
|
|
71
|
+
indices << index
|
|
72
|
+
end
|
|
73
|
+
# now fill up to length if not there already
|
|
74
|
+
while rows.length < length
|
|
75
|
+
each_with_index do |row, index|
|
|
76
|
+
break if rows.size == length
|
|
77
|
+
next if index indices.include?(index)
|
|
78
|
+
rows << row
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
rows
|
|
82
|
+
rescue FasterCSV::MalformedCSVError
|
|
83
|
+
rows
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# Represents a file of comma-separated values (CSV). This class
|
|
90
|
+
# is a subclass of <tt>FasterCSV</tt> so the methods of that
|
|
91
|
+
# library are available for use.
|
|
92
|
+
#
|
|
93
|
+
# See <tt>IMW::Files::TabularDataFile</tt> for more complete
|
|
94
|
+
# documentation.
|
|
95
|
+
class Csv < TabularDataFile
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Represents a file of tab-separated values (TSV). This class
|
|
99
|
+
# is a subclass of <tt>FasterCSV</tt> so the methods of that
|
|
100
|
+
# library are available for use.
|
|
101
|
+
#
|
|
102
|
+
# See <tt>IMW::Files::TabularDataFile</tt> for more complete
|
|
103
|
+
# documentation.
|
|
104
|
+
class Tsv < TabularDataFile
|
|
105
|
+
DEFAULT_OPTIONS = {:col_sep => "\t"}.reverse_merge DEFAULT_OPTIONS
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
FILE_REGEXPS << [/\.csv$/, IMW::Files::Csv]
|
|
109
|
+
FILE_REGEXPS << [/\.tsv$/, IMW::Files::Tsv]
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
|
|
2
|
+
# h2. lib/imw/files/json.rb -- describes json files
|
|
3
|
+
#
|
|
4
|
+
# == About
|
|
5
|
+
#
|
|
6
|
+
# A class for working with JSON files.
|
|
7
|
+
#
|
|
8
|
+
# Author:: (Philip flip Kromer, Dhruv Bansal) for Infinite Monkeywrench Project (mailto:coders@infochimps.org)
|
|
9
|
+
# Copyright:: Copyright (c) 2008 infochimps.org
|
|
10
|
+
# License:: GPL 3.0
|
|
11
|
+
# Website:: http://infinitemonkeywrench.org/
|
|
12
|
+
#
|
|
13
|
+
# puts "#{File.basename(__FILE__)}: Yet another clever comment." # at bottobm
|
|
14
|
+
|
|
15
|
+
require 'json'
|
|
16
|
+
require 'imw/files/text'
|
|
17
|
+
|
|
18
|
+
module IMW
|
|
19
|
+
module Files
|
|
20
|
+
|
|
21
|
+
class Json < IMW::Files::Text
|
|
22
|
+
|
|
23
|
+
def initialize uri, mode='r', options = {}
|
|
24
|
+
super uri, mode
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Return the contents of this JSON file.
|
|
28
|
+
#
|
|
29
|
+
# FIXME what to do if a block is passed in?
|
|
30
|
+
def load &block
|
|
31
|
+
JSON.parse File.new(@path).read
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Dump +data+ to this file as JSON.
|
|
35
|
+
def dump data
|
|
36
|
+
super data.to_json
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
FILE_REGEXPS << [/\.json$/, IMW::Files::Json]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#
|
|
2
|
+
# h2. lib/imw/files/sgml.rb -- SGML files
|
|
3
|
+
#
|
|
4
|
+
# == About
|
|
5
|
+
#
|
|
6
|
+
# For SGML-derived files, including XML, HTML, &c..
|
|
7
|
+
#
|
|
8
|
+
# Author:: (Philip flip Kromer, Dhruv Bansal) for Infinite Monkeywrench Project (mailto:coders@infochimps.org)
|
|
9
|
+
# Copyright:: Copyright (c) 2008 infochimps.org
|
|
10
|
+
# License:: GPL 3.0
|
|
11
|
+
# Website:: http://infinitemonkeywrench.org/
|
|
12
|
+
#
|
|
13
|
+
# puts "#{File.basename(__FILE__)}: Something clever" # at bottom
|
|
14
|
+
|
|
15
|
+
require 'hpricot'
|
|
16
|
+
require 'imw/files/text'
|
|
17
|
+
require 'imw/parsers/html_parser'
|
|
18
|
+
|
|
19
|
+
module IMW
|
|
20
|
+
module Files
|
|
21
|
+
|
|
22
|
+
module Sgml
|
|
23
|
+
|
|
24
|
+
attr_accessor :doc
|
|
25
|
+
|
|
26
|
+
def initialize uri, mode='r', options={}
|
|
27
|
+
super uri, mode, options
|
|
28
|
+
@doc = Hpricot(open(uri))
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Delegate to Hpricot
|
|
32
|
+
def method_missing method, *args, &block
|
|
33
|
+
@doc.send method, *args, &block
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Parse this file using the IMW HTMLParser. The parser can
|
|
37
|
+
# either be passed in directly or constructed from a passed hash
|
|
38
|
+
# of matchers.
|
|
39
|
+
def parse *args
|
|
40
|
+
parser = args.first.is_a?(IMW::HTMLParser) ? args.first : IMW::HTMLParser.new(*args)
|
|
41
|
+
parser.parse(self)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class Xml < IMW::Files::Text
|
|
47
|
+
include Sgml
|
|
48
|
+
def initialize uri, mode='r', options={}
|
|
49
|
+
super uri, mode, options
|
|
50
|
+
@doc = Hpricot.XML(open(uri))
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class Html < IMW::Files::Text
|
|
55
|
+
include Sgml
|
|
56
|
+
def initialize uri, mode='r', options={}
|
|
57
|
+
super uri, mode, options
|
|
58
|
+
@doc = Hpricot(open(uri))
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module IMW
|
|
2
|
+
module Files
|
|
3
|
+
|
|
4
|
+
# Used to process text files when no more specialized class is suitable.
|
|
5
|
+
#
|
|
6
|
+
# f = IMW::Files::Text.new '/path/to/my_file.dat'
|
|
7
|
+
# f.load do |line|
|
|
8
|
+
# # ...
|
|
9
|
+
# end
|
|
10
|
+
#
|
|
11
|
+
# Missing methods will be passed to the associated file handle
|
|
12
|
+
# (either IO or StringIO depending on whether the URI passed in
|
|
13
|
+
# was local or remote) so the usual stuff like read or each_line
|
|
14
|
+
# still works.
|
|
15
|
+
class Text
|
|
16
|
+
|
|
17
|
+
include IMW::Files::BasicFile
|
|
18
|
+
include IMW::Files::Compressible
|
|
19
|
+
|
|
20
|
+
attr_reader :file, :parser
|
|
21
|
+
|
|
22
|
+
def initialize uri, mode='r', options = {}
|
|
23
|
+
self.uri= uri
|
|
24
|
+
raise IMW::PathError.new("Cannot write to remote file #{uri}") if mode == 'w' && remote?
|
|
25
|
+
@file = open(uri, mode)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Return the contents of this text file as a string.
|
|
29
|
+
def load
|
|
30
|
+
file.read
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Return an array with each line of this file. If given a
|
|
34
|
+
# block, pass each line to the block.
|
|
35
|
+
def entries &block
|
|
36
|
+
if block_given?
|
|
37
|
+
file.each do |line|
|
|
38
|
+
yield line.chomp
|
|
39
|
+
end
|
|
40
|
+
else
|
|
41
|
+
file.map do |line|
|
|
42
|
+
line.chomp
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Dump +data+ to this file as a string. Close the file handle
|
|
48
|
+
# if passed in :close.
|
|
49
|
+
def dump data, options={}
|
|
50
|
+
file.write(data.inspect)
|
|
51
|
+
file.close if options[:close]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def method_missing method, *args
|
|
55
|
+
file.send method, *args
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def parse parser_spec, &block
|
|
59
|
+
lines = parser_spec.delete(:lines)
|
|
60
|
+
@parser = IMW::Parsers::RegexpParser.new(parser_spec)
|
|
61
|
+
parser.parse!(file, {:lines => lines}, &block)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# puts "#{File.basename(__FILE__)}: Don't forget to put a nametag on your Monkeywrench or one of the other chimps might steal it!" # at bottom
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#
|
|
2
|
+
# h2. lib/imw/files/yaml.rb -- describes yaml files
|
|
3
|
+
#
|
|
4
|
+
# == About
|
|
5
|
+
#
|
|
6
|
+
# A class for working with YAML files.
|
|
7
|
+
#
|
|
8
|
+
# Author:: (Philip flip Kromer, Dhruv Bansal) for Infinite Monkeywrench Project (mailto:coders@infochimps.org)
|
|
9
|
+
# Copyright:: Copyright (c) 2008 infochimps.org
|
|
10
|
+
# License:: GPL 3.0
|
|
11
|
+
# Website:: http://infinitemonkeywrench.org/
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
require 'yaml'
|
|
15
|
+
require 'imw/files/text'
|
|
16
|
+
|
|
17
|
+
module IMW
|
|
18
|
+
module Files
|
|
19
|
+
|
|
20
|
+
class Yaml < IMW::Files::Text
|
|
21
|
+
|
|
22
|
+
def initialize uri, mode='r', options = {}
|
|
23
|
+
super uri, mode
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Return the contents of this YAML file.
|
|
27
|
+
#
|
|
28
|
+
# FIXME what to do if a block is passed in?
|
|
29
|
+
def load &block
|
|
30
|
+
YAML.load_file @path
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Dump +data+ to this file as YAML.
|
|
34
|
+
def dump data
|
|
35
|
+
super data.to_yaml
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
FILE_REGEXPS << [/\.yaml$/, IMW::Files::Yaml]
|
|
41
|
+
FILE_REGEXPS << [/\.yml$/, IMW::Files::Yaml]
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# puts "#{File.basename(__FILE__)}: Yet another clever comment." # at bottobm
|