right_scraper 3.0.0 → 3.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.
- data/lib/right_scraper/retrievers/base.rb +8 -0
 - data/lib/right_scraper/retrievers/checkout.rb +6 -5
 - data/lib/right_scraper/retrievers/download.rb +23 -0
 - data/lib/right_scraper/retrievers/git.rb +28 -1
 - data/lib/right_scraper/retrievers/svn.rb +22 -0
 - data/lib/right_scraper/scraper.rb +1 -1
 - data/lib/right_scraper/scrapers/workflow.rb +8 -1
 - data/right_scraper.gemspec +1 -1
 - data/right_scraper.rconf +2 -2
 - data/spec/cookbook_s3_upload_spec.rb +7 -5
 - data/spec/git/retriever_spec.rb +27 -3
 - data/spec/svn/retriever_spec.rb +12 -7
 - metadata +29 -73
 
| 
         @@ -43,6 +43,9 @@ module RightScraper 
     | 
|
| 
       43 
43 
     | 
    
         
             
                  # String:: Path to directory where files are retrieved
         
     | 
| 
       44 
44 
     | 
    
         
             
                  attr_reader :repo_dir
         
     | 
| 
       45 
45 
     | 
    
         | 
| 
      
 46 
     | 
    
         
            +
                  # exceptions
         
     | 
| 
      
 47 
     | 
    
         
            +
                  class RetrieverError < Exception; end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
       46 
49 
     | 
    
         
             
                  # Create a new retriever for the given repository.  This class
         
     | 
| 
       47 
50 
     | 
    
         
             
                  # recognizes several options, and subclasses may recognize
         
     | 
| 
       48 
51 
     | 
    
         
             
                  # additional options.  Options may never be required.
         
     | 
| 
         @@ -73,6 +76,11 @@ module RightScraper 
     | 
|
| 
       73 
76 
     | 
    
         
             
                    end
         
     | 
| 
       74 
77 
     | 
    
         
             
                  end
         
     | 
| 
       75 
78 
     | 
    
         | 
| 
      
 79 
     | 
    
         
            +
                  # Determines if retriever is available (has required CLI tools, etc.)
         
     | 
| 
      
 80 
     | 
    
         
            +
                  def available?
         
     | 
| 
      
 81 
     | 
    
         
            +
                    raise NotImplementedError
         
     | 
| 
      
 82 
     | 
    
         
            +
                  end
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
       76 
84 
     | 
    
         
             
                  # Paths to ignore when traversing the filesystem.  Mostly used for
         
     | 
| 
       77 
85 
     | 
    
         
             
                  # things like Git and Subversion version control directories.
         
     | 
| 
       78 
86 
     | 
    
         
             
                  #
         
     | 
| 
         @@ -24,16 +24,17 @@ 
     | 
|
| 
       24 
24 
     | 
    
         
             
            module RightScraper
         
     | 
| 
       25 
25 
     | 
    
         
             
              module Retrievers
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                # Base class for retrievers that want to do version control
         
     | 
| 
       28 
     | 
    
         
            -
                #  
     | 
| 
       29 
     | 
    
         
            -
                #  
     | 
| 
       30 
     | 
    
         
            -
                # operation need to implement #exists? and #do_update, in addition
         
     | 
| 
       31 
     | 
    
         
            -
                #  
     | 
| 
      
 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 
32 
     | 
    
         
             
                class CheckoutBasedRetriever < Base
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
                  # Check out repository into the directory.  Occurs between
         
     | 
| 
       35 
35 
     | 
    
         
             
                  # variable initialization and beginning scraping.
         
     | 
| 
       36 
36 
     | 
    
         
             
                  def retrieve
         
     | 
| 
      
 37 
     | 
    
         
            +
                    raise RetrieverError.new("retriever is unavailable") unless available?
         
     | 
| 
       37 
38 
     | 
    
         
             
                    if exists?
         
     | 
| 
       38 
39 
     | 
    
         
             
                      begin
         
     | 
| 
       39 
40 
     | 
    
         
             
                        @logger.operation(:updating) do
         
     | 
| 
         @@ -30,6 +30,28 @@ module RightScraper 
     | 
|
| 
       30 
30 
     | 
    
         
             
                # somewhere.  Uses command line curl and command line tar.
         
     | 
| 
       31 
31 
     | 
    
         
             
                class Download < Base
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
      
 33 
     | 
    
         
            +
                  @@available = false
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  # Determines if downloader is available.
         
     | 
| 
      
 36 
     | 
    
         
            +
                  def available?
         
     | 
| 
      
 37 
     | 
    
         
            +
                    unless @@available
         
     | 
| 
      
 38 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 39 
     | 
    
         
            +
                        # FIX: we might want to parse the result and require a minimum curl
         
     | 
| 
      
 40 
     | 
    
         
            +
                        # version.
         
     | 
| 
      
 41 
     | 
    
         
            +
                        cmd = "curl --version"
         
     | 
| 
      
 42 
     | 
    
         
            +
                        `#{cmd}`
         
     | 
| 
      
 43 
     | 
    
         
            +
                        if $?.success?
         
     | 
| 
      
 44 
     | 
    
         
            +
                          @@available = true
         
     | 
| 
      
 45 
     | 
    
         
            +
                        else
         
     | 
| 
      
 46 
     | 
    
         
            +
                          raise RetrieverError, "\"#{cmd}\" exited with #{$?.exitstatus}"
         
     | 
| 
      
 47 
     | 
    
         
            +
                        end
         
     | 
| 
      
 48 
     | 
    
         
            +
                      rescue
         
     | 
| 
      
 49 
     | 
    
         
            +
                        @logger.note_error($!, :available, "download retriever is unavailable")
         
     | 
| 
      
 50 
     | 
    
         
            +
                      end
         
     | 
| 
      
 51 
     | 
    
         
            +
                    end
         
     | 
| 
      
 52 
     | 
    
         
            +
                    @@available
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
       33 
55 
     | 
    
         
             
                  # Directory used to download tarballs
         
     | 
| 
       34 
56 
     | 
    
         
             
                  def workdir
         
     | 
| 
       35 
57 
     | 
    
         
             
                    File.join(@basedir, @repository.repository_hash)
         
     | 
| 
         @@ -42,6 +64,7 @@ module RightScraper 
     | 
|
| 
       42 
64 
     | 
    
         | 
| 
       43 
65 
     | 
    
         
             
                  # Download tarball and unpack it
         
     | 
| 
       44 
66 
     | 
    
         
             
                  def retrieve
         
     | 
| 
      
 67 
     | 
    
         
            +
                    raise RetrieverError.new("download retriever is unavailable") unless available?
         
     | 
| 
       45 
68 
     | 
    
         
             
                    FileUtils.remove_entry_secure workdir if File.exists?(workdir)
         
     | 
| 
       46 
69 
     | 
    
         
             
                    FileUtils.mkdir_p repo_dir
         
     | 
| 
       47 
70 
     | 
    
         
             
                    file = File.join(workdir, "package")
         
     | 
| 
         @@ -20,16 +20,43 @@ 
     | 
|
| 
       20 
20 
     | 
    
         
             
            # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
         
     | 
| 
       21 
21 
     | 
    
         
             
            # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         
     | 
| 
       22 
22 
     | 
    
         
             
            #++
         
     | 
| 
       23 
     | 
    
         
            -
            require 'git'
         
     | 
| 
       24 
23 
     | 
    
         | 
| 
       25 
24 
     | 
    
         
             
            module RightScraper
         
     | 
| 
       26 
25 
     | 
    
         
             
              module Retrievers
         
     | 
| 
       27 
26 
     | 
    
         
             
                # Retriever for resources stored in a git repository.
         
     | 
| 
       28 
27 
     | 
    
         
             
                class Git < CheckoutBasedRetriever
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  @@available = false
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                  # Determines if downloader is available.
         
     | 
| 
      
 32 
     | 
    
         
            +
                  def available?
         
     | 
| 
      
 33 
     | 
    
         
            +
                    unless @@available
         
     | 
| 
      
 34 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 35 
     | 
    
         
            +
                        require 'git'
         
     | 
| 
      
 36 
     | 
    
         
            +
                        # note that require 'git' does the same version check on load but
         
     | 
| 
      
 37 
     | 
    
         
            +
                        # we don't want to assume any particular implementation.
         
     | 
| 
      
 38 
     | 
    
         
            +
                        #
         
     | 
| 
      
 39 
     | 
    
         
            +
                        # FIX: we might want to parse the result and require a minimum git
         
     | 
| 
      
 40 
     | 
    
         
            +
                        # client version.
         
     | 
| 
      
 41 
     | 
    
         
            +
                        cmd = "git --version"
         
     | 
| 
      
 42 
     | 
    
         
            +
                        `#{cmd}`
         
     | 
| 
      
 43 
     | 
    
         
            +
                        if $?.success?
         
     | 
| 
      
 44 
     | 
    
         
            +
                          @@available = true
         
     | 
| 
      
 45 
     | 
    
         
            +
                        else
         
     | 
| 
      
 46 
     | 
    
         
            +
                          raise RetrieverError, "\"#{cmd}\" exited with #{$?.exitstatus}"
         
     | 
| 
      
 47 
     | 
    
         
            +
                        end
         
     | 
| 
      
 48 
     | 
    
         
            +
                      rescue
         
     | 
| 
      
 49 
     | 
    
         
            +
                        @logger.note_error($!, :available, "git retriever is unavailable")
         
     | 
| 
      
 50 
     | 
    
         
            +
                      end
         
     | 
| 
      
 51 
     | 
    
         
            +
                    end
         
     | 
| 
      
 52 
     | 
    
         
            +
                    @@available
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
       29 
55 
     | 
    
         
             
                  # In addition to normal retriever initialization, if the
         
     | 
| 
       30 
56 
     | 
    
         
             
                  # underlying repository has a credential we need to initialize a
         
     | 
| 
       31 
57 
     | 
    
         
             
                  # fresh SSHAgent and add the credential to it.
         
     | 
| 
       32 
58 
     | 
    
         
             
                  def retrieve
         
     | 
| 
      
 59 
     | 
    
         
            +
                    raise RetrieverError.new("git retriever is unavailable") unless available?
         
     | 
| 
       33 
60 
     | 
    
         
             
                    RightScraper::Processes::SSHAgent.with do |agent|
         
     | 
| 
       34 
61 
     | 
    
         
             
                      agent.add_key(@repository.first_credential) unless
         
     | 
| 
       35 
62 
     | 
    
         
             
                        @repository.first_credential.nil?
         
     | 
| 
         @@ -31,6 +31,28 @@ module RightScraper 
     | 
|
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
                  include RightScraper::SvnClient
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
      
 34 
     | 
    
         
            +
                  @@available = false
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  # Determines if svn is available.
         
     | 
| 
      
 37 
     | 
    
         
            +
                  def available?
         
     | 
| 
      
 38 
     | 
    
         
            +
                    unless @@available
         
     | 
| 
      
 39 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 40 
     | 
    
         
            +
                        # FIX: we might want to parse the result and require a minimum svn
         
     | 
| 
      
 41 
     | 
    
         
            +
                        # client version.
         
     | 
| 
      
 42 
     | 
    
         
            +
                        cmd = "svn --version"
         
     | 
| 
      
 43 
     | 
    
         
            +
                        `#{cmd}`
         
     | 
| 
      
 44 
     | 
    
         
            +
                        if $?.success?
         
     | 
| 
      
 45 
     | 
    
         
            +
                          @@available = true
         
     | 
| 
      
 46 
     | 
    
         
            +
                        else
         
     | 
| 
      
 47 
     | 
    
         
            +
                          raise RetrieverError, "\"#{cmd}\" exited with #{$?.exitstatus}"
         
     | 
| 
      
 48 
     | 
    
         
            +
                        end
         
     | 
| 
      
 49 
     | 
    
         
            +
                      rescue
         
     | 
| 
      
 50 
     | 
    
         
            +
                        @logger.note_error($!, :available, "svn retriever is unavailable")
         
     | 
| 
      
 51 
     | 
    
         
            +
                      end
         
     | 
| 
      
 52 
     | 
    
         
            +
                    end
         
     | 
| 
      
 53 
     | 
    
         
            +
                    @@available
         
     | 
| 
      
 54 
     | 
    
         
            +
                  end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
       34 
56 
     | 
    
         
             
                  # Return true if a checkout exists.  Currently tests for .svn in
         
     | 
| 
       35 
57 
     | 
    
         
             
                  # the checkout.
         
     | 
| 
       36 
58 
     | 
    
         
             
                  #
         
     | 
| 
         @@ -82,7 +82,7 @@ module RightScraper 
     | 
|
| 
       82 
82 
     | 
    
         
             
                    retriever = nil
         
     | 
| 
       83 
83 
     | 
    
         
             
                    @logger.operation(:retrieving, "from #{repo}") do
         
     | 
| 
       84 
84 
     | 
    
         
             
                      retriever = repo.retriever(@options)
         
     | 
| 
       85 
     | 
    
         
            -
                      retriever.retrieve
         
     | 
| 
      
 85 
     | 
    
         
            +
                      retriever.retrieve if retriever.available?
         
     | 
| 
       86 
86 
     | 
    
         
             
                    end
         
     | 
| 
       87 
87 
     | 
    
         | 
| 
       88 
88 
     | 
    
         
             
                    # 2. Now scrape if there is a scraper in the options
         
     | 
| 
         @@ -41,6 +41,14 @@ module RightScraper 
     | 
|
| 
       41 
41 
     | 
    
         
             
                  # dir(Dir):: directory to begin search in
         
     | 
| 
       42 
42 
     | 
    
         
             
                  def find_next(dir)
         
     | 
| 
       43 
43 
     | 
    
         
             
                    @logger.operation(:finding_next_workflow, "in #{dir.path}") do
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                      # Note: there could be multiple workflow definitions in one directory
         
     | 
| 
      
 46 
     | 
    
         
            +
                      # so we need to record the current position whether we found a workflow
         
     | 
| 
      
 47 
     | 
    
         
            +
                      # or not. The next iteration will search again in the current directory
         
     | 
| 
      
 48 
     | 
    
         
            +
                      # event if we found one. If we don't find one then we call 
         
     | 
| 
      
 49 
     | 
    
         
            +
                      # 'search_dirs' which will recurse in the sub-directories.
         
     | 
| 
      
 50 
     | 
    
         
            +
                      @stack << dir
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
       44 
52 
     | 
    
         
             
                      def_ext = RightScraper::Resources::Workflow::DEFINITION_EXT
         
     | 
| 
       45 
53 
     | 
    
         
             
                      meta_ext = RightScraper::Resources::Workflow::METADATA_EXT
         
     | 
| 
       46 
54 
     | 
    
         
             
                      potentials = Dir[File.join(dir.path, "*#{def_ext}")]
         
     | 
| 
         @@ -56,7 +64,6 @@ module RightScraper 
     | 
|
| 
       56 
64 
     | 
    
         
             
                          workflow
         
     | 
| 
       57 
65 
     | 
    
         
             
                        end
         
     | 
| 
       58 
66 
     | 
    
         
             
                      else
         
     | 
| 
       59 
     | 
    
         
            -
                        @stack << dir
         
     | 
| 
       60 
67 
     | 
    
         
             
                        search_dirs
         
     | 
| 
       61 
68 
     | 
    
         
             
                      end
         
     | 
| 
       62 
69 
     | 
    
         
             
                    end
         
     | 
    
        data/right_scraper.gemspec
    CHANGED
    
    | 
         @@ -24,7 +24,7 @@ require 'rubygems' 
     | 
|
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
            Gem::Specification.new do |spec|
         
     | 
| 
       26 
26 
     | 
    
         
             
              spec.name      = 'right_scraper'
         
     | 
| 
       27 
     | 
    
         
            -
              spec.version   = '3.0. 
     | 
| 
      
 27 
     | 
    
         
            +
              spec.version   = '3.0.1'
         
     | 
| 
       28 
28 
     | 
    
         
             
              spec.authors   = ['Graham Hughes', 'Raphael Simon']
         
     | 
| 
       29 
29 
     | 
    
         
             
              spec.email     = 'raphael@rightscale.com'
         
     | 
| 
       30 
30 
     | 
    
         
             
              spec.homepage  = 'https://github.com/rightscale/right_scraper'
         
     | 
    
        data/right_scraper.rconf
    CHANGED
    
    
| 
         @@ -83,10 +83,11 @@ describe RightScraper::Scanners::CookbookS3Upload do 
     | 
|
| 
       83 
83 
     | 
    
         
             
                  bucket_name = 'this-bucket-does-not-exist'
         
     | 
| 
       84 
84 
     | 
    
         
             
                  @s3.bucket(bucket_name).should be_nil
         
     | 
| 
       85 
85 
     | 
    
         
             
                  lambda {
         
     | 
| 
       86 
     | 
    
         
            -
                  @scraper = @scraperclass.new(: 
     | 
| 
      
 86 
     | 
    
         
            +
                  @scraper = @scraperclass.new(:repository => @repo,
         
     | 
| 
      
 87 
     | 
    
         
            +
                                               :repo_dir => @download_repo_path,
         
     | 
| 
       87 
88 
     | 
    
         
             
                                               :scanners => [RightScraper::Scanners::CookbookMetadata,
         
     | 
| 
       88 
89 
     | 
    
         
             
                                                             RightScraper::Scanners::CookbookManifest,
         
     | 
| 
       89 
     | 
    
         
            -
                                                             RightScraper::Scanners:: 
     | 
| 
      
 90 
     | 
    
         
            +
                                                             RightScraper::Scanners::CookbookS3Upload],
         
     | 
| 
       90 
91 
     | 
    
         
             
                                               :s3_key => ENV['AMAZON_ACCESS_KEY_ID'],
         
     | 
| 
       91 
92 
     | 
    
         
             
                                               :s3_secret => ENV['AMAZON_SECRET_ACCESS_KEY'],
         
     | 
| 
       92 
93 
     | 
    
         
             
                                               :s3_bucket => bucket_name,
         
     | 
| 
         @@ -106,10 +107,11 @@ describe RightScraper::Scanners::CookbookS3Upload do 
     | 
|
| 
       106 
107 
     | 
    
         
             
                                                           :repo_type    => :download,
         
     | 
| 
       107 
108 
     | 
    
         
             
                                                           :url          => "file:///#{@download_file}")
         
     | 
| 
       108 
109 
     | 
    
         
             
                  bucket_name = 'com.rightscale.test.20100823'
         
     | 
| 
       109 
     | 
    
         
            -
                  @scraper = @scraperclass.new(: 
     | 
| 
      
 110 
     | 
    
         
            +
                  @scraper = @scraperclass.new(:repository => @repo,
         
     | 
| 
      
 111 
     | 
    
         
            +
                                               :repo_dir => @download_repo_path,
         
     | 
| 
       110 
112 
     | 
    
         
             
                                               :scanners => [RightScraper::Scanners::CookbookMetadata,
         
     | 
| 
       111 
113 
     | 
    
         
             
                                                             RightScraper::Scanners::CookbookManifest,
         
     | 
| 
       112 
     | 
    
         
            -
                                                             RightScraper::Scanners:: 
     | 
| 
      
 114 
     | 
    
         
            +
                                                             RightScraper::Scanners::CookbookS3Upload],
         
     | 
| 
       113 
115 
     | 
    
         
             
                                               :s3_key => ENV['AMAZON_ACCESS_KEY_ID'],
         
     | 
| 
       114 
116 
     | 
    
         
             
                                               :s3_secret => ENV['AMAZON_SECRET_ACCESS_KEY'],
         
     | 
| 
       115 
117 
     | 
    
         
             
                                               :s3_bucket => bucket_name,
         
     | 
| 
         @@ -128,7 +130,7 @@ describe RightScraper::Scanners::CookbookS3Upload do 
     | 
|
| 
       128 
130 
     | 
    
         | 
| 
       129 
131 
     | 
    
         
             
                context 'that has scraped' do
         
     | 
| 
       130 
132 
     | 
    
         
             
                  before(:each) do
         
     | 
| 
       131 
     | 
    
         
            -
                    @cookbook = @scraper. 
     | 
| 
      
 133 
     | 
    
         
            +
                    @cookbook = @scraper.next_resource
         
     | 
| 
       132 
134 
     | 
    
         
             
                    @cookbook.should_not be_nil
         
     | 
| 
       133 
135 
     | 
    
         
             
                  end
         
     | 
| 
       134 
136 
     | 
    
         | 
    
        data/spec/git/retriever_spec.rb
    CHANGED
    
    | 
         @@ -113,15 +113,17 @@ describe RightScraper::Retrievers::Git do 
     | 
|
| 
       113 
113 
     | 
    
         
             
                    include RightScraper::SpecHelpers::FromScratchScraping
         
     | 
| 
       114 
114 
     | 
    
         
             
                    include RightScraper::SpecHelpers::WorkflowScraping
         
     | 
| 
       115 
115 
     | 
    
         | 
| 
       116 
     | 
    
         
            -
                    it 'should  
     | 
| 
      
 116 
     | 
    
         
            +
                    it 'should see two workflows' do
         
     | 
| 
      
 117 
     | 
    
         
            +
                      @scraper.next_resource.should_not == nil
         
     | 
| 
       117 
118 
     | 
    
         
             
                      @scraper.next_resource.should_not == nil
         
     | 
| 
       118 
119 
     | 
    
         
             
                      @scraper.next_resource.should == nil
         
     | 
| 
       119 
120 
     | 
    
         
             
                    end
         
     | 
| 
       120 
121 
     | 
    
         | 
| 
       121 
122 
     | 
    
         
             
                    it 'should have the subworkflow in the manifest' do
         
     | 
| 
       122 
123 
     | 
    
         
             
                      workflow = @scraper.next_resource
         
     | 
| 
       123 
     | 
    
         
            -
                      workflow 
     | 
| 
       124 
     | 
    
         
            -
                      workflow.manifest["workflow. 
     | 
| 
      
 124 
     | 
    
         
            +
                      workflow = @scraper.next_resource
         
     | 
| 
      
 125 
     | 
    
         
            +
                      workflow.manifest["workflow.def"].should == "e687ad52d8fba8010a255e3c2a9e891264a24910"
         
     | 
| 
      
 126 
     | 
    
         
            +
                      workflow.manifest["workflow.meta"].should == "58060413e90f84add5b2dace3ba7e30d2689336f"
         
     | 
| 
       125 
127 
     | 
    
         
             
                    end
         
     | 
| 
       126 
128 
     | 
    
         
             
                  end
         
     | 
| 
       127 
129 
     | 
    
         | 
| 
         @@ -150,8 +152,30 @@ describe RightScraper::Retrievers::Git do 
     | 
|
| 
       150 
152 
     | 
    
         
             
                      end
         
     | 
| 
       151 
153 
     | 
    
         
             
                      scraped.should have(@workflow_places.size).repositories
         
     | 
| 
       152 
154 
     | 
    
         
             
                    end
         
     | 
| 
      
 155 
     | 
    
         
            +
                  end
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
      
 157 
     | 
    
         
            +
                  context 'with two-level deep workflows' do
         
     | 
| 
      
 158 
     | 
    
         
            +
                    before(:each) do
         
     | 
| 
      
 159 
     | 
    
         
            +
                      @workflow_places = [File.join(@helper.repo_path, "workflows", "first"),
         
     | 
| 
      
 160 
     | 
    
         
            +
                        File.join(@helper.repo_path, "workflows", "some_dir", "some_subdir", "second"),
         
     | 
| 
      
 161 
     | 
    
         
            +
                        File.join(@helper.repo_path, "workflows", "some_dir", "some_subdir", "third")]
         
     | 
| 
      
 162 
     | 
    
         
            +
                      @workflow_places.each {|place| secondary_workflow(place)}
         
     | 
| 
      
 163 
     | 
    
         
            +
                      @helper.commit_content("secondary workflows added")
         
     | 
| 
      
 164 
     | 
    
         
            +
                    end
         
     | 
| 
      
 165 
     | 
    
         
            +
             
     | 
| 
      
 166 
     | 
    
         
            +
                    include RightScraper::SpecHelpers::FromScratchScraping
         
     | 
| 
      
 167 
     | 
    
         
            +
                    include RightScraper::SpecHelpers::WorkflowScraping
         
     | 
| 
       153 
168 
     | 
    
         | 
| 
      
 169 
     | 
    
         
            +
                    it 'should scrape' do
         
     | 
| 
      
 170 
     | 
    
         
            +
                      @scraper.scrape
         
     | 
| 
      
 171 
     | 
    
         
            +
                      @scraper.resources.each do |res|
         
     | 
| 
      
 172 
     | 
    
         
            +
                        res.metadata_path.should_not be_nil
         
     | 
| 
      
 173 
     | 
    
         
            +
                        res.definition_path.should_not be_nil
         
     | 
| 
      
 174 
     | 
    
         
            +
                      end
         
     | 
| 
      
 175 
     | 
    
         
            +
                      @scraper.resources.size.should == @workflow_places.size + 1 # One in the root repo_path
         
     | 
| 
      
 176 
     | 
    
         
            +
                    end
         
     | 
| 
       154 
177 
     | 
    
         
             
                  end
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
       155 
179 
     | 
    
         
             
                end
         
     | 
| 
       156 
180 
     | 
    
         | 
| 
       157 
181 
     | 
    
         
             
                context 'of cookbooks' do
         
     | 
    
        data/spec/svn/retriever_spec.rb
    CHANGED
    
    | 
         @@ -40,12 +40,14 @@ describe RightScraper::Retrievers::Svn do 
     | 
|
| 
       40 
40 
     | 
    
         
             
                before(:each) do
         
     | 
| 
       41 
41 
     | 
    
         
             
                  pending "Not run unless REMOTE_USER and REMOTE_PASSWORD set" unless ENV['REMOTE_USER'] && ENV['REMOTE_PASSWORD']
         
     | 
| 
       42 
42 
     | 
    
         
             
                  url = 'https://wush.net/svn/rightscale/cookbooks_test/'
         
     | 
| 
      
 43 
     | 
    
         
            +
                  @helper = RightScraper::SvnRetrieverSpecHelper.new
         
     | 
| 
       43 
44 
     | 
    
         
             
                  @repo = RightScraper::Repositories::Base.from_hash(:display_name => 'wush',
         
     | 
| 
       44 
45 
     | 
    
         
             
                                                           :repo_type    => :svn,
         
     | 
| 
       45 
46 
     | 
    
         
             
                                                           :url          => url,
         
     | 
| 
       46 
47 
     | 
    
         
             
                                                           :first_credential => ENV['REMOTE_USER'],
         
     | 
| 
       47 
48 
     | 
    
         
             
                                                           :second_credential => ENV['REMOTE_PASSWORD'])
         
     | 
| 
       48 
49 
     | 
    
         
             
                  @retriever = @retriever_class.new(@repo, :max_bytes => 1024**2,
         
     | 
| 
      
 50 
     | 
    
         
            +
                                                           :basedir     => @helper.scraper_path,
         
     | 
| 
       49 
51 
     | 
    
         
             
                                                           :max_seconds => 20)
         
     | 
| 
       50 
52 
     | 
    
         
             
                end
         
     | 
| 
       51 
53 
     | 
    
         | 
| 
         @@ -61,17 +63,17 @@ describe RightScraper::Retrievers::Svn do 
     | 
|
| 
       61 
63 
     | 
    
         | 
| 
       62 
64 
     | 
    
         
             
                # quick_start not actually being a cookbook
         
     | 
| 
       63 
65 
     | 
    
         
             
                it 'should scrape 5 repositories' do
         
     | 
| 
      
 66 
     | 
    
         
            +
                  @retriever.retrieve
         
     | 
| 
      
 67 
     | 
    
         
            +
                  @scraper = RightScraper::Scrapers::Base.scraper(:kind            => :cookbook,
         
     | 
| 
      
 68 
     | 
    
         
            +
                                                                  :ignorable_paths => @retriever.ignorable_paths,
         
     | 
| 
      
 69 
     | 
    
         
            +
                                                                  :repo_dir        => @retriever.repo_dir,
         
     | 
| 
      
 70 
     | 
    
         
            +
                                                                  :repository      => @retriever.repository)
         
     | 
| 
       64 
71 
     | 
    
         
             
                  locations = Set.new
         
     | 
| 
       65 
72 
     | 
    
         
             
                  (1..5).each {|n|
         
     | 
| 
       66 
73 
     | 
    
         
             
                    cookbook = @scraper.next_resource
         
     | 
| 
       67 
74 
     | 
    
         
             
                    locations << cookbook.pos
         
     | 
| 
       68 
75 
     | 
    
         
             
                    cookbook.should_not == nil
         
     | 
| 
       69 
76 
     | 
    
         
             
                  }
         
     | 
| 
       70 
     | 
    
         
            -
                  @retriever.retrieve
         
     | 
| 
       71 
     | 
    
         
            -
                  @scraper = RightScraper::Scrapers::Base.scraper(:kind            => :cookbook,
         
     | 
| 
       72 
     | 
    
         
            -
                                                                  :ignorable_paths => @retriever.ignorable_paths,
         
     | 
| 
       73 
     | 
    
         
            -
                                                                  :repo_dir        => @retriever.repo_dir,
         
     | 
| 
       74 
     | 
    
         
            -
                                                                  :repository      => @retriever.repository)
         
     | 
| 
       75 
77 
     | 
    
         
             
                  @scraper.next_resource.should == nil
         
     | 
| 
       76 
78 
     | 
    
         
             
                  locations.should == Set.new(["cookbooks/app_rails",
         
     | 
| 
       77 
79 
     | 
    
         
             
                                               "cookbooks/db_mysql",
         
     | 
| 
         @@ -131,8 +133,11 @@ describe RightScraper::Retrievers::Svn do 
     | 
|
| 
       131 
133 
     | 
    
         
             
                  include RightScraper::SpecHelpers::CookbookScraping
         
     | 
| 
       132 
134 
     | 
    
         | 
| 
       133 
135 
     | 
    
         
             
                  it 'should scrape' do
         
     | 
| 
       134 
     | 
    
         
            -
                     
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
      
 136 
     | 
    
         
            +
                    scraped = []
         
     | 
| 
      
 137 
     | 
    
         
            +
                    while scrape = @scraper.next_resource
         
     | 
| 
      
 138 
     | 
    
         
            +
                      place = (@cookbook_places - scraped).detect {|place| File.join(@helper.repo_path, scrape.pos) == place}
         
     | 
| 
      
 139 
     | 
    
         
            +
                      scraped << place
         
     | 
| 
      
 140 
     | 
    
         
            +
                      check_resource scrape, :position => place[@helper.repo_path.length+1..-1]
         
     | 
| 
       136 
141 
     | 
    
         
             
                    end
         
     | 
| 
       137 
142 
     | 
    
         
             
                    scraped.should have(@cookbook_places.size).repositories
         
     | 
| 
       138 
143 
     | 
    
         
             
                  end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,13 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: right_scraper
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
               
     | 
| 
       5 
     | 
    
         
            -
               
     | 
| 
       6 
     | 
    
         
            -
              segments: 
         
     | 
| 
       7 
     | 
    
         
            -
              - 3
         
     | 
| 
       8 
     | 
    
         
            -
              - 0
         
     | 
| 
       9 
     | 
    
         
            -
              - 0
         
     | 
| 
       10 
     | 
    
         
            -
              version: 3.0.0
         
     | 
| 
      
 4 
     | 
    
         
            +
              prerelease: 
         
     | 
| 
      
 5 
     | 
    
         
            +
              version: 3.0.1
         
     | 
| 
       11 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       12 
7 
     | 
    
         
             
            authors: 
         
     | 
| 
       13 
8 
     | 
    
         
             
            - Graham Hughes
         
     | 
| 
         @@ -16,129 +11,96 @@ autorequire: 
     | 
|
| 
       16 
11 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       17 
12 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       18 
13 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
            date: 2011- 
     | 
| 
       20 
     | 
    
         
            -
            default_executable: 
         
     | 
| 
      
 14 
     | 
    
         
            +
            date: 2011-10-25 00:00:00 Z
         
     | 
| 
       21 
15 
     | 
    
         
             
            dependencies: 
         
     | 
| 
       22 
16 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       23 
     | 
    
         
            -
               
     | 
| 
      
 17 
     | 
    
         
            +
              name: json
         
     | 
| 
      
 18 
     | 
    
         
            +
              requirement: &id001 !ruby/object:Gem::Requirement 
         
     | 
| 
       24 
19 
     | 
    
         
             
                none: false
         
     | 
| 
       25 
20 
     | 
    
         
             
                requirements: 
         
     | 
| 
       26 
21 
     | 
    
         
             
                - - ">="
         
     | 
| 
       27 
22 
     | 
    
         
             
                  - !ruby/object:Gem::Version 
         
     | 
| 
       28 
     | 
    
         
            -
                    hash: 13
         
     | 
| 
       29 
     | 
    
         
            -
                    segments: 
         
     | 
| 
       30 
     | 
    
         
            -
                    - 1
         
     | 
| 
       31 
     | 
    
         
            -
                    - 4
         
     | 
| 
       32 
     | 
    
         
            -
                    - 5
         
     | 
| 
       33 
23 
     | 
    
         
             
                    version: 1.4.5
         
     | 
| 
       34 
     | 
    
         
            -
              requirement: *id001
         
     | 
| 
       35 
24 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       36 
     | 
    
         
            -
              name: json
         
     | 
| 
       37 
25 
     | 
    
         
             
              prerelease: false
         
     | 
| 
      
 26 
     | 
    
         
            +
              version_requirements: *id001
         
     | 
| 
       38 
27 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       39 
     | 
    
         
            -
               
     | 
| 
      
 28 
     | 
    
         
            +
              name: git
         
     | 
| 
      
 29 
     | 
    
         
            +
              requirement: &id002 !ruby/object:Gem::Requirement 
         
     | 
| 
       40 
30 
     | 
    
         
             
                none: false
         
     | 
| 
       41 
31 
     | 
    
         
             
                requirements: 
         
     | 
| 
       42 
32 
     | 
    
         
             
                - - ">="
         
     | 
| 
       43 
33 
     | 
    
         
             
                  - !ruby/object:Gem::Version 
         
     | 
| 
       44 
     | 
    
         
            -
                    hash: 21
         
     | 
| 
       45 
     | 
    
         
            -
                    segments: 
         
     | 
| 
       46 
     | 
    
         
            -
                    - 1
         
     | 
| 
       47 
     | 
    
         
            -
                    - 2
         
     | 
| 
       48 
     | 
    
         
            -
                    - 5
         
     | 
| 
       49 
34 
     | 
    
         
             
                    version: 1.2.5
         
     | 
| 
       50 
     | 
    
         
            -
              requirement: *id002
         
     | 
| 
       51 
35 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       52 
     | 
    
         
            -
              name: git
         
     | 
| 
       53 
36 
     | 
    
         
             
              prerelease: false
         
     | 
| 
      
 37 
     | 
    
         
            +
              version_requirements: *id002
         
     | 
| 
       54 
38 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       55 
     | 
    
         
            -
               
     | 
| 
      
 39 
     | 
    
         
            +
              name: libarchive
         
     | 
| 
      
 40 
     | 
    
         
            +
              requirement: &id003 !ruby/object:Gem::Requirement 
         
     | 
| 
       56 
41 
     | 
    
         
             
                none: false
         
     | 
| 
       57 
42 
     | 
    
         
             
                requirements: 
         
     | 
| 
       58 
43 
     | 
    
         
             
                - - ">="
         
     | 
| 
       59 
44 
     | 
    
         
             
                  - !ruby/object:Gem::Version 
         
     | 
| 
       60 
     | 
    
         
            -
                    hash: 25
         
     | 
| 
       61 
     | 
    
         
            -
                    segments: 
         
     | 
| 
       62 
     | 
    
         
            -
                    - 0
         
     | 
| 
       63 
     | 
    
         
            -
                    - 1
         
     | 
| 
       64 
     | 
    
         
            -
                    - 1
         
     | 
| 
       65 
45 
     | 
    
         
             
                    version: 0.1.1
         
     | 
| 
       66 
     | 
    
         
            -
              requirement: *id003
         
     | 
| 
       67 
46 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       68 
     | 
    
         
            -
              name: libarchive
         
     | 
| 
       69 
47 
     | 
    
         
             
              prerelease: false
         
     | 
| 
      
 48 
     | 
    
         
            +
              version_requirements: *id003
         
     | 
| 
       70 
49 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       71 
     | 
    
         
            -
               
     | 
| 
      
 50 
     | 
    
         
            +
              name: right_aws
         
     | 
| 
      
 51 
     | 
    
         
            +
              requirement: &id004 !ruby/object:Gem::Requirement 
         
     | 
| 
       72 
52 
     | 
    
         
             
                none: false
         
     | 
| 
       73 
53 
     | 
    
         
             
                requirements: 
         
     | 
| 
       74 
54 
     | 
    
         
             
                - - ">="
         
     | 
| 
       75 
55 
     | 
    
         
             
                  - !ruby/object:Gem::Version 
         
     | 
| 
       76 
     | 
    
         
            -
                    hash: 3
         
     | 
| 
       77 
     | 
    
         
            -
                    segments: 
         
     | 
| 
       78 
     | 
    
         
            -
                    - 2
         
     | 
| 
       79 
     | 
    
         
            -
                    - 0
         
     | 
| 
       80 
56 
     | 
    
         
             
                    version: "2.0"
         
     | 
| 
       81 
     | 
    
         
            -
              requirement: *id004
         
     | 
| 
       82 
57 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       83 
     | 
    
         
            -
              name: right_aws
         
     | 
| 
       84 
58 
     | 
    
         
             
              prerelease: false
         
     | 
| 
      
 59 
     | 
    
         
            +
              version_requirements: *id004
         
     | 
| 
       85 
60 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       86 
     | 
    
         
            -
               
     | 
| 
      
 61 
     | 
    
         
            +
              name: process_watcher
         
     | 
| 
      
 62 
     | 
    
         
            +
              requirement: &id005 !ruby/object:Gem::Requirement 
         
     | 
| 
       87 
63 
     | 
    
         
             
                none: false
         
     | 
| 
       88 
64 
     | 
    
         
             
                requirements: 
         
     | 
| 
       89 
65 
     | 
    
         
             
                - - ~>
         
     | 
| 
       90 
66 
     | 
    
         
             
                  - !ruby/object:Gem::Version 
         
     | 
| 
       91 
     | 
    
         
            -
                    hash: 13
         
     | 
| 
       92 
     | 
    
         
            -
                    segments: 
         
     | 
| 
       93 
     | 
    
         
            -
                    - 0
         
     | 
| 
       94 
     | 
    
         
            -
                    - 3
         
     | 
| 
       95 
67 
     | 
    
         
             
                    version: "0.3"
         
     | 
| 
       96 
     | 
    
         
            -
              requirement: *id005
         
     | 
| 
       97 
68 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       98 
     | 
    
         
            -
              name: process_watcher
         
     | 
| 
       99 
69 
     | 
    
         
             
              prerelease: false
         
     | 
| 
      
 70 
     | 
    
         
            +
              version_requirements: *id005
         
     | 
| 
       100 
71 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       101 
     | 
    
         
            -
               
     | 
| 
      
 72 
     | 
    
         
            +
              name: rspec
         
     | 
| 
      
 73 
     | 
    
         
            +
              requirement: &id006 !ruby/object:Gem::Requirement 
         
     | 
| 
       102 
74 
     | 
    
         
             
                none: false
         
     | 
| 
       103 
75 
     | 
    
         
             
                requirements: 
         
     | 
| 
       104 
76 
     | 
    
         
             
                - - ">="
         
     | 
| 
       105 
77 
     | 
    
         
             
                  - !ruby/object:Gem::Version 
         
     | 
| 
       106 
     | 
    
         
            -
                    hash: 3
         
     | 
| 
       107 
     | 
    
         
            -
                    segments: 
         
     | 
| 
       108 
     | 
    
         
            -
                    - 0
         
     | 
| 
       109 
78 
     | 
    
         
             
                    version: "0"
         
     | 
| 
       110 
     | 
    
         
            -
              requirement: *id006
         
     | 
| 
       111 
79 
     | 
    
         
             
              type: :development
         
     | 
| 
       112 
     | 
    
         
            -
              name: rspec
         
     | 
| 
       113 
80 
     | 
    
         
             
              prerelease: false
         
     | 
| 
      
 81 
     | 
    
         
            +
              version_requirements: *id006
         
     | 
| 
       114 
82 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       115 
     | 
    
         
            -
               
     | 
| 
      
 83 
     | 
    
         
            +
              name: flexmock
         
     | 
| 
      
 84 
     | 
    
         
            +
              requirement: &id007 !ruby/object:Gem::Requirement 
         
     | 
| 
       116 
85 
     | 
    
         
             
                none: false
         
     | 
| 
       117 
86 
     | 
    
         
             
                requirements: 
         
     | 
| 
       118 
87 
     | 
    
         
             
                - - ">="
         
     | 
| 
       119 
88 
     | 
    
         
             
                  - !ruby/object:Gem::Version 
         
     | 
| 
       120 
     | 
    
         
            -
                    hash: 3
         
     | 
| 
       121 
     | 
    
         
            -
                    segments: 
         
     | 
| 
       122 
     | 
    
         
            -
                    - 0
         
     | 
| 
       123 
89 
     | 
    
         
             
                    version: "0"
         
     | 
| 
       124 
     | 
    
         
            -
              requirement: *id007
         
     | 
| 
       125 
90 
     | 
    
         
             
              type: :development
         
     | 
| 
       126 
     | 
    
         
            -
              name: flexmock
         
     | 
| 
       127 
91 
     | 
    
         
             
              prerelease: false
         
     | 
| 
      
 92 
     | 
    
         
            +
              version_requirements: *id007
         
     | 
| 
       128 
93 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       129 
     | 
    
         
            -
               
     | 
| 
      
 94 
     | 
    
         
            +
              name: rtags
         
     | 
| 
      
 95 
     | 
    
         
            +
              requirement: &id008 !ruby/object:Gem::Requirement 
         
     | 
| 
       130 
96 
     | 
    
         
             
                none: false
         
     | 
| 
       131 
97 
     | 
    
         
             
                requirements: 
         
     | 
| 
       132 
98 
     | 
    
         
             
                - - ">="
         
     | 
| 
       133 
99 
     | 
    
         
             
                  - !ruby/object:Gem::Version 
         
     | 
| 
       134 
     | 
    
         
            -
                    hash: 3
         
     | 
| 
       135 
     | 
    
         
            -
                    segments: 
         
     | 
| 
       136 
     | 
    
         
            -
                    - 0
         
     | 
| 
       137 
100 
     | 
    
         
             
                    version: "0"
         
     | 
| 
       138 
     | 
    
         
            -
              requirement: *id008
         
     | 
| 
       139 
101 
     | 
    
         
             
              type: :development
         
     | 
| 
       140 
     | 
    
         
            -
              name: rtags
         
     | 
| 
       141 
102 
     | 
    
         
             
              prerelease: false
         
     | 
| 
      
 103 
     | 
    
         
            +
              version_requirements: *id008
         
     | 
| 
       142 
104 
     | 
    
         
             
            description: "  RightScraper provides a simple interface to download and keep local copies of remote\n  repositories up-to-date using the following protocols:\n    * git: RightScraper will clone then pull repos from git\n    * SVN: RightScraper will checkout then update SVN repositories\n    * tarballs: RightScraper will download, optionally uncompress and expand a given tar file\n  On top of retrieving remote repositories, right_scraper also include \"scrapers\" that\n  will analyze the repository content and instantiate \"resources\" as a result. Currently\n  supported resources are Chef cookbooks and RightScale workflow definitions.\n"
         
     | 
| 
       143 
105 
     | 
    
         
             
            email: raphael@rightscale.com
         
     | 
| 
       144 
106 
     | 
    
         
             
            executables: []
         
     | 
| 
         @@ -225,7 +187,6 @@ files: 
     | 
|
| 
       225 
187 
     | 
    
         
             
            - spec/svn/svn_retriever_spec_helper.rb
         
     | 
| 
       226 
188 
     | 
    
         
             
            - spec/svn/url_spec.rb
         
     | 
| 
       227 
189 
     | 
    
         
             
            - spec/url_spec.rb
         
     | 
| 
       228 
     | 
    
         
            -
            has_rdoc: true
         
     | 
| 
       229 
190 
     | 
    
         
             
            homepage: https://github.com/rightscale/right_scraper
         
     | 
| 
       230 
191 
     | 
    
         
             
            licenses: []
         
     | 
| 
       231 
192 
     | 
    
         | 
| 
         @@ -242,18 +203,13 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       242 
203 
     | 
    
         
             
              requirements: 
         
     | 
| 
       243 
204 
     | 
    
         
             
              - - ">="
         
     | 
| 
       244 
205 
     | 
    
         
             
                - !ruby/object:Gem::Version 
         
     | 
| 
       245 
     | 
    
         
            -
                  hash: 57
         
     | 
| 
       246 
     | 
    
         
            -
                  segments: 
         
     | 
| 
       247 
     | 
    
         
            -
                  - 1
         
     | 
| 
       248 
     | 
    
         
            -
                  - 8
         
     | 
| 
       249 
     | 
    
         
            -
                  - 7
         
     | 
| 
       250 
206 
     | 
    
         
             
                  version: 1.8.7
         
     | 
| 
       251 
207 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement 
         
     | 
| 
       252 
208 
     | 
    
         
             
              none: false
         
     | 
| 
       253 
209 
     | 
    
         
             
              requirements: 
         
     | 
| 
       254 
210 
     | 
    
         
             
              - - ">="
         
     | 
| 
       255 
211 
     | 
    
         
             
                - !ruby/object:Gem::Version 
         
     | 
| 
       256 
     | 
    
         
            -
                  hash:  
     | 
| 
      
 212 
     | 
    
         
            +
                  hash: 1773174315538447853
         
     | 
| 
       257 
213 
     | 
    
         
             
                  segments: 
         
     | 
| 
       258 
214 
     | 
    
         
             
                  - 0
         
     | 
| 
       259 
215 
     | 
    
         
             
                  version: "0"
         
     | 
| 
         @@ -262,7 +218,7 @@ requirements: 
     | 
|
| 
       262 
218 
     | 
    
         
             
            - curl command line client
         
     | 
| 
       263 
219 
     | 
    
         
             
            - Subversion command line client
         
     | 
| 
       264 
220 
     | 
    
         
             
            rubyforge_project: right_scraper
         
     | 
| 
       265 
     | 
    
         
            -
            rubygems_version: 1. 
     | 
| 
      
 221 
     | 
    
         
            +
            rubygems_version: 1.8.10
         
     | 
| 
       266 
222 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       267 
223 
     | 
    
         
             
            specification_version: 3
         
     | 
| 
       268 
224 
     | 
    
         
             
            summary: Download and update remote repositories
         
     |