imw 0.2.18 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. data/Gemfile +7 -26
  2. data/Gemfile.lock +13 -38
  3. data/{LICENSE → LICENSE.txt} +1 -1
  4. data/README.textile +35 -0
  5. data/Rakefile +45 -22
  6. data/VERSION +1 -1
  7. data/examples/foo.rb +19 -0
  8. data/examples/html_selector.rb +22 -0
  9. data/examples/nes_game_list.csv +625 -0
  10. data/examples/nes_gamespot.csv +1371 -0
  11. data/examples/nes_nintendo.csv +624 -0
  12. data/examples/nes_unlicensed.csv +89 -0
  13. data/examples/nes_wikipedia.csv +710 -0
  14. data/examples/nibbler_test.rb +24 -0
  15. data/examples/script.rb +19 -0
  16. data/lib/imw.rb +28 -140
  17. data/lib/imw/error.rb +9 -0
  18. data/lib/imw/recordizer.rb +8 -0
  19. data/lib/imw/recordizer/html_selector_recordizer.rb +86 -0
  20. data/lib/imw/recordizer/string_slice_recordizer.rb +39 -0
  21. data/lib/imw/resource.rb +3 -119
  22. data/lib/imw/serializer.rb +7 -0
  23. data/lib/imw/serializer/json_serializer.rb +17 -0
  24. data/lib/imw/uri.rb +41 -0
  25. data/spec/resource_spec.rb +78 -0
  26. data/spec/uri_spec.rb +55 -0
  27. metadata +81 -232
  28. data/README.rdoc +0 -371
  29. data/bin/imw +0 -5
  30. data/bin/tsv_to_json.rb +0 -29
  31. data/etc/imwrc.rb +0 -26
  32. data/examples/dataset.rb +0 -12
  33. data/examples/metadata.yml +0 -10
  34. data/lib/imw/archives.rb +0 -120
  35. data/lib/imw/archives/rar.rb +0 -19
  36. data/lib/imw/archives/tar.rb +0 -19
  37. data/lib/imw/archives/tarbz2.rb +0 -73
  38. data/lib/imw/archives/targz.rb +0 -73
  39. data/lib/imw/archives/zip.rb +0 -51
  40. data/lib/imw/boot.rb +0 -87
  41. data/lib/imw/compressed_files.rb +0 -94
  42. data/lib/imw/compressed_files/bz2.rb +0 -16
  43. data/lib/imw/compressed_files/compressible.rb +0 -75
  44. data/lib/imw/compressed_files/gz.rb +0 -16
  45. data/lib/imw/dataset.rb +0 -125
  46. data/lib/imw/dataset/paths.rb +0 -29
  47. data/lib/imw/dataset/workflow.rb +0 -195
  48. data/lib/imw/formats.rb +0 -33
  49. data/lib/imw/formats/delimited.rb +0 -170
  50. data/lib/imw/formats/excel.rb +0 -100
  51. data/lib/imw/formats/json.rb +0 -41
  52. data/lib/imw/formats/pdf.rb +0 -71
  53. data/lib/imw/formats/sgml.rb +0 -69
  54. data/lib/imw/formats/yaml.rb +0 -41
  55. data/lib/imw/metadata.rb +0 -83
  56. data/lib/imw/metadata/contains_metadata.rb +0 -54
  57. data/lib/imw/metadata/dsl.rb +0 -111
  58. data/lib/imw/metadata/field.rb +0 -37
  59. data/lib/imw/metadata/has_metadata.rb +0 -98
  60. data/lib/imw/metadata/has_summary.rb +0 -57
  61. data/lib/imw/metadata/schema.rb +0 -17
  62. data/lib/imw/parsers.rb +0 -8
  63. data/lib/imw/parsers/flat.rb +0 -44
  64. data/lib/imw/parsers/html_parser.rb +0 -387
  65. data/lib/imw/parsers/html_parser/matchers.rb +0 -289
  66. data/lib/imw/parsers/line_parser.rb +0 -87
  67. data/lib/imw/parsers/regexp_parser.rb +0 -72
  68. data/lib/imw/repository.rb +0 -12
  69. data/lib/imw/runner.rb +0 -118
  70. data/lib/imw/schemes.rb +0 -23
  71. data/lib/imw/schemes/ftp.rb +0 -142
  72. data/lib/imw/schemes/hdfs.rb +0 -251
  73. data/lib/imw/schemes/http.rb +0 -165
  74. data/lib/imw/schemes/local.rb +0 -409
  75. data/lib/imw/schemes/remote.rb +0 -119
  76. data/lib/imw/schemes/s3.rb +0 -143
  77. data/lib/imw/schemes/sql.rb +0 -129
  78. data/lib/imw/tools.rb +0 -12
  79. data/lib/imw/tools/aggregator.rb +0 -148
  80. data/lib/imw/tools/archiver.rb +0 -220
  81. data/lib/imw/tools/downloader.rb +0 -63
  82. data/lib/imw/tools/extension_analyzer.rb +0 -114
  83. data/lib/imw/tools/summarizer.rb +0 -83
  84. data/lib/imw/tools/transferer.rb +0 -167
  85. data/lib/imw/utils.rb +0 -74
  86. data/lib/imw/utils/dynamically_extendable.rb +0 -137
  87. data/lib/imw/utils/error.rb +0 -59
  88. data/lib/imw/utils/extensions/hpricot.rb +0 -34
  89. data/lib/imw/utils/has_uri.rb +0 -131
  90. data/lib/imw/utils/log.rb +0 -92
  91. data/lib/imw/utils/misc.rb +0 -57
  92. data/lib/imw/utils/paths.rb +0 -146
  93. data/lib/imw/utils/uri.rb +0 -59
  94. data/lib/imw/utils/uuid.rb +0 -33
  95. data/lib/imw/utils/validate.rb +0 -38
  96. data/lib/imw/utils/version.rb +0 -11
  97. data/spec/data/formats/delimited/sample.csv +0 -131
  98. data/spec/data/formats/delimited/sample.tsv +0 -131
  99. data/spec/data/formats/delimited/with_schema/ace-hardware-locations.tsv +0 -11
  100. data/spec/data/formats/delimited/with_schema/all-countries-ip-address-to-geolocation-data.tsv +0 -16
  101. data/spec/data/formats/delimited/with_schema/complete-list-of-starbucks-locations.tsv +0 -11
  102. data/spec/data/formats/delimited/with_schema/myspace-user-activity-stream-cumulative-word-count-from-from-dec.tsv +0 -22
  103. data/spec/data/formats/delimited/with_schema/myspace-user-activity-stream-myspace-application-adds-by-zip-cod.tsv +0 -22
  104. data/spec/data/formats/delimited/with_schema/myspace-user-activity-stream-myspace-application-counts.tsv +0 -12
  105. data/spec/data/formats/delimited/with_schema/myspace-user-activity-stream-user-count-by-latlong.tsv +0 -13
  106. data/spec/data/formats/delimited/with_schema/myspace-user-activity-stream-user-count-by-zip-code.tsv +0 -22
  107. data/spec/data/formats/delimited/with_schema/myspace-user-activity-stream-word-count-by-day-from-december-200.tsv +0 -22
  108. data/spec/data/formats/delimited/without_schema/ace-hardware-locations.tsv +0 -10
  109. data/spec/data/formats/delimited/without_schema/all-countries-ip-address-to-geolocation-data.tsv +0 -15
  110. data/spec/data/formats/delimited/without_schema/complete-list-of-starbucks-locations.tsv +0 -10
  111. data/spec/data/formats/delimited/without_schema/myspace-user-activity-stream-cumulative-word-count-from-from-dec.tsv +0 -21
  112. data/spec/data/formats/delimited/without_schema/myspace-user-activity-stream-myspace-application-adds-by-zip-cod.tsv +0 -21
  113. data/spec/data/formats/delimited/without_schema/myspace-user-activity-stream-myspace-application-counts.tsv +0 -11
  114. data/spec/data/formats/delimited/without_schema/myspace-user-activity-stream-user-count-by-latlong.tsv +0 -12
  115. data/spec/data/formats/delimited/without_schema/myspace-user-activity-stream-user-count-by-zip-code.tsv +0 -21
  116. data/spec/data/formats/delimited/without_schema/myspace-user-activity-stream-word-count-by-day-from-december-200.tsv +0 -21
  117. data/spec/data/formats/excel/sample.xls +0 -0
  118. data/spec/data/formats/json/sample.json +0 -1
  119. data/spec/data/formats/none/sample +0 -650
  120. data/spec/data/formats/sgml/sample.xml +0 -617
  121. data/spec/data/formats/text/sample.txt +0 -650
  122. data/spec/data/formats/yaml/sample.yaml +0 -410
  123. data/spec/data/schema-tabular.yaml +0 -11
  124. data/spec/imw/archives/rar_spec.rb +0 -16
  125. data/spec/imw/archives/tar_spec.rb +0 -16
  126. data/spec/imw/archives/tarbz2_spec.rb +0 -24
  127. data/spec/imw/archives/targz_spec.rb +0 -21
  128. data/spec/imw/archives/zip_spec.rb +0 -16
  129. data/spec/imw/archives_spec.rb +0 -77
  130. data/spec/imw/compressed_files/bz2_spec.rb +0 -15
  131. data/spec/imw/compressed_files/compressible_spec.rb +0 -36
  132. data/spec/imw/compressed_files/gz_spec.rb +0 -15
  133. data/spec/imw/compressed_files_spec.rb +0 -47
  134. data/spec/imw/dataset/paths_spec.rb +0 -32
  135. data/spec/imw/dataset/workflow_spec.rb +0 -41
  136. data/spec/imw/formats/delimited_spec.rb +0 -44
  137. data/spec/imw/formats/excel_spec.rb +0 -55
  138. data/spec/imw/formats/json_spec.rb +0 -18
  139. data/spec/imw/formats/sgml_spec.rb +0 -24
  140. data/spec/imw/formats/yaml_spec.rb +0 -19
  141. data/spec/imw/metadata/contains_metadata_spec.rb +0 -56
  142. data/spec/imw/metadata/field_spec.rb +0 -25
  143. data/spec/imw/metadata/has_metadata_spec.rb +0 -58
  144. data/spec/imw/metadata/has_summary_spec.rb +0 -32
  145. data/spec/imw/metadata/schema_spec.rb +0 -24
  146. data/spec/imw/metadata_spec.rb +0 -86
  147. data/spec/imw/parsers/line_parser_spec.rb +0 -96
  148. data/spec/imw/parsers/regexp_parser_spec.rb +0 -42
  149. data/spec/imw/resource_spec.rb +0 -32
  150. data/spec/imw/schemes/hdfs_spec.rb +0 -67
  151. data/spec/imw/schemes/http_spec.rb +0 -19
  152. data/spec/imw/schemes/local_spec.rb +0 -165
  153. data/spec/imw/schemes/remote_spec.rb +0 -38
  154. data/spec/imw/schemes/s3_spec.rb +0 -31
  155. data/spec/imw/schemes/sql_spec.rb +0 -3
  156. data/spec/imw/tools/aggregator_spec.rb +0 -71
  157. data/spec/imw/tools/archiver_spec.rb +0 -120
  158. data/spec/imw/tools/extension_analyzer_spec.rb +0 -153
  159. data/spec/imw/tools/summarizer_spec.rb +0 -8
  160. data/spec/imw/tools/transferer_spec.rb +0 -195
  161. data/spec/imw/utils/dynamically_extendable_spec.rb +0 -69
  162. data/spec/imw/utils/has_uri_spec.rb +0 -61
  163. data/spec/imw/utils/paths_spec.rb +0 -10
  164. data/spec/imw/utils/shared_paths_spec.rb +0 -29
  165. data/spec/imw_spec.rb +0 -14
  166. data/spec/rcov.opts +0 -1
  167. data/spec/spec_helper.rb +0 -31
  168. data/spec/support/custom_matchers.rb +0 -28
  169. data/spec/support/file_contents_matcher.rb +0 -30
  170. data/spec/support/paths_matcher.rb +0 -66
  171. data/spec/support/random.rb +0 -213
  172. data/spec/support/without_regard_to_order_matcher.rb +0 -41
@@ -1,131 +0,0 @@
1
- require 'addressable/uri'
2
-
3
- module IMW
4
- module Utils
5
-
6
- # Endows an including class with a wrapper for Addressable::URI
7
- module HasURI
8
-
9
- # The URI of this object.
10
- attr_reader :uri
11
-
12
- # Set the URI of this resource by parsing the given +uri+ (if
13
- # necessary).
14
- #
15
- # @param [String, Addressable::URI] uri the uri to parse
16
- def uri= uri
17
- if uri.is_a?(Addressable::URI)
18
- @uri = uri
19
- else
20
- begin
21
- @uri = Addressable::URI.parse(uri.to_s)
22
- rescue URI::InvalidURIError
23
- @uri = Addressable::URI.parse(URI.encode(uri.to_s))
24
- @encoded_uri = true
25
- end
26
- end
27
- end
28
-
29
- # The scheme of this resource. Will be +nil+ for local resources.
30
- #
31
- # @return [String]
32
- def scheme
33
- @scheme ||= uri.scheme
34
- end
35
-
36
- # The directory name of this resource's path.
37
- #
38
- # @return [String]
39
- def dirname
40
- @dirname ||= File.dirname(path)
41
- end
42
-
43
- # The basename of this resource's path.
44
- #
45
- # @return [String]
46
- def basename
47
- @basename ||= File.basename(path)
48
- end
49
-
50
- # Returns the extension (INCLUDING the '.') of this resource's
51
- # path. Redefine this in an including class for which this is
52
- # weird ('.tar.gz' I'm talking to you...)
53
- #
54
- # @return [String]
55
- def extname
56
- @extname ||= File.extname(path)
57
- end
58
-
59
- # Returns the extension (WITHOUT the '.') of this resource's path.
60
- #
61
- # @return [String]
62
- def extension
63
- @extension ||= extname[1..-1] || ''
64
- end
65
-
66
- # Returns the basename of the file with its extension removed
67
- #
68
- # IMW.open('/path/to/some_file.tar.gz').name # => some_file
69
- #
70
- # @return [String]
71
- def name
72
- @name ||= extname ? basename[0,basename.length - extname.length] : basename
73
- end
74
-
75
- # Returns the user associated with the host of this URI.
76
- #
77
- # @return [String]
78
- def user
79
- @user ||= uri.user
80
- end
81
-
82
- # Returns the password associated with access to this URI.
83
- #
84
- # @return [String]
85
- def password
86
- @password ||= uri.password
87
- end
88
-
89
- # Return the fragment part of this resource's URI.
90
- #
91
- # Will likely be +nil+ for local resources.
92
- #
93
- # @return [String]
94
- def fragment
95
- @fragment ||= uri.fragment
96
- end
97
-
98
- # Return the URI of this resource with any query strings and
99
- # fragments removed.
100
- #
101
- # @return [URI::Generic]
102
- def stripped_uri
103
- uri_args = {}.tap do |args|
104
- %w[scheme userinfo host port path].each do |method|
105
- args[method.to_sym] = respond_to?(method) ? send(method) : uri.send(method)
106
- end
107
- end
108
- uri.class.new(uri_args)
109
- end
110
-
111
- # Return the path complete with query string and fragment.
112
- #
113
- # @return [String]
114
- def raw_path
115
- p = uri.path
116
- p += "?#{uri.query}" unless uri.query.nil?
117
- p += "##{uri.fragment}" unless uri.fragment.nil?
118
- p
119
- end
120
-
121
- def to_s
122
- uri.to_s
123
- end
124
- end
125
- end
126
- end
127
-
128
-
129
-
130
-
131
-
@@ -1,92 +0,0 @@
1
- require 'logger'
2
-
3
- module IMW
4
-
5
- # Default log file.
6
- LOG_FILE_DESTINATION = STDERR unless defined?(LOG_FILE_DESTINATION)
7
-
8
- # Default log file time format
9
- LOG_TIMEFORMAT = "%Y-%m-%d %H:%M:%S " unless defined?(LOG_TIMEFORMAT)
10
-
11
- # Default verbosity
12
- VERBOSE = false unless defined?(VERBOSE)
13
-
14
- class << self; attr_accessor :log, :verbose end
15
-
16
- # Is IMW operating in verbose mode?
17
- #
18
- # Calls to <tt>IMW.warn_if_verbose</tt> and friends utilize this
19
- # method. Verbosity is controlled on the command line (see
20
- # IMW::Runner) or by setting IMW::VERBOSE in your configuration
21
- # file.
22
- #
23
- # @return [nil, false, true]
24
- def self.verbose?
25
- VERBOSE || verbose
26
- end
27
-
28
- # Create a Logger and point it at IMW::LOG_FILE_DESTINATION which is
29
- # set in ~/.imwrc and defaults to STDERR.
30
- def self.instantiate_logger!
31
- IMW.log ||= Logger.new(LOG_FILE_DESTINATION)
32
- IMW.log.datetime_format = "%Y%m%d-%H:%M:%S "
33
- IMW.log.level = Logger::INFO
34
- end
35
-
36
- def self.announce *events
37
- options = events.flatten.extract_options!
38
- options.reverse_merge! :level => Logger::INFO
39
- IMW.log.add options[:level], "IMW: " + events.join("\n")
40
- end
41
- def self.announce_if_verbose *events
42
- announce(*events) if IMW.verbose?
43
- end
44
-
45
- def self.banner *events
46
- options = events.flatten.extract_options!
47
- options.reverse_merge! :level => Logger::INFO
48
- announce(["*"*75, events, "*"*75], options)
49
- end
50
-
51
- def self.warn *events
52
- options = events.flatten.extract_options!
53
- options.reverse_merge! :level => Logger::WARN
54
- announce events, options
55
- end
56
- def self.warn_if_verbose *events
57
- warn(*events) if IMW.verbose?
58
- end
59
-
60
- PROGRESS_TRACKERS = {}
61
- #
62
- # When the slowly-changing tracked variable +var+ changes value,
63
- # announce its new value. Always announces on first call.
64
- #
65
- # Ex:
66
- # track_progress :indexing_names, name[0..0] # announce at each initial letter
67
- # track_progress :files, (i % 1000) # announce at each 1,000 iterations
68
- #
69
- def track_progress tracker, val
70
- unless (IMW::PROGRESS_TRACKERS.include?(tracker)) &&
71
- (IMW::PROGRESS_TRACKERS[tracker] == val)
72
- announce "#{tracker.to_s.gsub(/_/,' ')}: #{val}"
73
- IMW::PROGRESS_TRACKERS[tracker] = val
74
- end
75
- end
76
-
77
- PROGRESS_COUNTERS = {}
78
- #
79
- # Log repetitions in a given context
80
- #
81
- # At every n'th (default 1000) call,
82
- # announce progress in the IMW.log
83
- #
84
- def track_count tracker, every=1000
85
- PROGRESS_COUNTERS[tracker] ||= 0
86
- PROGRESS_COUNTERS[tracker] += 1
87
- chunk = every * (PROGRESS_COUNTERS[tracker]/every).to_i
88
- track_progress "count_of_#{tracker}", chunk
89
- end
90
- end
91
-
92
- IMW.instantiate_logger!
@@ -1,57 +0,0 @@
1
- module IMW
2
-
3
- # A simple counter. The +value+ and +add+ methods read and
4
- # increment the counter's value.
5
- #
6
- # counter = IMW::Counter.new
7
- # counter.value #=> 0
8
- # counter.add 1
9
- # counter.value #=> 1
10
- #
11
- # The +next!+ method acts as like C's <tt>value++</tt>, incrementing
12
- # +value+ _after_ it is referenced.
13
- #
14
- # counter = IMW::Counter.new
15
- # counter.value #=> 0
16
- # counter.next! #=> 0
17
- # counter.value #=> 1
18
- #
19
- # Counters can also be reset
20
- #
21
- # counter.reset!
22
- # counter.value #=> 0
23
- class Counter
24
-
25
- attr_accessor :value, :starting_value, :increment
26
-
27
- # Return a new Counter. The first argument is the starting value
28
- # (defaults to 0) and the second is the increment (defaults to 1).
29
- def initialize starting_value=0,increment=1
30
- @starting_value = starting_value
31
- @value = starting_value
32
- @increment = increment
33
- end
34
-
35
- # Add +amount+ (defaults to the value of <tt>@increment</tt>).
36
- def add amount=nil
37
- @value += amount || @increment
38
- end
39
- alias_method :add!, :add
40
-
41
- # Increment the counter by <tt>@increment</tt> but return its
42
- # value _before_ being incremented.
43
- def next!
44
- old_value = @value
45
- @value += @increment
46
- old_value
47
- end
48
-
49
- # Reset the counter to +value+ (defaults to the value of
50
- # <tt>@starting_value</tt>).
51
- def reset! value=nil
52
- @value = value || @starting_value
53
- end
54
- end
55
- end
56
-
57
- # puts "#{File.basename(__FILE__)}: Your Monkeywrench seems suddenly more utilisable." # at bottom
@@ -1,146 +0,0 @@
1
- require 'pathname'
2
-
3
- module IMW
4
-
5
- # Implements methods designed to work with an object's
6
- # <tt>@paths</tt> attributes, adding and deleting symbolic
7
- # references to paths and expanding calls to +path_to+ from that
8
- # attribute or (when a miss) from <tt>IMW::PATHS</tt>.
9
- #
10
- # An including class should therefore define an array attribute
11
- # <tt>@paths</tt>.
12
- module Paths
13
-
14
- # Expands a shorthand workflow path specification to an actual
15
- # file path. Strings are interpreted literally but symbols are
16
- # first resolved to the paths they represent.
17
- #
18
- # add_path :foo, '~/whoa'
19
- # path_to :foo, 'my_thing'
20
- # => '~/whoa/my_thing'
21
- #
22
- # @param [String, Symbol] pathsegs the path segments to join
23
- # @return [String] the resulting expanded path
24
- def path_to *pathsegs
25
- path = Pathname.new path_to_helper(*pathsegs)
26
- path.absolute? ? File.expand_path(path) : path.to_s
27
- end
28
-
29
- # Return the presently defined paths for this object.
30
- #
31
- # @return [Hash]
32
- def paths
33
- @paths ||= {}
34
- end
35
-
36
- # Adds a symbolic path for expansion by +path_to+.
37
- #
38
- # add_path :foo, '~/whoa'
39
- # add_path :bar, :foo, 'baz'
40
- # path_to :bar
41
- # => '~/whoa/baz'
42
- #
43
- # @param [Symbol] sym the name of the path to store
44
- # @param [Symbol, String] pathsegs the path segments to use to define the path to the name
45
- # @return [String] the resulting path
46
- def add_path sym, *pathsegs
47
- paths[sym] = pathsegs.flatten
48
- path_to(sym)
49
- end
50
-
51
- # Removes a symbolic path for expansion by +path_to+.
52
- #
53
- # @param [Symbol] sym the stored path symbol to remove
54
- def remove_path sym
55
- paths.delete sym if paths.include? sym
56
- end
57
-
58
- private
59
- def path_to_helper *pathsegs # :nodoc:
60
- # +path_to_helper+ handles the recursive calls for +path_to+.
61
- expanded = pathsegs.flatten.compact.map do |pathseg|
62
- case
63
- when pathseg.is_a?(Symbol) && paths.include?(pathseg) then path_to(paths[pathseg])
64
- when pathseg.is_a?(Symbol) && IMW::PATHS.include?(pathseg) then path_to(IMW::PATHS[pathseg])
65
- when pathseg.is_a?(Symbol) then raise IMW::PathError.new("No path expansion set for #{pathseg.inspect}")
66
- else pathseg
67
- end
68
- end
69
- File.join(*expanded)
70
- end
71
- end
72
-
73
-
74
- # Default paths for the IMW. Chosen to make sense on most *NIX
75
- # distributions.
76
- DEFAULT_PATHS = {
77
- :home => ENV['HOME'],
78
- :data_root => "/var/lib/imw",
79
- :log_root => "/var/log/imw",
80
- :scripts_root => "/usr/share/imw",
81
- :tmp_root => "/tmp/imw",
82
-
83
- # the imw library
84
- :imw_root => File.expand_path(File.dirname(__FILE__) + "/../../.."),
85
- :imw_bin => [:imw_root, 'bin'],
86
- :imw_etc => [:imw_root, 'etc'],
87
- :imw_lib => [:imw_root, 'lib'],
88
-
89
- # workflow
90
- :ripd_root => [:data_root, 'ripd'],
91
- :rawd_root => [:data_root, 'rawd'],
92
- :fixd_root => [:data_root, 'fixd'],
93
- :pkgd_root => [:data_root, 'pkgd']
94
- }
95
- defined?(PATHS) ? PATHS.reverse_merge!(DEFAULT_PATHS) : PATHS = DEFAULT_PATHS
96
-
97
- # Expands a shorthand workflow path specification to an actual
98
- # file path. Strings are interpreted literally but symbols are
99
- # first resolved to the paths they represent.
100
- #
101
- # IMW.add_path :foo, '~/whoa'
102
- # IMW.path_to :foo, 'my_thing'
103
- # => '~/whoa/my_thing'
104
- #
105
- # @param [String, Symbol] pathsegs the path segments to join
106
- # @return [String] the resulting expanded path
107
- def self.path_to *pathsegs
108
- path = Pathname.new IMW.path_to_helper(*pathsegs)
109
- path.absolute? ? File.expand_path(path) : path.to_s
110
- end
111
-
112
- # Adds a symbolic path for expansion by +path_to+.
113
- #
114
- # IMW.add_path :foo, '~/whoa'
115
- # IMW.add_path :bar, :foo, 'baz'
116
- # IMW.path_to :bar
117
- # => '~/whoa/baz'
118
- #
119
- # @param [Symbol] sym the name of the path to store
120
- # @param [Symbol, String] pathsegs the path segments to use to define the path to the name
121
- # @return [String] the resulting path
122
- def self.add_path sym, *pathsegs
123
- IMW::PATHS[sym] = pathsegs.flatten
124
- path_to[sym]
125
- end
126
-
127
- # Removes a symbolic path for expansion by +path_to+.
128
- #
129
- # @param [Symbol] sym the stored path symbol to remove
130
- def self.remove_path sym
131
- IMW::PATHS.delete sym if IMW::PATHS.include? sym
132
- end
133
-
134
- protected
135
- def self.path_to_helper *pathsegs # :nodoc:
136
- # +path_to_helper+ handles the recursive calls for +path_to+.
137
- expanded = pathsegs.flatten.compact.map do |pathseg|
138
- case
139
- when pathseg.is_a?(Symbol) && IMW::PATHS.include?(pathseg) then path_to(IMW::PATHS[pathseg])
140
- when pathseg.is_a?(Symbol) then raise IMW::PathError.new("No path expansion set for #{pathseg.inspect}")
141
- else pathseg
142
- end
143
- end
144
- File.join(*expanded)
145
- end
146
- end
@@ -1,59 +0,0 @@
1
- require 'imw/utils'
2
- require 'imw/utils/uuid'
3
- require 'addressable/uri'
4
- module Addressable
5
- #
6
- # Add the #scrubbed and #revhost calls
7
- #
8
- class URI
9
- SAFE_CHARS = %r{a-zA-Z0-9\-\._!\(\)\*\'}
10
- PATH_CHARS = %r{#{SAFE_CHARS}\$&\+,:=@\/;}
11
- RESERVED_CHARS = %r{\$&\+,:=@\/;\?\%}
12
- UNSAFE_CHARS = %r{\\ \"\#<>\[\]\^\`\|\~\{\}}
13
- HOST_HEAD = '(?:[a-z0-9\-]+\.)+'
14
- HOST_TLD = '(?:[a-z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|jobs|museum)'
15
-
16
- def host_valid?
17
- !!(host =~ %r{\A#{HOST_HEAD}#{HOST_TLD}\z}i)
18
- end
19
- def path_valid?
20
- !!(path =~ %r{\A[#{PATH_CHARS}%]*\z})
21
- end
22
- def simple_connection_part?
23
- ( ['http', nil].include?(scheme) &&
24
- [80, nil].include?(port) &&
25
- (self.to_hash.values_at(:password, :user).join.blank?) )
26
- end
27
-
28
- #
29
- # Does this look like a
30
- #
31
- def simple?
32
- host_valid? && path_valid? && simple_connection_part?
33
- end
34
-
35
- #
36
- # +revhost+
37
- # the dot-reversed host:
38
- # foo.company.com => com.company.foo
39
- #
40
- def revhost
41
- return host unless host =~ /\./
42
- host.split('.').reverse.join('.')
43
- end
44
- #
45
- # +uuid+ -- RFC-4122 ver.5 uuid; guaranteed to be universally unique
46
- #
47
- # See
48
- # http://www.faqs.org/rfcs/rfc4122.html
49
- #
50
- def url_uuid
51
- UUID.sha1_create(UUID_URL_NAMESPACE, self.normalize.to_s)
52
- end
53
- end
54
- end
55
-
56
- class << Addressable::URI
57
- alias_method :encode_segment, :encode_component if ! defined?(encode_segment)
58
- alias_method :unencode_segment, :unencode_component if ! defined?(unencode_segment)
59
- end