right_scraper 3.2.6 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +7 -0
  2. data/lib/right_scraper.rb +16 -34
  3. data/lib/right_scraper/builders.rb +32 -0
  4. data/lib/right_scraper/builders/base.rb +19 -20
  5. data/lib/right_scraper/builders/filesystem.rb +8 -6
  6. data/lib/right_scraper/builders/union.rb +4 -1
  7. data/lib/right_scraper/loggers.rb +31 -0
  8. data/lib/right_scraper/loggers/base.rb +113 -0
  9. data/lib/right_scraper/loggers/default.rb +98 -0
  10. data/lib/right_scraper/{scraper.rb → main.rb} +53 -9
  11. data/lib/right_scraper/processes.rb +33 -0
  12. data/lib/right_scraper/processes/shell.rb +227 -0
  13. data/lib/right_scraper/processes/{ssh.rb → ssh_agent.rb} +4 -0
  14. data/lib/right_scraper/processes/svn_client.rb +117 -0
  15. data/lib/right_scraper/processes/warden.rb +358 -0
  16. data/lib/right_scraper/registered_base.rb +154 -0
  17. data/lib/right_scraper/repositories.rb +33 -0
  18. data/lib/right_scraper/repositories/base.rb +271 -232
  19. data/lib/right_scraper/repositories/download.rb +8 -6
  20. data/lib/right_scraper/repositories/git.rb +8 -9
  21. data/lib/right_scraper/repositories/svn.rb +8 -8
  22. data/lib/right_scraper/resources.rb +32 -0
  23. data/lib/right_scraper/resources/base.rb +5 -1
  24. data/lib/right_scraper/resources/cookbook.rb +34 -27
  25. data/lib/right_scraper/resources/workflow.rb +27 -28
  26. data/lib/right_scraper/retrievers.rb +34 -0
  27. data/lib/right_scraper/retrievers/base.rb +80 -84
  28. data/lib/right_scraper/retrievers/checkout_base.rb +178 -0
  29. data/lib/right_scraper/retrievers/download.rb +125 -117
  30. data/lib/right_scraper/retrievers/git.rb +377 -223
  31. data/lib/right_scraper/retrievers/svn.rb +102 -62
  32. data/lib/right_scraper/scanners.rb +37 -0
  33. data/lib/right_scraper/scanners/base.rb +77 -80
  34. data/lib/right_scraper/scanners/cookbook_manifest.rb +31 -30
  35. data/lib/right_scraper/scanners/cookbook_metadata.rb +380 -35
  36. data/lib/right_scraper/scanners/cookbook_s3_upload.rb +56 -53
  37. data/lib/right_scraper/scanners/union.rb +61 -58
  38. data/lib/right_scraper/scanners/workflow_manifest.rb +55 -54
  39. data/lib/right_scraper/scanners/workflow_metadata.rb +41 -39
  40. data/lib/right_scraper/scanners/workflow_s3_upload.rb +59 -55
  41. data/lib/right_scraper/scrapers.rb +32 -0
  42. data/lib/right_scraper/scrapers/base.rb +217 -205
  43. data/lib/right_scraper/scrapers/cookbook.rb +42 -40
  44. data/lib/right_scraper/scrapers/workflow.rb +57 -58
  45. data/lib/right_scraper/version.rb +3 -0
  46. data/right_scraper.gemspec +12 -16
  47. metadata +57 -163
  48. data/Gemfile +0 -15
  49. data/Rakefile +0 -89
  50. data/lib/right_scraper/logger.rb +0 -107
  51. data/lib/right_scraper/loggers/noisy.rb +0 -85
  52. data/lib/right_scraper/repositories/mock.rb +0 -70
  53. data/lib/right_scraper/retrievers/checkout.rb +0 -79
  54. data/lib/right_scraper/scraper_logger.rb +0 -66
  55. data/lib/right_scraper/svn_client.rb +0 -164
  56. data/right_scraper.rconf +0 -13
  57. data/spec/builder_spec.rb +0 -50
  58. data/spec/cookbook_helper.rb +0 -73
  59. data/spec/cookbook_manifest_spec.rb +0 -93
  60. data/spec/cookbook_s3_upload_spec.rb +0 -159
  61. data/spec/download/download_retriever_spec.rb +0 -118
  62. data/spec/download/download_retriever_spec_helper.rb +0 -72
  63. data/spec/download/download_spec.rb +0 -128
  64. data/spec/download/multi_dir_spec.rb +0 -106
  65. data/spec/download/multi_dir_spec_helper.rb +0 -40
  66. data/spec/git/cookbook_spec.rb +0 -165
  67. data/spec/git/demokey +0 -27
  68. data/spec/git/demokey.pub +0 -1
  69. data/spec/git/password_key +0 -30
  70. data/spec/git/password_key.pub +0 -1
  71. data/spec/git/repository_spec.rb +0 -110
  72. data/spec/git/retriever_spec.rb +0 -553
  73. data/spec/git/retriever_spec_helper.rb +0 -112
  74. data/spec/git/scraper_spec.rb +0 -151
  75. data/spec/git/ssh_spec.rb +0 -174
  76. data/spec/git/url_spec.rb +0 -103
  77. data/spec/logger_spec.rb +0 -185
  78. data/spec/repository_spec.rb +0 -111
  79. data/spec/retriever_spec_helper.rb +0 -146
  80. data/spec/scanner_spec.rb +0 -61
  81. data/spec/scraper_helper.rb +0 -88
  82. data/spec/scraper_spec.rb +0 -147
  83. data/spec/spec_helper.rb +0 -185
  84. data/spec/svn/cookbook_spec.rb +0 -96
  85. data/spec/svn/multi_svn_spec.rb +0 -64
  86. data/spec/svn/multi_svn_spec_helper.rb +0 -40
  87. data/spec/svn/repository_spec.rb +0 -72
  88. data/spec/svn/retriever_spec.rb +0 -266
  89. data/spec/svn/scraper_spec.rb +0 -90
  90. data/spec/svn/svn_retriever_spec_helper.rb +0 -90
  91. data/spec/svn/url_spec.rb +0 -47
  92. data/spec/url_spec.rb +0 -164
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ac45d2b026fadbb61775b0b93c9739b163ff8fcb
4
+ data.tar.gz: 14b1d686bdb7ca42b6026e4b40352e65990dac3b
5
+ SHA512:
6
+ metadata.gz: 45e307c5376f9fe07522f44540a49016ff1166747327b87f6b3a807408a42135a29250b560b6add6dfbfbfa4421dce95fd2dfad3a784b9e85609377cc294e455
7
+ data.tar.gz: 60f022f6c81364948e14d49066b988266db2a23c97ead1fc8c3dc8a3bcd993086decfda1430c506bc0961e60661e569fff33304a139aa4b8505a064a21a73958
data/lib/right_scraper.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright: Copyright (c) 2010-2011 RightScale, Inc.
2
+ # Copyright: Copyright (c) 2010-2013 RightScale, Inc.
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining
5
5
  # a copy of this software and associated documentation files (the
@@ -21,36 +21,18 @@
21
21
  # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- # Explicitly list required files to make IDEs happy
25
- require 'fileutils'
26
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'builders', 'base'))
27
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'builders', 'filesystem'))
28
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'builders', 'union'))
29
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'logger'))
30
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'processes', 'ssh'))
31
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'repositories', 'base'))
32
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'repositories', 'download'))
33
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'repositories', 'git'))
34
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'repositories', 'svn'))
35
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'resources', 'base'))
36
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'resources', 'cookbook'))
37
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'resources', 'workflow'))
38
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'retrievers', 'base'))
39
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'retrievers', 'checkout'))
40
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'retrievers', 'download'))
41
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'retrievers', 'git'))
42
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'retrievers', 'svn'))
43
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scanners', 'base'))
44
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scanners', 'cookbook_manifest'))
45
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scanners', 'cookbook_metadata'))
46
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scanners', 'cookbook_s3_upload'))
47
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scanners', 'union'))
48
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scanners', 'workflow_manifest'))
49
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scanners', 'workflow_metadata'))
50
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scraper'))
51
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scraper_logger'))
52
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scrapers', 'base'))
53
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scrapers', 'cookbook'))
54
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'scrapers', 'workflow'))
55
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'svn_client'))
56
- require File.expand_path(File.join(File.dirname(__FILE__), 'right_scraper', 'version'))
24
+ require 'right_scraper/version'
25
+
26
+ # Autoload everything possible
27
+ module RightScraper
28
+ autoload :Builders, 'right_scraper/builders'
29
+ autoload :Loggers, 'right_scraper/loggers'
30
+ autoload :Main, 'right_scraper/main'
31
+ autoload :Processes, 'right_scraper/processes'
32
+ autoload :RegisteredBase, 'right_scraper/registered_base'
33
+ autoload :Repositories, 'right_scraper/repositories'
34
+ autoload :Resources, 'right_scraper/resources'
35
+ autoload :Retrievers, 'right_scraper/retrievers'
36
+ autoload :Scanners, 'right_scraper/scanners'
37
+ autoload :Scrapers, 'right_scraper/scrapers'
38
+ end
@@ -0,0 +1,32 @@
1
+ #
2
+ # Copyright (c) 2013 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ # ancestor
24
+ require 'right_scraper'
25
+
26
+ module RightScraper
27
+ module Builders
28
+ autoload :Base, 'right_scraper/builders/base'
29
+ autoload :Filesystem, 'right_scraper/builders/filesystem'
30
+ autoload :Union, 'right_scraper/builders/union'
31
+ end
32
+ end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright: Copyright (c) 2010-2011 RightScale, Inc.
2
+ # Copyright: Copyright (c) 2010-2013 RightScale, Inc.
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining
5
5
  # a copy of this software and associated documentation files (the
@@ -21,43 +21,42 @@
21
21
  # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'logger'))
24
+ # ancestor
25
+ require 'right_scraper/builders'
25
26
 
26
27
  module RightScraper
27
28
  module Builders
29
+
28
30
  # Base class for building additional metadata from filesystem
29
- # based checkouts. Subclasses should override #go, and possibly
31
+ # based checkouts. Subclasses should override #go, and possibly
30
32
  # #new if they require additional arguments.
31
33
  #
32
34
  # The lifecycle for a builder is as follows:
33
35
  # - builder = Builder.new (once)
34
36
  # - builder.go(dir, resource) (many times)
35
37
  # - builder.finish (once)
36
- class Builder
37
- # Create a new Builder. Recognizes options as given. Some
38
- # options may be required, others optional. This class recognizes
39
- # only :logger.
40
- #
41
- # === Options
42
- # <tt>:logger</tt>:: Optional. Logger currently being used
43
- #
44
- # === Parameters
45
- # options(Hash):: builder options
46
- def initialize(options={})
47
- @logger = options.fetch(:logger, Logger.new)
38
+ class Base
39
+ # @param [Hash] options for builder
40
+ # @option options [Logger] :logger for builder
41
+ def initialize(options = {})
42
+ @logger = options[:logger] || ::RightScraper::Loggers::Default.new
48
43
  end
49
44
 
50
45
  # Run builder for this resource.
51
46
  #
52
- # === Parameters
53
- # dir(String):: directory resource exists at
54
- # resource(Object):: resource instance being built
47
+ # @param [String] dir for resource
48
+ # @param [Object] resource to build
49
+ #
50
+ # @return [TrueClass] always true
55
51
  def go(dir, resource)
52
+ raise NotImplementedError
56
53
  end
57
54
 
58
- # Notification that all scans for this repository have
59
- # completed.
55
+ # Notification that all scans for this repository have completed.
56
+ #
57
+ # @return [TrueClass] always true
60
58
  def finish
59
+ true
61
60
  end
62
61
  end
63
62
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright: Copyright (c) 2010-2011 RightScale, Inc.
2
+ # Copyright: Copyright (c) 2010-2013 RightScale, Inc.
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining
5
5
  # a copy of this software and associated documentation files (the
@@ -21,12 +21,13 @@
21
21
  # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- require File.expand_path(File.join(File.dirname(__FILE__), 'base'))
24
+ # ancestor
25
+ require 'right_scraper/builders'
25
26
 
26
27
  module RightScraper
27
28
  module Builders
28
29
  # Build metadata by scanning the filesystem.
29
- class Filesystem < Builder
30
+ class Filesystem < ::RightScraper::Builders::Base
30
31
 
31
32
  # Create a new filesystem scanner. In addition to the options
32
33
  # recognized by Builder, this class recognizes <tt>:retriever</tt> and
@@ -85,9 +86,10 @@ module RightScraper
85
86
  if File.directory?(fullpath)
86
87
  maybe_scan(Dir.new(fullpath), relative_position)
87
88
  else
88
- @scanner.notice(relative_position) do
89
- open(fullpath) {|f| f.read}
90
- end
89
+ # bind the temporary parameters to the callback in case it is not
90
+ # invoked immediately.
91
+ bind_now = lambda{|file| lambda{ open(file) {|f| f.read} } }.call(fullpath)
92
+ @scanner.notice(relative_position, &bind_now)
91
93
  end
92
94
  end
93
95
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright: Copyright (c) 2010-2011 RightScale, Inc.
2
+ # Copyright: Copyright (c) 2010-2013 RightScale, Inc.
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining
5
5
  # a copy of this software and associated documentation files (the
@@ -21,6 +21,9 @@
21
21
  # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
+ # ancestor
25
+ require 'right_scraper/builders'
26
+
24
27
  module RightScraper
25
28
  module Builders
26
29
  # Union builder, to permit running multiple builders in sequence
@@ -0,0 +1,31 @@
1
+ #
2
+ # Copyright (c) 2013 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ # ancestor
24
+ require 'right_scraper'
25
+
26
+ module RightScraper
27
+ module Loggers
28
+ autoload :Base, 'right_scraper/loggers/base'
29
+ autoload :Default, 'right_scraper/loggers/default'
30
+ end
31
+ end
@@ -0,0 +1,113 @@
1
+ #--
2
+ # Copyright: Copyright (c) 2013 RightScale, Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # 'Software'), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ # ancestor
25
+ require 'right_scraper/loggers'
26
+
27
+ require 'logger'
28
+
29
+ module RightScraper
30
+ module Loggers
31
+ class Base < ::Logger
32
+
33
+ attr_accessor :callback, :errors, :warnings
34
+
35
+ def initialize(*args)
36
+ super(*args)
37
+ @abort_seen = false
38
+ @callback = nil
39
+ @errors = []
40
+ @warnings = []
41
+ end
42
+
43
+ # Encapsulates an operation that merits logging.
44
+ #
45
+ # @param [Symbol] type of operation
46
+ # @param [String] explanation of operation or empty
47
+ #
48
+ # @yield [] operational callback (required)
49
+ #
50
+ # @return [Object] result of callback
51
+ def operation(type, explanation = '')
52
+ begin
53
+ note_phase(:begin, type, explanation)
54
+ result = yield
55
+ note_phase(:commit, type, explanation)
56
+ result
57
+ rescue Exception => e
58
+ note_phase(:abort, type, explanation, e)
59
+ raise
60
+ end
61
+ end
62
+
63
+ # Note a phase change within an operation.
64
+ #
65
+ # @param [Symbol] phase of operation; one of :begin, :commit, :abort
66
+ # @param [Symbol] type of operation
67
+ # @param [String] explanation of operation or nil
68
+ # @param [Exception] exception or nil
69
+ #
70
+ # @return [TrueClass] always true
71
+ def note_phase(phase, type, explanation, exception = nil)
72
+ @callback.call(phase, type, explanation, exception) if @callback
73
+ case phase
74
+ when :begin
75
+ @abort_seen = false
76
+ when :commit
77
+ # do nothing
78
+ when :abort
79
+ unless @abort_seen
80
+ note_error(exception, type, explanation)
81
+ @abort_seen = true
82
+ end
83
+ else
84
+ fail 'Unknown phase'
85
+ end
86
+ end
87
+
88
+ # Note an error, with the given exception and explanation of what
89
+ # was going on.
90
+ #
91
+ # @param [Exception] exception or nil
92
+ # @param [Symbol] type of operation
93
+ # @param [String] explanation of operation or nil
94
+ #
95
+ # @return [TrueClass] always true
96
+ def note_error(exception, type, explanation = nil)
97
+ raise NotImplementedError
98
+ end
99
+
100
+ # Note a warning for current operation.
101
+ #
102
+ # @param [Exception] exception or nil
103
+ # @param [Symbol] type of operation
104
+ # @param [String] explanation of operation or nil
105
+ #
106
+ # @return [TrueClass] always true
107
+ def note_warning(message)
108
+ raise NotImplementedError
109
+ end
110
+
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,98 @@
1
+ #--
2
+ # Copyright: Copyright (c) 2010-2013 RightScale, Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # 'Software'), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ # ancestor
25
+ require 'right_scraper/loggers'
26
+
27
+ module RightScraper::Loggers
28
+
29
+ # provides a default scraper logger implementation that accumulates errors and
30
+ # warnings but otherwise is a null logger.
31
+ class Default < ::RightScraper::Loggers::Base
32
+
33
+ def initialize(*args)
34
+ if args.empty?
35
+ is_windows = !!(RUBY_PLATFORM =~ /mswin|win32|dos|mingw|cygwin/)
36
+ super(is_windows ? 'nul' : '/dev/null')
37
+ else
38
+ super(*args)
39
+ end
40
+ self.level = ::Logger::ERROR
41
+ @recording_messages = true
42
+ end
43
+
44
+ # implements Interface#note_error
45
+ def note_error(exception, type, explanation = '')
46
+ without_recording_messages do
47
+ explanation = explanation.to_s.strip
48
+ message = "Saw #{exception ? exception.message : 'error'} during #{type}"
49
+ message += ": #{explanation}" unless explanation.empty?
50
+ error(message)
51
+ end
52
+ @errors << [exception, type, explanation]
53
+ end
54
+
55
+ # implements Interface#note_warning
56
+ def note_warning(message)
57
+ without_recording_messages { warn(message) }
58
+ @warnings << message
59
+ end
60
+
61
+ # overrides ::Logger#add in order to record errors and warnings logged via
62
+ # the normal logger interface.
63
+ def add(severity, message = nil, progname = nil)
64
+ if severity >= self.level
65
+ # super logger.
66
+ if message.nil?
67
+ if block_given?
68
+ message = yield
69
+ else
70
+ message = progname
71
+ progname = self.progname
72
+ end
73
+ end
74
+ super(severity, message, progname)
75
+
76
+ # record errors (with detail) and warnings.
77
+ if @recording_messages
78
+ if severity >= Logger::ERROR
79
+ @errors << [nil, :log, message]
80
+ elsif severity == ::Logger::WARN
81
+ @warnings << message
82
+ end
83
+ end
84
+ end
85
+ true
86
+ end
87
+
88
+ protected
89
+
90
+ def without_recording_messages
91
+ old_recording_messages = @recording_messages
92
+ @recording_messages = false
93
+ yield
94
+ ensure
95
+ @recording_messages = old_recording_messages
96
+ end
97
+ end
98
+ end