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
data/Gemfile DELETED
@@ -1,15 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
4
-
5
- gem 'right_popen', :git => 'git@github.com:rightscale/right_popen.git',
6
- :branch => "master"
7
-
8
- gem 'right_support', '2.7'
9
-
10
- group :development do
11
- gem "rake", "0.8.7"
12
- gem "ruby-debug", :platform=>"ruby_18"
13
- gem "ruby-debug19", :platform=>"ruby_19"
14
- gem "rdoc", "~> 2.4"
15
- end
data/Rakefile DELETED
@@ -1,89 +0,0 @@
1
- #-- -*-ruby-*-
2
- # Copyright: Copyright (c) 2010-2011 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
- require 'rubygems'
25
- require 'rubygems/package_task'
26
- require 'bundler/setup'
27
-
28
- require 'fileutils'
29
- require 'rake'
30
- require 'rspec/core/rake_task'
31
- require 'rdoc/task'
32
- require 'rake/clean'
33
-
34
- task :default => 'spec'
35
-
36
- # == Gem packaging == #
37
-
38
- desc "Build right_scraper gem"
39
- Gem::PackageTask.new(Gem::Specification.load("right_scraper.gemspec")) do |package|
40
- package.need_zip = true
41
- package.need_tar = true
42
- end
43
-
44
- CLEAN.include('pkg')
45
-
46
- # == Unit Tests == #
47
-
48
- task :specs => :spec
49
-
50
- # == Unit Tests == #
51
-
52
- desc 'Run unit tests'
53
- RSpec::Core::RakeTask.new do |t|
54
- t.pattern = 'spec/**/*_spec.rb'
55
- t.rspec_opts = ["--color", "--format", "nested"]
56
- end
57
-
58
- namespace :spec do
59
- desc "Run unit tests with RCov"
60
- RSpec::Core::RakeTask.new(:rcov) do |t|
61
- t.pattern = '*/spec/**/*_spec.rb'
62
- t.rcov = true
63
- t.rcov_opts = %q[--exclude "spec"]
64
- end
65
-
66
- desc "Print Specdoc for unit tests"
67
- RSpec::Core::RakeTask.new(:doc) do |t|
68
- t.pattern = '*/spec/**/*_spec.rb'
69
- t.rspec_opts = ["--format", "documentation"]
70
- end
71
- end
72
-
73
- # == Documentation == #
74
-
75
- desc "Generate API documentation to doc/rdocs/index.html"
76
- RDoc::Task.new do |rd|
77
- rd.rdoc_dir = 'doc/rdocs'
78
- rd.main = 'README.rdoc'
79
- rd.rdoc_files.include 'README.rdoc', 'lib/**/*.rb'
80
-
81
- rd.options << '--all'
82
- rd.options << '--diagram'
83
- end
84
-
85
- # == Emacs integration == #
86
- desc "Rebuild TAGS file"
87
- task :tags do
88
- sh "rtags -R */{lib,spec}"
89
- end
@@ -1,107 +0,0 @@
1
- #--
2
- # Copyright: Copyright (c) 2010-2011 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
- require 'logger'
25
-
26
- module RightScraper
27
- # Very simplistic logger for scraper operations.
28
- class Logger < ::Logger
29
- # If no arguments, create a Logger that logs to nothing.
30
- # Otherwise pass the arguments on to ::Logger.
31
- def initialize(*args)
32
- if args.empty?
33
- is_windows = !!(RUBY_PLATFORM =~ /mswin|win32|dos|mingw|cygwin/)
34
- super((is_windows ? 'nul' : '/dev/null'))
35
- self.level = ::Logger::ERROR
36
- else
37
- super
38
- end
39
- @exceptional = false
40
- end
41
-
42
- # (RightScraper::Repositories::Base) Repository currently being examined.
43
- attr_writer :repository
44
-
45
- # Begin an operation that merits logging. Will call #note_error
46
- # if an exception is raised during the operation.
47
- #
48
- # === Parameters
49
- # type(Symbol):: operation type identifier
50
- # explanation(String):: optional explanation
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 an event to the log. In this base class this calls
64
- # note_error when an error occurs, but subclasses will presumably
65
- # want to override it.
66
- #
67
- # === Parameters
68
- # phase(Symbol):: phase of operation; one of :begin, :commit, :abort
69
- # type(Symbol):: operation type identifier
70
- # explanation(String):: explanation of operation
71
- # exception(Exception):: optional exception (only if +phase+ is :abort)
72
- def note_phase(phase, type, explanation, exception=nil)
73
- case phase
74
- when :begin then @exceptional = false
75
- when :abort then
76
- unless @exceptional
77
- note_error(exception, type, explanation)
78
- @exceptional = true
79
- end
80
- end
81
- end
82
-
83
- # Log an error, with the given exception and explanation of what
84
- # was going on.
85
- #
86
- # === Parameters
87
- # exception(Exception):: exception raised
88
- # type(Symbol):: operation type identifier
89
- # explanation(String):: optional explanation
90
- def note_error(exception, type, explanation="")
91
- error("Saw #{exception} during #{type}#{maybe_explain(explanation)}")
92
- end
93
-
94
- def note_warning(message)
95
- warn(message)
96
- end
97
-
98
- protected
99
- def maybe_explain(explanation)
100
- if explanation.nil? || explanation.empty?
101
- ""
102
- else
103
- ": #{explanation}"
104
- end
105
- end
106
- end
107
- end
@@ -1,85 +0,0 @@
1
- #--
2
- # Copyright: Copyright (c) 2010 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
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'logger'))
25
-
26
- module RightScraper
27
- module Loggers
28
- # A very noisy logger, useful for debugging.
29
- class NoisyLogger < Logger
30
- # Initialize the logger, setting the current operation depth to 1.
31
- def initialize(*args)
32
- super
33
- @pending = []
34
- end
35
-
36
- # Note an event to the log, including a visual indicator of how
37
- # many nested operations are currently pending.
38
- #
39
- # === Parameters
40
- # phase(Symbol):: phase of operation; one of :begin, :commit, :abort
41
- # type(Symbol):: operation type identifier
42
- # explanation(String):: explanation of operation
43
- # exception(Exception):: optional exception (only if +phase+ is :abort)
44
- def note_phase(phase, type, explanation, exception=nil)
45
- if phase == :begin
46
- @pending.push [type, explanation]
47
- end
48
- super
49
- debug("#{depth_str} #{phase} #{immediate_context}")
50
- unless phase == :begin
51
- @pending.pop
52
- end
53
- end
54
-
55
- def note_error(exception, type, explanation="")
56
- recordedtype, recordedexplanation = @pending[-1]
57
- if recordedtype != type || recordedexplanation != explanation
58
- @pending.push [type, explanation]
59
- end
60
- error("Saw #{exception} during #{context}")
61
- if recordedtype != type || recordedexplanation != explanation
62
- @pending.pop
63
- end
64
- end
65
-
66
- private
67
- def depth_str
68
- '>' * @pending.size
69
- end
70
-
71
- def context
72
- @pending.reverse.map {|pair| contextify(pair)}.join(" in ")
73
- end
74
-
75
- def immediate_context
76
- contextify(@pending[-1])
77
- end
78
-
79
- def contextify(pair)
80
- type, explanation = pair
81
- "#{type}#{maybe_explain(explanation)}"
82
- end
83
- end
84
- end
85
- end
@@ -1,70 +0,0 @@
1
- #--
2
- # Copyright: Copyright (c) 2010-2011 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
- require File.expand_path(File.join(File.dirname(__FILE__), 'base'))
24
-
25
- module RightScraper
26
- module Repositories
27
- # A "repository" that is just there for testing. This class is not
28
- # loaded by default.
29
- class Mock < Base
30
- # Create a new mock repository.
31
- def initialize
32
- @repo_type = :mock
33
- end
34
- # (String) Type of the repository, here 'download'.
35
- attr_accessor :repo_type
36
-
37
- # (String) Optional, tag or branch of repository that should be downloaded
38
- attr_accessor :tag
39
-
40
- # (String) Optional, username
41
- attr_accessor :first_credential
42
-
43
- # (String) Optional, password
44
- attr_accessor :second_credential
45
-
46
- # Unique representation for this repo, should resolve to the same string
47
- # for repos that should be cloned in same directory
48
- #
49
- # === Returns
50
- # res(String):: Unique representation for this repo
51
- def to_s
52
- res = "mock #{url}:#{tag}"
53
- end
54
-
55
- # (Base class) Appropriate class for scraping this sort of
56
- # repository.
57
- def scraper
58
- @@scraper || raise("Scraper for mocks isn't defined yet")
59
- end
60
-
61
- # Set the correct sort of scraper to use for mock repositories.
62
- def self.scraper=(scraper)
63
- @@scraper = scraper
64
- end
65
-
66
- # Add this repository to the list of available types.
67
- @@types[:mock] = RightScraper::Repositories::Mock
68
- end
69
- end
70
- end
@@ -1,79 +0,0 @@
1
- #--
2
- # Copyright: Copyright (c) 2010-2011 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
- module RightScraper
25
- module Retrievers
26
-
27
- # Base class for retrievers that want to do version control operations
28
- # (CVS, SVN, etc.). Subclasses can get away with implementing only
29
- # Retrievers::Base#available? and #do_checkout but to support incremental
30
- # operation need to implement #exists? and #do_update, in addition to
31
- # Retrievers::Base#ignorable_paths.
32
- class CheckoutBasedRetriever < Base
33
-
34
- # Check out repository into the directory. Occurs between
35
- # variable initialization and beginning scraping.
36
- def retrieve
37
- raise RetrieverError.new("retriever is unavailable") unless available?
38
- if exists?
39
- begin
40
- @logger.operation(:updating) do
41
- do_update
42
- end
43
- rescue Exception => e
44
- FileUtils.remove_entry_secure @basedir
45
- @logger.operation(:checkout, "switching to using checkout") do
46
- do_checkout
47
- end
48
- end
49
- else
50
- @logger.operation(:checkout) do
51
- do_checkout
52
- end
53
- end
54
- end
55
-
56
- # Return true if a checkout exists.
57
- #
58
- # === Returns
59
- # Boolean:: true if the checkout already exists (and thus
60
- # incremental updating can occur).
61
- def exists?
62
- false
63
- end
64
-
65
- # Perform an incremental update of the checkout. Subclasses that
66
- # want to handle incremental updating need to override this.
67
- def do_update
68
- do_checkout
69
- end
70
-
71
- # Perform a de novo full checkout of the repository. Subclasses
72
- # must override this to do anything useful.
73
- def do_checkout
74
- FileUtils.mkdir_p(@repo_dir)
75
- end
76
-
77
- end
78
- end
79
- end