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
@@ -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