right_scraper 3.2.6 → 5.0.1

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.
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
@@ -1,66 +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
-
26
- class ScraperLogger < Logger
27
- attr_accessor :callback, :errors, :warnings
28
-
29
- def add(severity, message=nil, progname=nil)
30
- if severity >= (self.level || Logger::WARN)
31
- if message.nil?
32
- if block_given?
33
- message = yield
34
- else
35
- message = progname
36
- progname = self.progname
37
- end
38
- end
39
- @errors << [nil, :log,
40
- {:severity => severity,
41
- :message => message,
42
- :progname => progname}]
43
- end
44
- end
45
-
46
- def initialize
47
- @errors = []
48
- @warnings = []
49
- end
50
-
51
- def note_phase(phase, type, explanation, exception=nil)
52
- @callback.call(phase, type, explanation, exception) unless @callback.nil?
53
- super
54
- end
55
-
56
- def note_error(exception, type, explanation="")
57
- @errors << [exception, type, explanation]
58
- end
59
-
60
- def note_warning(message)
61
- @warnings << message
62
- end
63
-
64
- end
65
-
66
- end
@@ -1,164 +0,0 @@
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
- require 'right_popen'
25
- require 'right_popen/safe_output_buffer'
26
-
27
- module RightScraper
28
- # Simplified interface to the process of creating SVN client
29
- # contexts.
30
- #
31
- # SVN client contexts are needed for almost every nontrivial SVN
32
- # operation, and the authentication procedure is truly baroque.
33
- # Thus, when you need a client context, do something like this:
34
- # client = SvnClient.new(repository)
35
- # client.with_context do |ctx|
36
- # ...
37
- # end
38
- module SvnClient
39
-
40
- class SvnClientError < Exception; end
41
-
42
- def calculate_version
43
- unless @svn_version
44
- begin
45
- cmd = 'svn --version --quiet'
46
- out = `#{cmd}`
47
- if $?.success?
48
- @svn_version = out.chomp.split('.').map {|e| e.to_i}
49
- else
50
- raise SvnClientError, "Unable to determine svn version: #{cmd.inspect} exited with #{$?.exitstatus}"
51
- end
52
- rescue Errno::ENOENT => e
53
- raise SvnClientError, "Unable to determine svn version: #{e.message}"
54
- end
55
- end
56
- @svn_version
57
- end
58
-
59
- def svn_arguments
60
- version = calculate_version
61
- case
62
- when version[0] != 1
63
- raise "SVN major revision is not 1, cannot be sure it will run properly."
64
- when version[1] < 4
65
- raise "SVN minor revision < 4; cannot be sure it will run properly."
66
- when version[1] < 6
67
- # --trust-server-cert is a 1.6ism
68
- args = ["--no-auth-cache", "--non-interactive"]
69
- else
70
- args = ["--no-auth-cache", "--non-interactive", "--trust-server-cert"]
71
- end
72
- if repository.first_credential && repository.second_credential
73
- args << "--username"
74
- args << repository.first_credential
75
- args << "--password"
76
- args << repository.second_credential
77
- end
78
- args
79
- end
80
-
81
- def get_tag_argument
82
- if repository.tag
83
- tag_cmd = ["-r", get_tag.to_s]
84
- else
85
- tag_cmd = ["-r", "HEAD"]
86
- end
87
- end
88
-
89
- def run_svn_no_chdir(*args)
90
- run_svn_with(nil, :safe_output_svn_client, *args)
91
- end
92
-
93
- def run_svn(*args)
94
- run_svn_with(repo_dir, :safe_output_svn_client, *args)
95
- end
96
-
97
- def run_svn_with_buffered_output(*args)
98
- run_svn_with(repo_dir, :unsafe_output_svn_client, *args)
99
- end
100
-
101
- # runs svn client with safe buffering (by default).
102
- #
103
- # === Parameters
104
- # @param [Array] args for svn client command line
105
- #
106
- # === Return
107
- # @return [Array] lines of output or empty
108
- def run_svn_with(initial_directory, output_handler, *args)
109
- @output = ::RightScale::RightPopen::SafeOutputBuffer.new
110
- @output_handler = output_handler
111
- cmd = ['svn', args, svn_arguments].flatten
112
- ::RightScale::RightPopen.popen3_sync(
113
- cmd,
114
- :target => self,
115
- :directory => initial_directory,
116
- :timeout_handler => :timeout_svn_client,
117
- :size_limit_handler => :size_limit_svn_client,
118
- :exit_handler => :exit_svn_client,
119
- :stderr_handler => output_handler,
120
- :stdout_handler => output_handler,
121
- :inherit_io => true, # avoid killing any rails connection
122
- :watch_directory => repo_dir,
123
- :size_limit_bytes => @max_bytes,
124
- :timeout_seconds => @max_seconds)
125
- @output.buffer
126
- end
127
-
128
- def safe_output_svn_client(data)
129
- @output.safe_buffer_data(data)
130
- end
131
-
132
- def unsafe_output_svn_client(data)
133
- @output.buffer << data.chomp
134
- end
135
-
136
- def timeout_svn_client
137
- raise SvnClientError, "svn client timed out"
138
- end
139
-
140
- def size_limit_svn_client
141
- raise SvnClientError, "svn client exceeded size limit"
142
- end
143
-
144
- def exit_svn_client(status)
145
- unless status.success?
146
- self.method(@output_handler).call("Exit code = #{status.exitstatus}")
147
- raise SvnClientError, "svn client failed: #{@output.display_text}"
148
- end
149
- true
150
- end
151
-
152
- # Fetch the tag from the repository, or nil if one doesn't
153
- # exist. This is a separate method because the repo tag should
154
- # be a number but is a string in the database.
155
- def get_tag
156
- case repository.tag
157
- when Fixnum then repository.tag
158
- when /^\d+$/ then repository.tag.to_i
159
- else
160
- repository.tag
161
- end
162
- end
163
- end
164
- end
data/right_scraper.rconf DELETED
@@ -1,13 +0,0 @@
1
- # RConf configuration file, usage:
2
- # gem install rconf
3
- # rconf
4
- #
5
- ruby do
6
- version 'ruby-1.9.2-p290'
7
- rubygems '1.8.10'
8
- gemset 'right_scraper'
9
- end
10
- bundler do
11
- version '1.2.1'
12
- bundle_path File.join(ENV["HOME"], '.rightscale', 'right_scraper')
13
- end
data/spec/builder_spec.rb DELETED
@@ -1,50 +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 File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
25
- require File.expand_path(File.join(File.dirname(__FILE__), 'download', 'download_retriever_spec_helper'))
26
-
27
- describe RightScraper::Builders::Builder do
28
-
29
- include RightScraper::SpecHelpers::DevelopmentModeEnvironment
30
-
31
- before(:each) do
32
- @helper = RightScraper::DownloadRetrieverSpecHelper.new
33
- @repo_dir = @helper.download_repo_path
34
- end
35
-
36
- it 'should be called correctly' do
37
- builder = flexmock("builder")
38
- builder.should_receive(:new).with(Hash).once.and_return(builder)
39
- builder.should_receive(:go).with(String, RightScraper::Resources::Cookbook).once
40
- builder.should_receive(:finish).with().once
41
-
42
- @scraper = RightScraper::Scrapers::Cookbook.new(:repository => @helper.repo,
43
- :repo_dir => @repo_dir,
44
- :builders => [builder])
45
- @scraper.next_resource.should_not be_nil
46
- @scraper.next_resource.should be_nil
47
- @scraper.close
48
- end
49
-
50
- end
@@ -1,73 +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 File.expand_path(File.join(File.dirname(__FILE__), 'retriever_spec_helper'))
25
- require 'uri'
26
- require 'cgi'
27
-
28
- module RightScraper
29
- module CookbookHelper
30
-
31
- def example_cookbook(repository, position=nil)
32
- @helper = RightScraper::RetrieverSpecHelper.new if @helper.nil?
33
- RightScraper::Resources::Cookbook.new(@repository, position)
34
- end
35
-
36
- def parse_url(repository)
37
- uri = URI.parse(repository.url)
38
- userinfo, query, tag = uri.select(:userinfo, :query, :fragment)
39
- unless userinfo.nil?
40
- username, password = userinfo.split(":", 2).map {|str| URI.unescape str}
41
- uri.user = nil
42
- uri.password = nil
43
- end
44
- unless query.nil?
45
- hash = CGI::parse(query)
46
- position = hash["p"][0]
47
- hash.delete("p")
48
- result = hash.map do |key, values|
49
- values.map {|value| CGI::escape(key) + "=" + CGI::escape(value)}.join(";")
50
- end.join(';')
51
-
52
- if result == ""
53
- uri.query = nil
54
- else
55
- uri.query = result
56
- end
57
- end
58
- uri.fragment = nil unless tag.nil?
59
- { :url => uri.to_s,
60
- :username => username,
61
- :password => password,
62
- :position => position,
63
- :tag => tag}
64
- end
65
-
66
- shared_examples_for 'a generic repository' do
67
- it 'should have the same url' do
68
- parse_url(@repository)[:url].should == @repository.url
69
- end
70
- end
71
-
72
- end
73
- end
@@ -1,93 +0,0 @@
1
- #-- -*- mode: ruby; encoding: utf-8 -*-
2
- # Copyright: Copyright (c) 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 File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
25
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'right_scraper'))
26
-
27
-
28
- module RightScraper::Scanners
29
- describe CookbookManifest do
30
- it 'should accumulate files' do
31
- resource = flexmock(:resource)
32
- resource.should_receive(:manifest=).with({"foo" => Digest::MD5.hexdigest("bar"),
33
- "baz" => Digest::MD5.hexdigest("quux")
34
- }).once
35
- manifest = CookbookManifest.new
36
- manifest.notice("foo") { "bar" }
37
- manifest.notice("baz") { "quux" }
38
- manifest.end(resource)
39
- end
40
- it 'should keep different resources separated' do
41
- resource = flexmock(:resource)
42
- resource.should_receive(:manifest=).with({"foo" => Digest::MD5.hexdigest("bar"),
43
- "baz" => Digest::MD5.hexdigest("quux")
44
- }).once
45
- resource.should_receive(:manifest=).with({"bar" => Digest::MD5.hexdigest("fred")
46
- }).once
47
- manifest = CookbookManifest.new
48
- manifest.notice("foo") { "bar" }
49
- manifest.notice("baz") { "quux" }
50
- manifest.end(resource)
51
- manifest.notice("bar") { "fred" }
52
- manifest.end(resource)
53
- end
54
- it 'should hash to the same value despite resource order' do
55
- cookbook1 = RightScraper::Resources::Cookbook.new('<empty>', '')
56
- cookbook2 = RightScraper::Resources::Cookbook.new('<empty>', '')
57
-
58
- manifest = CookbookManifest.new
59
-
60
- manifest.notice("foo") {"bar"}
61
- manifest.notice("baz") {"quux"}
62
- manifest.notice("bar/none") {"fred"}
63
- manifest.notice("bar/all") {"fred"}
64
- manifest.notice("a/really/deep/directory/fox") {"stray"}
65
- manifest.end(cookbook1)
66
-
67
- manifest.notice("bar/none") {"fred"}
68
- manifest.notice("a/really/deep/directory/fox") {"stray"}
69
- manifest.notice("foo") {"bar"}
70
- manifest.notice("baz") {"quux"}
71
- manifest.notice("bar/all") {"fred"}
72
- manifest.end(cookbook2)
73
-
74
- cookbook1.resource_hash.should == cookbook2.resource_hash
75
- end
76
- it 'should hash to the same value despite repository location' do
77
- cookbook1 = RightScraper::Resources::Cookbook.new('git://github.com/somerepo', '')
78
- cookbook2 = RightScraper::Resources::Cookbook.new('svn://mycompany/rss/myrepo', '')
79
-
80
- manifest = CookbookManifest.new
81
-
82
- manifest.notice("foo") {"bar"}
83
- manifest.notice("baz") {"quux"}
84
- manifest.end(cookbook1)
85
-
86
- manifest.notice("foo") {"bar"}
87
- manifest.notice("baz") {"quux"}
88
- manifest.end(cookbook2)
89
-
90
- cookbook1.resource_hash.should == cookbook2.resource_hash
91
- end
92
- end
93
- end