romloader 0.0.0 → 1.0.0
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.
- checksums.yaml +4 -4
 - data/README.md +5 -0
 - data/lib/romloader.rb +17 -3
 - data/lib/romloader/archive_extractor.rb +56 -0
 - data/lib/romloader/freeroms_scraper.rb +9 -31
 - data/lib/romloader/game_rom.rb +8 -33
 - data/lib/romloader/game_system.rb +9 -49
 - data/lib/romloader/romloader_cli.rb +43 -103
 - data/lib/romloader/scraping_error/errors.rb +8 -0
 - metadata +46 -3
 - data/lib/romloader/scraping_error/no_element_found.rb +0 -7
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: eb0581eebe31d910a5866868c6767f86e59f90c1
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: b2ba39f821db26cbad47104292155e813a772d03
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: c8fef42a55aff86ac56bf4626c8d442d1d22399068b3ea2e156575c9dcca6a6c1d69e3fd686ab0d61f3b28e3de1e94756242c0ef766290ae9088e991153d991b
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 17d045707749160b27a5c425ed247ef69f75dde87253731bed178d264ff6329f4d21bf61c03e593b55563dd86705a7f6029d29173d9306e338ea872ae587f6ac
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -25,6 +25,11 @@ This will download any dependencies for development. Rspec is among the dependen 
     | 
|
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
            Bug reports and pull requests are welcome on GitHub at https://github.com/jinstrider2000/romloader-cli-gem.
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
      
 28 
     | 
    
         
            +
            ## Version Changes
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            v. 1.0: Changed the namespacing of classes, added zip/7-zip extraction and rom download directory management. Also, added the ability to open the newly downloaded game from the command line (requires a emulator)
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            v. 0.0: Basic rom listing from Freeroms.com, and rom download feature
         
     | 
| 
       28 
33 
     | 
    
         | 
| 
       29 
34 
     | 
    
         
             
            ## License
         
     | 
| 
       30 
35 
     | 
    
         | 
    
        data/lib/romloader.rb
    CHANGED
    
    | 
         @@ -1,7 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module RomLoader
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            end
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'open-uri'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'nokogiri'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'cgi'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'zip'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'seven_zip_ruby'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'fileutils'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require_relative 'romloader/game_rom.rb'
         
     | 
| 
      
 12 
     | 
    
         
            +
            require_relative 'romloader/game_system.rb'
         
     | 
| 
      
 13 
     | 
    
         
            +
            require_relative 'romloader/archive_extractor.rb'
         
     | 
| 
      
 14 
     | 
    
         
            +
            require_relative 'romloader/freeroms_scraper.rb'
         
     | 
| 
      
 15 
     | 
    
         
            +
            require_relative 'romloader/scraping_error/errors.rb'
         
     | 
| 
       1 
16 
     | 
    
         
             
            require_relative 'romloader/romloader_cli.rb'
         
     | 
| 
       2 
17 
     | 
    
         | 
| 
       3 
18 
     | 
    
         
             
            def run
         
     | 
| 
       4 
19 
     | 
    
         
             
              Dir.mkdir(File.join(Dir.home,"videogame_roms")) unless Dir.exist?(File.join(Dir.home,"videogame_roms"))
         
     | 
| 
       5 
     | 
    
         
            -
               
     | 
| 
       6 
     | 
    
         
            -
            end
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
      
 20 
     | 
    
         
            +
              RomLoader::RomLoaderCli.new.start
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
             
     | 
| 
      
 2 
     | 
    
         
            +
            class RomLoader::ArchiveExtractor
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              #Extracts zip or 7-zip rom files, manages the extracted dirs, then deletes archive files
         
     | 
| 
      
 5 
     | 
    
         
            +
              def self.extract(dir,game_obj)
         
     | 
| 
      
 6 
     | 
    
         
            +
                file_or_dir_to_open = ""
         
     | 
| 
      
 7 
     | 
    
         
            +
                /(?<=\().+(?=\))/.match(game_obj.system.name) ? system_dir = /(?<=\().+(?=\))/.match(game_obj.system.name)[0] : system_dir = nil
         
     | 
| 
      
 8 
     | 
    
         
            +
                system_dir ||= game_obj.system.name
         
     | 
| 
      
 9 
     | 
    
         
            +
                system_dir = system_dir.rstrip.gsub(/[[[:space:]]\/]/, "_").downcase
         
     | 
| 
      
 10 
     | 
    
         
            +
                Dir.mkdir(File.join(Dir.home,"videogame_roms",system_dir)) unless Dir.exist?(File.join(Dir.home,"videogame_roms",system_dir))
         
     | 
| 
      
 11 
     | 
    
         
            +
                
         
     | 
| 
      
 12 
     | 
    
         
            +
                if game_obj.system.name != "MAME"
         
     | 
| 
      
 13 
     | 
    
         
            +
                  puts "Extracting #{game_obj.filename}"
         
     | 
| 
      
 14 
     | 
    
         
            +
                  if game_obj.file_ext == ".zip"
         
     | 
| 
      
 15 
     | 
    
         
            +
                    Zip::File.open(dir) do |zip_archive|
         
     | 
| 
      
 16 
     | 
    
         
            +
                      zip_archive.glob("*htm").each { |entry| zip_archive.remove(entry) }
         
     | 
| 
      
 17 
     | 
    
         
            +
                      Dir.mkdir(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0])) if zip_archive.size > 1 && !Dir.exist?(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0]))
         
     | 
| 
      
 18 
     | 
    
         
            +
                      zip_archive.each_entry do |rom|
         
     | 
| 
      
 19 
     | 
    
         
            +
                        if Dir.exist?(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0]))
         
     | 
| 
      
 20 
     | 
    
         
            +
                          rom.extract(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0],rom.name)) unless File.exist?(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0],rom.name))
         
     | 
| 
      
 21 
     | 
    
         
            +
                        else
         
     | 
| 
      
 22 
     | 
    
         
            +
                          rom.extract(File.join(Dir.home,"videogame_roms",system_dir,rom.name)) unless File.exist?(File.join(Dir.home,"videogame_roms",system_dir,rom.name))
         
     | 
| 
      
 23 
     | 
    
         
            +
                        end
         
     | 
| 
      
 24 
     | 
    
         
            +
                        zip_archive.size == 1 ? file_or_dir_to_open = File.join(Dir.home,"videogame_roms",system_dir,"\"#{rom.name}\"") : file_or_dir_to_open = File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0])
         
     | 
| 
      
 25 
     | 
    
         
            +
                      end
         
     | 
| 
      
 26 
     | 
    
         
            +
                    end
         
     | 
| 
      
 27 
     | 
    
         
            +
                  else
         
     | 
| 
      
 28 
     | 
    
         
            +
                    File.open(dir, "rb") do |seven_zip_archive|
         
     | 
| 
      
 29 
     | 
    
         
            +
                      Dir.mkdir(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0])) unless Dir.exist?(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0]))
         
     | 
| 
      
 30 
     | 
    
         
            +
                      SevenZipRuby::Reader.open(seven_zip_archive) do |szr|
         
     | 
| 
      
 31 
     | 
    
         
            +
                        files_already_in_dir = Dir.entries(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0]))
         
     | 
| 
      
 32 
     | 
    
         
            +
                        if files_already_in_dir.size > 0
         
     | 
| 
      
 33 
     | 
    
         
            +
                          files_to_be_extracted = szr.entries.select do |entry|
         
     | 
| 
      
 34 
     | 
    
         
            +
                            file_match = /(file, |dir, |anti, )[.[^\.]]+\..+(?=>)/.match(entry.inspect)
         
     | 
| 
      
 35 
     | 
    
         
            +
                            file_match ? file_name = file_match[0].split(file_match[1])[1] : file_name = nil
         
     | 
| 
      
 36 
     | 
    
         
            +
                            !files_already_in_dir.any? { |file|  file == file_name || file_name =~ /\.htm/}
         
     | 
| 
      
 37 
     | 
    
         
            +
                          end
         
     | 
| 
      
 38 
     | 
    
         
            +
                          szr.extract(files_to_be_extracted, File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0]))
         
     | 
| 
      
 39 
     | 
    
         
            +
                        else
         
     | 
| 
      
 40 
     | 
    
         
            +
                          szr.extract_all(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0]))
         
     | 
| 
      
 41 
     | 
    
         
            +
                        end
         
     | 
| 
      
 42 
     | 
    
         
            +
                      end
         
     | 
| 
      
 43 
     | 
    
         
            +
                      Dir.chdir(File.join(Dir.home,"videogame_roms",system_dir,game_obj.filename.split(game_obj.file_ext)[0])) do
         
     | 
| 
      
 44 
     | 
    
         
            +
                        Dir.entries(".").size == 1 ? file_or_dir_to_open = File.join(Dir.pwd,"\"#{Dir.entries(".").first}\"") : file_or_dir_to_open = Dir.pwd
         
     | 
| 
      
 45 
     | 
    
         
            +
                      end
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
                  File.delete(dir)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  file_or_dir_to_open
         
     | 
| 
      
 50 
     | 
    
         
            +
                else
         
     | 
| 
      
 51 
     | 
    
         
            +
                  FileUtils.move "#{dir}", "#{File.join(Dir.home,"videogame_roms",system_dir)}"
         
     | 
| 
      
 52 
     | 
    
         
            +
                  file_or_dir_to_open = File.join(Dir.home,"videogame_roms",system_dir)
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
              
         
     | 
| 
      
 56 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,20 +1,9 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'open-uri'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'nokogiri'
         
     | 
| 
       3 
     | 
    
         
            -
            require 'cgi'
         
     | 
| 
       4 
1 
     | 
    
         | 
| 
       5 
2 
     | 
    
         
             
            # The class which facilitates scraping freeroms.com. Uses the nokogiri gem to scrape the site
         
     | 
| 
       6 
     | 
    
         
            -
            class FreeromsScraper
         
     | 
| 
       7 
     | 
    
         
            -
               
     | 
| 
       8 
     | 
    
         
            -
              #
         
     | 
| 
       9 
     | 
    
         
            -
              # Instance Variables: none
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
              # Purpose: To retrieve the names and main rom urls of the game systems currently begin served by freeroms.com.  Returns this information in the form of an array of hashes
         
     | 
| 
      
 3 
     | 
    
         
            +
            class RomLoader::FreeromsScraper
         
     | 
| 
      
 4 
     | 
    
         
            +
              
         
     | 
| 
       12 
5 
     | 
    
         
             
              def self.system_scrape(url)
         
     | 
| 
       13 
     | 
    
         
            -
                 
     | 
| 
       14 
     | 
    
         
            -
                # => 1. url (String): Contains the url "http://freeroms.com"
         
     | 
| 
       15 
     | 
    
         
            -
                #
         
     | 
| 
       16 
     | 
    
         
            -
                # Return:
         
     | 
| 
       17 
     | 
    
         
            -
                # => Array<Hash>
         
     | 
| 
      
 6 
     | 
    
         
            +
                
         
     | 
| 
       18 
7 
     | 
    
         
             
                system_list = Nokogiri::HTML(open(url)).css("dt.leftside > a")
         
     | 
| 
       19 
8 
     | 
    
         
             
                [].tap do |game_system|
         
     | 
| 
       20 
9 
     | 
    
         
             
                  system_list.each do |system_info|
         
     | 
| 
         @@ -32,13 +21,9 @@ class FreeromsScraper 
     | 
|
| 
       32 
21 
     | 
    
         
             
                end
         
     | 
| 
       33 
22 
     | 
    
         
             
              end
         
     | 
| 
       34 
23 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
              #  
     | 
| 
      
 24 
     | 
    
         
            +
              # To retrieve the names and main rom urls of the individual games currently begin served by freeroms.com.  Returns this information in the form of an array of hashes
         
     | 
| 
       36 
25 
     | 
    
         
             
              def self.rom_scrape(url)
         
     | 
| 
       37 
     | 
    
         
            -
                 
     | 
| 
       38 
     | 
    
         
            -
                # => 1. url (String): Contains the url for each game
         
     | 
| 
       39 
     | 
    
         
            -
                #
         
     | 
| 
       40 
     | 
    
         
            -
                # Return:
         
     | 
| 
       41 
     | 
    
         
            -
                # => Array<Hash>
         
     | 
| 
      
 26 
     | 
    
         
            +
                
         
     | 
| 
       42 
27 
     | 
    
         
             
                game_list = Nokogiri::HTML(open(url)).css("tr[class^=\"game\"] > td[align=\"left\"]")
         
     | 
| 
       43 
28 
     | 
    
         
             
                [].tap do |rom_list|
         
     | 
| 
       44 
29 
     | 
    
         
             
                  game_list.each do |game_info|
         
     | 
| 
         @@ -58,13 +43,9 @@ class FreeromsScraper 
     | 
|
| 
       58 
43 
     | 
    
         
             
                end
         
     | 
| 
       59 
44 
     | 
    
         
             
              end
         
     | 
| 
       60 
45 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
              #  
     | 
| 
      
 46 
     | 
    
         
            +
              # To retrieve the detailed information of individual games currently begin served by freeroms.com.  Returns this information in the form of a hash
         
     | 
| 
       62 
47 
     | 
    
         
             
              def self.rom_details(url)
         
     | 
| 
       63 
     | 
    
         
            -
                 
     | 
| 
       64 
     | 
    
         
            -
                # => 1. url (String): Contains the url for each game
         
     | 
| 
       65 
     | 
    
         
            -
                #
         
     | 
| 
       66 
     | 
    
         
            -
                # Return:
         
     | 
| 
       67 
     | 
    
         
            -
                # => Hash
         
     | 
| 
      
 48 
     | 
    
         
            +
                
         
     | 
| 
       68 
49 
     | 
    
         
             
                direct_download = Nokogiri::HTML(open(url))
         
     | 
| 
       69 
50 
     | 
    
         
             
                {}.tap do |game|
         
     | 
| 
       70 
51 
     | 
    
         
             
                  unless direct_download.css("td#romss > script").empty?
         
     | 
| 
         @@ -77,6 +58,7 @@ class FreeromsScraper 
     | 
|
| 
       77 
58 
     | 
    
         
             
                      if game_url
         
     | 
| 
       78 
59 
     | 
    
         
             
                        game[:download_url] = game_url[0]
         
     | 
| 
       79 
60 
     | 
    
         
             
                        game[:file_ext] = game_url[1]
         
     | 
| 
      
 61 
     | 
    
         
            +
                        game[:filename] = /[.[^\/]]+(\.zip|\.7z)\Z/.match(game_url[0])[0]
         
     | 
| 
       80 
62 
     | 
    
         
             
                        begin
         
     | 
| 
       81 
63 
     | 
    
         
             
                          game[:size] = direct_download.css("td#rom + td[colspan=\"2\"]").first.children.first.text.strip
         
     | 
| 
       82 
64 
     | 
    
         
             
                        rescue NoMethodError
         
     | 
| 
         @@ -90,11 +72,7 @@ class FreeromsScraper 
     | 
|
| 
       90 
72 
     | 
    
         | 
| 
       91 
73 
     | 
    
         
             
              # Purpose: To retrieve the letter indices for the roms of the game systems currently begin served by freeroms.com.  Returns this information in the form of a hash
         
     | 
| 
       92 
74 
     | 
    
         
             
              def self.rom_index_scrape(url)
         
     | 
| 
       93 
     | 
    
         
            -
                 
     | 
| 
       94 
     | 
    
         
            -
                # => 1. url (String): Contains the url for the letter indices
         
     | 
| 
       95 
     | 
    
         
            -
                #
         
     | 
| 
       96 
     | 
    
         
            -
                # Return:
         
     | 
| 
       97 
     | 
    
         
            -
                # => Hash
         
     | 
| 
      
 75 
     | 
    
         
            +
                
         
     | 
| 
       98 
76 
     | 
    
         
             
                rom_letter_list = Nokogiri::HTML(open(url)).css("tr.letters > td[align=\"center\"] > font > a")
         
     | 
| 
       99 
77 
     | 
    
         
             
                {}.tap do |letter_hash|
         
     | 
| 
       100 
78 
     | 
    
         
             
                  rom_letter_list.each do |letter_list|
         
     | 
    
        data/lib/romloader/game_rom.rb
    CHANGED
    
    | 
         @@ -1,52 +1,27 @@ 
     | 
|
| 
       1 
1 
     | 
    
         | 
| 
       2 
2 
     | 
    
         
             
            # The class whose instances represent an individual game rom (e.g. Chrono Trigger object)
         
     | 
| 
       3 
     | 
    
         
            -
            class GameRom
         
     | 
| 
       4 
     | 
    
         
            -
               
     | 
| 
       5 
     | 
    
         
            -
              #
         
     | 
| 
       6 
     | 
    
         
            -
              # Instance Variables:
         
     | 
| 
       7 
     | 
    
         
            -
              # => 1. name (String): Contains the system's name (e.g. "Sega Genesis")
         
     | 
| 
       8 
     | 
    
         
            -
              # => 2. download_url (String): Contains a string with the url to download the game (e.g. "http://download.freeroms.com/genesis/a_roms/altered_beast.zip") 
         
     | 
| 
       9 
     | 
    
         
            -
              # => 3. rom_detail_url (String): Contains a string with the url to details of the game
         
     | 
| 
       10 
     | 
    
         
            -
              # => 4. size (String): Contains a string with the size of download, as published on freeroms.com
         
     | 
| 
       11 
     | 
    
         
            -
              # => 5. file_ext (String): Contains a string with the download file index (e.g. ".zip")
         
     | 
| 
       12 
     | 
    
         
            -
              # => 6. system (GameSystem): Points to the GameSystem object that contains this GameRom instance 
         
     | 
| 
      
 3 
     | 
    
         
            +
            class RomLoader::GameRom
         
     | 
| 
      
 4 
     | 
    
         
            +
              
         
     | 
| 
       13 
5 
     | 
    
         
             
              attr_accessor :name, :system
         
     | 
| 
       14 
     | 
    
         
            -
              attr_reader :rom_detail_url ,:download_url, :size, :file_ext
         
     | 
| 
      
 6 
     | 
    
         
            +
              attr_reader :rom_detail_url ,:download_url, :size, :file_ext, :filename
         
     | 
| 
       15 
7 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
              #  
     | 
| 
      
 8 
     | 
    
         
            +
              # Create individual game rom objects from information scraped from freeroms.com, and sets the required name and rom_detail_url instance variables
         
     | 
| 
       17 
9 
     | 
    
         
             
              def initialize(name:, rom_detail_url:)
         
     | 
| 
       18 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       19 
     | 
    
         
            -
                # => 1. name (String): Contains the game's name (e.g. "Super Mario Bros 3")
         
     | 
| 
       20 
     | 
    
         
            -
                # => 2. rom_detail_url (String): Contains a string with the url to details of the game
         
     | 
| 
       21 
     | 
    
         
            -
                #
         
     | 
| 
       22 
     | 
    
         
            -
                # Return:
         
     | 
| 
       23 
     | 
    
         
            -
                # => GameRom object
         
     | 
| 
       24 
10 
     | 
    
         
             
                @name = name
         
     | 
| 
       25 
11 
     | 
    
         
             
                @rom_detail_url = rom_detail_url
         
     | 
| 
       26 
12 
     | 
    
         
             
              end
         
     | 
| 
       27 
13 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
              #  
     | 
| 
      
 14 
     | 
    
         
            +
              # Creates an array of GameRom objects from an array
         
     | 
| 
       29 
15 
     | 
    
         
             
              def self.create_collection(game_array)
         
     | 
| 
       30 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       31 
     | 
    
         
            -
                # => 1. game_array (Array<Hash>): Contains the game's information
         
     | 
| 
       32 
     | 
    
         
            -
                #
         
     | 
| 
       33 
     | 
    
         
            -
                # Return:
         
     | 
| 
       34 
     | 
    
         
            -
                # => Array<GameRom>
         
     | 
| 
       35 
16 
     | 
    
         
             
                game_array.collect {|game_details| self.new(game_details)}    
         
     | 
| 
       36 
17 
     | 
    
         
             
              end
         
     | 
| 
       37 
18 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
              #  
     | 
| 
       39 
     | 
    
         
            -
              def set_rom_details(download_url: nil, size: nil, file_ext: nil)
         
     | 
| 
       40 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       41 
     | 
    
         
            -
                # => 1. download_url [optional] (String): Contains a string with the url to download the game
         
     | 
| 
       42 
     | 
    
         
            -
                # => 2. size [optional] (String): Contains a string with the size of download, as published on freeroms.com
         
     | 
| 
       43 
     | 
    
         
            -
                # => 3. file_ext (String): Contains a string with the download file index (e.g. ".zip")
         
     | 
| 
       44 
     | 
    
         
            -
                #
         
     | 
| 
       45 
     | 
    
         
            -
                # Return:
         
     | 
| 
       46 
     | 
    
         
            -
                # => nil
         
     | 
| 
      
 19 
     | 
    
         
            +
              # Sets all additional, optional rom details
         
     | 
| 
      
 20 
     | 
    
         
            +
              def set_rom_details(download_url: nil, size: nil, file_ext: nil, filename: nil)
         
     | 
| 
       47 
21 
     | 
    
         
             
                @download_url = download_url
         
     | 
| 
       48 
22 
     | 
    
         
             
                @size = size
         
     | 
| 
       49 
23 
     | 
    
         
             
                @file_ext = file_ext
         
     | 
| 
      
 24 
     | 
    
         
            +
                @filename = filename
         
     | 
| 
       50 
25 
     | 
    
         
             
                nil
         
     | 
| 
       51 
26 
     | 
    
         
             
              end
         
     | 
| 
       52 
27 
     | 
    
         | 
| 
         @@ -1,28 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         | 
| 
       2 
2 
     | 
    
         
             
            # The class whose instances represent an individual game system (e.g. Sega Genesis object) 
         
     | 
| 
       3 
     | 
    
         
            -
            class GameSystem
         
     | 
| 
       4 
     | 
    
         
            -
              # Class Variables:
         
     | 
| 
       5 
     | 
    
         
            -
              # => 1. all (Array<GameSystem>): Contains an array of all GameSystem objects that have been instantiated.
         
     | 
| 
       6 
     | 
    
         
            -
              #
         
     | 
| 
       7 
     | 
    
         
            -
              # Instance Variables:
         
     | 
| 
       8 
     | 
    
         
            -
              # => 1. name (String): Contains the system's name (e.g. "Sega Genesis")
         
     | 
| 
       9 
     | 
    
         
            -
              # => 2. rom_indices (Hash): Contains key/value pairs of a rom index letter and a url (e.g. {"A" => "http://freeroms.com/genesis_games_that_start_with_a.html"}) 
         
     | 
| 
       10 
     | 
    
         
            -
              # => 3. roms (Hash): Contains key/value pairs of a rom index letter and an array of GameRom objects (e.g. {"S" => [Sonic the Hedgehog, Streets of Rage,...], "T" => [...], etc})
         
     | 
| 
       11 
     | 
    
         
            -
              # => 4. rom_index_url (String): Contains the url that leads to the rom index for the given system on http://freeroms.com
         
     | 
| 
      
 3 
     | 
    
         
            +
            class RomLoader::GameSystem
         
     | 
| 
       12 
4 
     | 
    
         | 
| 
       13 
5 
     | 
    
         
             
              attr_accessor :name, :rom_index_url
         
     | 
| 
       14 
6 
     | 
    
         
             
              attr_writer :rom_indices
         
     | 
| 
       15 
7 
     | 
    
         | 
| 
       16 
8 
     | 
    
         
             
              @@all = []
         
     | 
| 
       17 
9 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
              #  
     | 
| 
      
 10 
     | 
    
         
            +
              # Create individual game system objects from information scraped from http://freeroms.com, sets all instance variables
         
     | 
| 
       19 
11 
     | 
    
         
             
              def initialize(name:, rom_index_url:)
         
     | 
| 
       20 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       21 
     | 
    
         
            -
                # => 1. name (String): Contains the system's name (e.g. "Sega Genesis")
         
     | 
| 
       22 
     | 
    
         
            -
                # => 2. rom_index_url (String): Contains the url that leads to the rom index for the given system on http://freeroms.com
         
     | 
| 
       23 
     | 
    
         
            -
                #
         
     | 
| 
       24 
     | 
    
         
            -
                # Return:
         
     | 
| 
       25 
     | 
    
         
            -
                # => GameSystem object
         
     | 
| 
       26 
12 
     | 
    
         
             
                @name = name
         
     | 
| 
       27 
13 
     | 
    
         
             
                @rom_index_url = rom_index_url
         
     | 
| 
       28 
14 
     | 
    
         
             
                @rom_indices = {}
         
     | 
| 
         @@ -30,61 +16,35 @@ class GameSystem 
     | 
|
| 
       30 
16 
     | 
    
         
             
                @@all << self
         
     | 
| 
       31 
17 
     | 
    
         
             
              end
         
     | 
| 
       32 
18 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
              #  
     | 
| 
      
 19 
     | 
    
         
            +
              # Creates multiple GameSystem objects from information scraped from http://freeroms.com
         
     | 
| 
       34 
20 
     | 
    
         
             
              def self.create_from_collection(system_array)
         
     | 
| 
       35 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       36 
     | 
    
         
            -
                # => 1. system_array (Array<Hash>): Contains an array of key/value pairs of the GameSystem instance variables and values (e.g. [{:name =>"NES"...},{:name => "SNES"..,},etc])
         
     | 
| 
       37 
     | 
    
         
            -
                #
         
     | 
| 
       38 
     | 
    
         
            -
                # Return:
         
     | 
| 
       39 
     | 
    
         
            -
                # => nil
         
     | 
| 
       40 
21 
     | 
    
         
             
                system_array.each { |system_details| self.new(system_details)}
         
     | 
| 
       41 
22 
     | 
    
         
             
                nil
         
     | 
| 
       42 
23 
     | 
    
         
             
              end
         
     | 
| 
       43 
24 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
              #  
     | 
| 
      
 25 
     | 
    
         
            +
              # Retrieves an array of all GameSystem objects
         
     | 
| 
       45 
26 
     | 
    
         
             
              def self.all
         
     | 
| 
       46 
     | 
    
         
            -
                # Arguments: None
         
     | 
| 
       47 
     | 
    
         
            -
                #
         
     | 
| 
       48 
     | 
    
         
            -
                # Return:
         
     | 
| 
       49 
     | 
    
         
            -
                # => Array<GameSystem>
         
     | 
| 
       50 
27 
     | 
    
         
             
                @@all    
         
     | 
| 
       51 
28 
     | 
    
         
             
              end
         
     | 
| 
       52 
29 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
              #  
     | 
| 
      
 30 
     | 
    
         
            +
              # Retrieves an array of all GameRom objects starting which the provided letter index (e.g. [Sonic the Hedgehog, Streets of Rage,...])
         
     | 
| 
       54 
31 
     | 
    
         
             
              def get_roms_by_letter(letter_index)
         
     | 
| 
       55 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       56 
     | 
    
         
            -
                # => 1. letter_index (String): Letter used as key to retrieve array
         
     | 
| 
       57 
     | 
    
         
            -
                # Return:
         
     | 
| 
       58 
     | 
    
         
            -
                # => Array<GameRom>
         
     | 
| 
       59 
32 
     | 
    
         
             
                @roms[letter_index]
         
     | 
| 
       60 
33 
     | 
    
         
             
              end
         
     | 
| 
       61 
34 
     | 
    
         | 
| 
       62 
     | 
    
         
            -
              #  
     | 
| 
      
 35 
     | 
    
         
            +
              # Retrieves an array of the indicies for the roms (i.e. ["A","B","C"...])
         
     | 
| 
       63 
36 
     | 
    
         
             
              def get_rom_indices
         
     | 
| 
       64 
     | 
    
         
            -
                # Arguments: None
         
     | 
| 
       65 
     | 
    
         
            -
                #
         
     | 
| 
       66 
     | 
    
         
            -
                # Return:
         
     | 
| 
       67 
     | 
    
         
            -
                # => Array<String>
         
     | 
| 
       68 
37 
     | 
    
         
             
                @rom_indices.keys
         
     | 
| 
       69 
38 
     | 
    
         
             
              end
         
     | 
| 
       70 
39 
     | 
    
         | 
| 
       71 
     | 
    
         
            -
              #  
     | 
| 
      
 40 
     | 
    
         
            +
              # Retrieves the url for roms of a particular letter index (e.g. "A" => "http://freeroms.com/genesis_games_that_start_with_a.html")
         
     | 
| 
       72 
41 
     | 
    
         
             
              def get_rom_collection_url(letter_index)
         
     | 
| 
       73 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       74 
     | 
    
         
            -
                # => 1. letter_index (String): Letter used as key to retrieve url
         
     | 
| 
       75 
     | 
    
         
            -
                # Return:
         
     | 
| 
       76 
     | 
    
         
            -
                # => String
         
     | 
| 
       77 
42 
     | 
    
         
             
                @rom_indices[letter_index]
         
     | 
| 
       78 
43 
     | 
    
         
             
              end
         
     | 
| 
       79 
44 
     | 
    
         | 
| 
       80 
     | 
    
         
            -
              #  
     | 
| 
      
 45 
     | 
    
         
            +
              # Add the game collection scraped from http://freeroms.com to the GameSystem object to the roms (Hash)
         
     | 
| 
       81 
46 
     | 
    
         
             
              def add_roms_to_collection_by_letter(letter_index, game_obj_array)
         
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
                # => 1. letter_index (String): Letter to be used as a key for the roms Hash
         
     | 
| 
       84 
     | 
    
         
            -
                # => 2. game_obj_array (Array<GameRom>): Contains array of GameRom objects (e.g. [Sonic the Hedgehog, Streets of Rage,...]
         
     | 
| 
       85 
     | 
    
         
            -
                #
         
     | 
| 
       86 
     | 
    
         
            -
                # Return:
         
     | 
| 
       87 
     | 
    
         
            -
                # => Array<GameRom>
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       88 
48 
     | 
    
         
             
                game_obj_array.each { |game| game.system = self }
         
     | 
| 
       89 
49 
     | 
    
         
             
                @roms[letter_index] = game_obj_array
         
     | 
| 
       90 
50 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,40 +1,24 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require_relative 'freeroms_scraper.rb'
         
     | 
| 
       2 
     | 
    
         
            -
            require_relative 'game_rom.rb'
         
     | 
| 
       3 
     | 
    
         
            -
            require_relative 'game_system.rb'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative 'scraping_error/no_element_found.rb'
         
     | 
| 
       5 
1 
     | 
    
         | 
| 
       6 
2 
     | 
    
         
             
            # The CLI class
         
     | 
| 
       7 
     | 
    
         
            -
            class  
     | 
| 
       8 
     | 
    
         
            -
              # Class Variables: none
         
     | 
| 
       9 
     | 
    
         
            -
              #
         
     | 
| 
       10 
     | 
    
         
            -
              # Instance Variables: none
         
     | 
| 
      
 3 
     | 
    
         
            +
            class RomLoader::RomLoaderCli
         
     | 
| 
       11 
4 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
              # Purpose: Instantiates a GameSystem collection from information scraped from http://freeroms.com
         
     | 
| 
       13 
5 
     | 
    
         
             
              def initialize
         
     | 
| 
       14 
     | 
    
         
            -
                 
     | 
| 
       15 
     | 
    
         
            -
                 
     | 
| 
       16 
     | 
    
         
            -
                # Return:
         
     | 
| 
       17 
     | 
    
         
            -
                # => RomloaderCli object
         
     | 
| 
       18 
     | 
    
         
            -
                GameSystem.create_from_collection(FreeromsScraper.system_scrape("http://freeroms.com"))
         
     | 
| 
       19 
     | 
    
         
            -
                raise ScrapingError::NoElementFound.exception("System index is currently unavailable. Exiting the program.") if GameSystem.all.size == 0
         
     | 
| 
      
 6 
     | 
    
         
            +
                RomLoader::GameSystem.create_from_collection(RomLoader::FreeromsScraper.system_scrape("http://freeroms.com"))
         
     | 
| 
      
 7 
     | 
    
         
            +
                raise RomLoader::ScrapingError::NoElementFound.exception("System index is currently unavailable. Exiting the program.") if RomLoader::GameSystem.all.size == 0
         
     | 
| 
       20 
8 
     | 
    
         
             
              end
         
     | 
| 
       21 
9 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
              #  
     | 
| 
      
 10 
     | 
    
         
            +
              # Starts the CLI, called in romloader.rb
         
     | 
| 
       23 
11 
     | 
    
         
             
              def start
         
     | 
| 
       24 
     | 
    
         
            -
                # Arguments: None
         
     | 
| 
       25 
     | 
    
         
            -
                #
         
     | 
| 
       26 
     | 
    
         
            -
                # Return:
         
     | 
| 
       27 
     | 
    
         
            -
                # => nil
         
     | 
| 
       28 
12 
     | 
    
         
             
                input_stack = []
         
     | 
| 
       29 
13 
     | 
    
         
             
                control_flow_level = 1
         
     | 
| 
       30 
14 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
                puts "Thanks for using RomLoader, powered by freeroms.com!\nConnecting to freeroms.com and retrieving the  
     | 
| 
       32 
     | 
    
         
            -
                sleep  
     | 
| 
      
 15 
     | 
    
         
            +
                puts "Thanks for using RomLoader, powered by freeroms.com!\nNOTE: To play these games, please download an emulator for the desired system.\nConnecting to freeroms.com and retrieving the systems index...\n\n"
         
     | 
| 
      
 16 
     | 
    
         
            +
                sleep 3
         
     | 
| 
       33 
17 
     | 
    
         
             
                while control_flow_level > 0 
         
     | 
| 
       34 
18 
     | 
    
         
             
                  case control_flow_level
         
     | 
| 
       35 
19 
     | 
    
         
             
                  when 1
         
     | 
| 
       36 
20 
     | 
    
         
             
                    list_systems
         
     | 
| 
       37 
     | 
    
         
            -
                    input = input_prompt("Select a system (1-#{GameSystem.all.size}) [exit]:",1..GameSystem.all.size)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    input = input_prompt("Select a system (1-#{RomLoader::GameSystem.all.size}) [exit]:",1..RomLoader::GameSystem.all.size)
         
     | 
| 
       38 
22 
     | 
    
         
             
                    if input == "exit"
         
     | 
| 
       39 
23 
     | 
    
         
             
                      control_flow_level = 0
         
     | 
| 
       40 
24 
     | 
    
         
             
                    else
         
     | 
| 
         @@ -46,7 +30,7 @@ class RomloaderCli 
     | 
|
| 
       46 
30 
     | 
    
         
             
                    list_system_index(system)
         
     | 
| 
       47 
31 
     | 
    
         
             
                    if system.get_rom_indices.empty?
         
     | 
| 
       48 
32 
     | 
    
         
             
                      begin
         
     | 
| 
       49 
     | 
    
         
            -
                        raise ScrapingError::NoElementFound.exception("Requested system is currently unavailable. Try another one.")
         
     | 
| 
      
 33 
     | 
    
         
            +
                        raise RomLoader::ScrapingError::NoElementFound.exception("Requested system is currently unavailable. Try another one.")
         
     | 
| 
       50 
34 
     | 
    
         
             
                      rescue
         
     | 
| 
       51 
35 
     | 
    
         
             
                        control_flow_level -= 1
         
     | 
| 
       52 
36 
     | 
    
         
             
                        input_stack.shift
         
     | 
| 
         @@ -59,7 +43,7 @@ class RomloaderCli 
     | 
|
| 
       59 
43 
     | 
    
         
             
                    game_collection = select_game_collection_by_index(system,input_stack[0].upcase)
         
     | 
| 
       60 
44 
     | 
    
         
             
                    if game_collection.empty?
         
     | 
| 
       61 
45 
     | 
    
         
             
                      begin
         
     | 
| 
       62 
     | 
    
         
            -
                        raise ScrapingError::NoElementFound.exception("Requested game index is currently unavailable. Try another one.")
         
     | 
| 
      
 46 
     | 
    
         
            +
                        raise RomLoader::ScrapingError::NoElementFound.exception("Requested game index is currently unavailable. Try another one.")
         
     | 
| 
       63 
47 
     | 
    
         
             
                      rescue
         
     | 
| 
       64 
48 
     | 
    
         
             
                        control_flow_level -= 1
         
     | 
| 
       65 
49 
     | 
    
         
             
                        input_stack.shift
         
     | 
| 
         @@ -73,16 +57,23 @@ class RomloaderCli 
     | 
|
| 
       73 
57 
     | 
    
         
             
                    game = select_game(game_collection,input_stack[0].to_i)
         
     | 
| 
       74 
58 
     | 
    
         
             
                    if game.download_url == nil
         
     | 
| 
       75 
59 
     | 
    
         
             
                      begin
         
     | 
| 
       76 
     | 
    
         
            -
                        raise ScrapingError::NoElementFound.exception("Requested game is currently unavailable. Try another one.")
         
     | 
| 
      
 60 
     | 
    
         
            +
                        raise RomLoader::ScrapingError::NoElementFound.exception("Requested game is currently unavailable. Try another one.")
         
     | 
| 
       77 
61 
     | 
    
         
             
                      rescue
         
     | 
| 
       78 
62 
     | 
    
         
             
                        control_flow_level -= 1
         
     | 
| 
       79 
63 
     | 
    
         
             
                        input_stack.shift
         
     | 
| 
       80 
64 
     | 
    
         
             
                      end
         
     | 
| 
       81 
65 
     | 
    
         
             
                    else
         
     | 
| 
       82 
66 
     | 
    
         
             
                      display_rom_details(game)
         
     | 
| 
       83 
     | 
    
         
            -
                      input = input_prompt("Download (Y/n) [exit]:", /[yn]/, control_flow_level)
         
     | 
| 
      
 67 
     | 
    
         
            +
                      input = input_prompt("Download? (Y/n) [exit]:", /[yn]/, control_flow_level)
         
     | 
| 
       84 
68 
     | 
    
         
             
                      if input == 'y' || input == ""
         
     | 
| 
       85 
     | 
    
         
            -
                        download_rom(game)
         
     | 
| 
      
 69 
     | 
    
         
            +
                        file_or_dir_to_open = download_rom(game)
         
     | 
| 
      
 70 
     | 
    
         
            +
                        if /\".+\"/.match(file_or_dir_to_open)
         
     | 
| 
      
 71 
     | 
    
         
            +
                          game_file = /\".+\"/.match(file_or_dir_to_open)[0]
         
     | 
| 
      
 72 
     | 
    
         
            +
                          input = input_prompt("Play #{game_file}? (Y/n) [exit]:", /[yn]/,control_flow_level)
         
     | 
| 
      
 73 
     | 
    
         
            +
                        else
         
     | 
| 
      
 74 
     | 
    
         
            +
                          input = input_prompt("Open #{file_or_dir_to_open}? (Y/n) [exit]:", /[yn]/,control_flow_level)
         
     | 
| 
      
 75 
     | 
    
         
            +
                        end
         
     | 
| 
      
 76 
     | 
    
         
            +
                        system("open #{file_or_dir_to_open}") if input == 'y' || input == ""
         
     | 
| 
       86 
77 
     | 
    
         
             
                      end
         
     | 
| 
       87 
78 
     | 
    
         
             
                      input_stack.shift
         
     | 
| 
       88 
79 
     | 
    
         
             
                      input == "exit" ? control_flow_level = 0 : control_flow_level -= 1
         
     | 
| 
         @@ -93,15 +84,8 @@ class RomloaderCli 
     | 
|
| 
       93 
84 
     | 
    
         
             
                puts "Happy Gaming!"
         
     | 
| 
       94 
85 
     | 
    
         
             
              end
         
     | 
| 
       95 
86 
     | 
    
         | 
| 
       96 
     | 
    
         
            -
              #  
     | 
| 
      
 87 
     | 
    
         
            +
              # Sets control_flow_level in RomLoaderCli#start, manipulates input_stack in RomLoaderCli#start
         
     | 
| 
       97 
88 
     | 
    
         
             
              def flow_controller(input,control_flow_level,input_stack)
         
     | 
| 
       98 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       99 
     | 
    
         
            -
                # => 1. input (String): Current user input from the CLI
         
     | 
| 
       100 
     | 
    
         
            -
                # => 2. control_flow_level (Fixnum): Indicator of current user progress through the CLI
         
     | 
| 
       101 
     | 
    
         
            -
                # => 3. input_stack (Array<String>): Buffer of previous user input from the CLI
         
     | 
| 
       102 
     | 
    
         
            -
                #
         
     | 
| 
       103 
     | 
    
         
            -
                # Return:
         
     | 
| 
       104 
     | 
    
         
            -
                # => Fixnum
         
     | 
| 
       105 
89 
     | 
    
         
             
                if input == "exit"
         
     | 
| 
       106 
90 
     | 
    
         
             
                  0
         
     | 
| 
       107 
91 
     | 
    
         
             
                elsif input == "back"
         
     | 
| 
         @@ -113,35 +97,21 @@ class RomloaderCli 
     | 
|
| 
       113 
97 
     | 
    
         
             
                end
         
     | 
| 
       114 
98 
     | 
    
         
             
              end
         
     | 
| 
       115 
99 
     | 
    
         | 
| 
       116 
     | 
    
         
            -
              #  
     | 
| 
       117 
     | 
    
         
            -
              def list_systems
         
     | 
| 
       118 
     | 
    
         
            -
                #  
     | 
| 
       119 
     | 
    
         
            -
                #
         
     | 
| 
       120 
     | 
    
         
            -
                # Return:
         
     | 
| 
       121 
     | 
    
         
            -
                # => nil 
         
     | 
| 
       122 
     | 
    
         
            -
                GameSystem.all.each_with_index { |game_system, index| puts "#{index+1}. #{game_system.name}"}
         
     | 
| 
      
 100 
     | 
    
         
            +
              # Lists the game systems scraped from http://freeroms.com and saved in Romloader::GameSystem.all (e.g. 1. Amiga, 2. Atari, etc...)
         
     | 
| 
      
 101 
     | 
    
         
            +
              def list_systems 
         
     | 
| 
      
 102 
     | 
    
         
            +
                RomLoader::GameSystem.all.each_with_index { |game_system, index| puts "#{index+1}. #{game_system.name}"}
         
     | 
| 
       123 
103 
     | 
    
         
             
                print "\n"
         
     | 
| 
       124 
104 
     | 
    
         
             
              end
         
     | 
| 
       125 
105 
     | 
    
         | 
| 
       126 
     | 
    
         
            -
              #  
     | 
| 
      
 106 
     | 
    
         
            +
              # Retrieves an individual Romloader::GameSystem object from Romloader::GameSystem.all
         
     | 
| 
       127 
107 
     | 
    
         
             
              def select_system(index)
         
     | 
| 
       128 
     | 
    
         
            -
                 
     | 
| 
       129 
     | 
    
         
            -
                # => 1. index (Fixnum): Retrieved from user input
         
     | 
| 
       130 
     | 
    
         
            -
                #
         
     | 
| 
       131 
     | 
    
         
            -
                # Return:
         
     | 
| 
       132 
     | 
    
         
            -
                # => GameSystem object
         
     | 
| 
       133 
     | 
    
         
            -
                GameSystem.all[index-1]
         
     | 
| 
      
 108 
     | 
    
         
            +
                RomLoader::GameSystem.all[index-1]
         
     | 
| 
       134 
109 
     | 
    
         
             
              end
         
     | 
| 
       135 
110 
     | 
    
         | 
| 
       136 
     | 
    
         
            -
              #  
     | 
| 
      
 111 
     | 
    
         
            +
              # List game index for the selected system by letter (e.g. A B C D...)
         
     | 
| 
       137 
112 
     | 
    
         
             
              def list_system_index(selected_system)
         
     | 
| 
       138 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       139 
     | 
    
         
            -
                # => 1. selected_system (String): Retrieved from user input 
         
     | 
| 
       140 
     | 
    
         
            -
                #
         
     | 
| 
       141 
     | 
    
         
            -
                # Return:
         
     | 
| 
       142 
     | 
    
         
            -
                # => nil
         
     | 
| 
       143 
113 
     | 
    
         
             
                if selected_system.get_rom_indices.empty?
         
     | 
| 
       144 
     | 
    
         
            -
                  selected_system.rom_indices = FreeromsScraper.rom_index_scrape(selected_system.rom_index_url)
         
     | 
| 
      
 114 
     | 
    
         
            +
                  selected_system.rom_indices = RomLoader::FreeromsScraper.rom_index_scrape(selected_system.rom_index_url)
         
     | 
| 
       145 
115 
     | 
    
         
             
                end
         
     | 
| 
       146 
116 
     | 
    
         | 
| 
       147 
117 
     | 
    
         
             
                puts "#{selected_system.name} index:"
         
     | 
| 
         @@ -149,64 +119,34 @@ class RomloaderCli 
     | 
|
| 
       149 
119 
     | 
    
         
             
                puts "\n\n"
         
     | 
| 
       150 
120 
     | 
    
         
             
              end
         
     | 
| 
       151 
121 
     | 
    
         | 
| 
       152 
     | 
    
         
            -
              #  
     | 
| 
      
 122 
     | 
    
         
            +
              # Retrieves all the games available for the selected system under the selected index (e.g. NES,"G")
         
     | 
| 
       153 
123 
     | 
    
         
             
              def select_game_collection_by_index(system, letter)
         
     | 
| 
       154 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       155 
     | 
    
         
            -
                # => 1. system (GameSystem): Selected by user through CLI
         
     | 
| 
       156 
     | 
    
         
            -
                # => 2. letter (String): Retrieved from user input
         
     | 
| 
       157 
     | 
    
         
            -
                #
         
     | 
| 
       158 
     | 
    
         
            -
                # Return:
         
     | 
| 
       159 
     | 
    
         
            -
                # => Array<GameRom>
         
     | 
| 
       160 
124 
     | 
    
         
             
                puts "Loading roms...\n"
         
     | 
| 
       161 
125 
     | 
    
         
             
                games_list = system.get_roms_by_letter(letter)
         
     | 
| 
       162 
     | 
    
         
            -
                games_list ||= system.add_roms_to_collection_by_letter(letter,GameRom.create_collection(FreeromsScraper.rom_scrape(system.get_rom_collection_url(letter))))
         
     | 
| 
      
 126 
     | 
    
         
            +
                games_list ||= system.add_roms_to_collection_by_letter(letter,RomLoader::GameRom.create_collection(RomLoader::FreeromsScraper.rom_scrape(system.get_rom_collection_url(letter))))
         
     | 
| 
       163 
127 
     | 
    
         
             
              end
         
     | 
| 
       164 
128 
     | 
    
         | 
| 
       165 
     | 
    
         
            -
              #  
     | 
| 
      
 129 
     | 
    
         
            +
              # List all the games available for the selected index (e.g. "S": 1. Super Castlevania, 2. Super Mario World, etc...)
         
     | 
| 
       166 
130 
     | 
    
         
             
              def list_games(games)
         
     | 
| 
       167 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       168 
     | 
    
         
            -
                # => 1. games (Array<GameRom>): Selected by user through CLI
         
     | 
| 
       169 
     | 
    
         
            -
                #
         
     | 
| 
       170 
     | 
    
         
            -
                # Return:
         
     | 
| 
       171 
     | 
    
         
            -
                # => nil
         
     | 
| 
       172 
131 
     | 
    
         
             
                games.each_with_index {|game,index| puts "#{index+1}. #{game.name}"}
         
     | 
| 
       173 
132 
     | 
    
         
             
                print "\n"
         
     | 
| 
       174 
133 
     | 
    
         
             
              end
         
     | 
| 
       175 
134 
     | 
    
         | 
| 
       176 
     | 
    
         
            -
              #  
     | 
| 
      
 135 
     | 
    
         
            +
              # Selects an individual game from the provided collection via index
         
     | 
| 
       177 
136 
     | 
    
         
             
              def select_game(game_collection,index)
         
     | 
| 
       178 
     | 
    
         
            -
                 
     | 
| 
       179 
     | 
    
         
            -
                # => 1. game_collection (GameRom): Selected by user through CLI
         
     | 
| 
       180 
     | 
    
         
            -
                # => 2. index (Fixnum): Retrieved from user input
         
     | 
| 
       181 
     | 
    
         
            -
                #
         
     | 
| 
       182 
     | 
    
         
            -
                # Return:
         
     | 
| 
       183 
     | 
    
         
            -
                # => GameRom object
         
     | 
| 
       184 
     | 
    
         
            -
                game_collection[index-1].set_rom_details(FreeromsScraper.rom_details(game_collection[index-1].rom_detail_url))
         
     | 
| 
      
 137 
     | 
    
         
            +
                game_collection[index-1].set_rom_details(RomLoader::FreeromsScraper.rom_details(game_collection[index-1].rom_detail_url))
         
     | 
| 
       185 
138 
     | 
    
         
             
                game_collection[index-1]
         
     | 
| 
       186 
139 
     | 
    
         
             
              end
         
     | 
| 
       187 
140 
     | 
    
         | 
| 
       188 
     | 
    
         
            -
              #  
     | 
| 
      
 141 
     | 
    
         
            +
              # List the details of the selected game (e.g. Chrono Trigger | 5.38 MB | .zip)
         
     | 
| 
       189 
142 
     | 
    
         
             
              def display_rom_details(game)
         
     | 
| 
       190 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       191 
     | 
    
         
            -
                # => 1. game (GameRom): Selected by user through CLI
         
     | 
| 
       192 
     | 
    
         
            -
                #
         
     | 
| 
       193 
     | 
    
         
            -
                # Return:
         
     | 
| 
       194 
     | 
    
         
            -
                # => nil
         
     | 
| 
       195 
143 
     | 
    
         
             
                puts "Rom details:"
         
     | 
| 
       196 
144 
     | 
    
         
             
                puts "#{game.name} | System: #{game.system.name} | File size: #{game.size} | File type: #{game.file_ext}"
         
     | 
| 
       197 
     | 
    
         
            -
                puts "NOTE: To uncompress 7-Zip (.7z) files, please download a system compatible version at http://www.7-zip.org/download.html" if game.file_ext == ".7z"
         
     | 
| 
       198 
145 
     | 
    
         
             
                print "\n"
         
     | 
| 
       199 
146 
     | 
    
         
             
              end
         
     | 
| 
       200 
147 
     | 
    
         | 
| 
       201 
     | 
    
         
            -
              #  
     | 
| 
      
 148 
     | 
    
         
            +
              # Prints a custom message, takes user input, asesses whether the input is valid, and returns the input
         
     | 
| 
       202 
149 
     | 
    
         
             
              def input_prompt(message,accepted_input,control_flow_level=nil)
         
     | 
| 
       203 
     | 
    
         
            -
                # Arguments:
         
     | 
| 
       204 
     | 
    
         
            -
                # => 1. message (String): A custom message detailing the expected input
         
     | 
| 
       205 
     | 
    
         
            -
                # => 2. accepted_input (Regexp or Range): Will be checked against the input to verify validity
         
     | 
| 
       206 
     | 
    
         
            -
                # => 3. control_flow_level [optional] (Fixnum): Used to assess input in context specific situations (e.g. user providing "back" when CLI is on it's first screen)
         
     | 
| 
       207 
     | 
    
         
            -
                #
         
     | 
| 
       208 
     | 
    
         
            -
                # Return:
         
     | 
| 
       209 
     | 
    
         
            -
                # => Fixnum
         
     | 
| 
       210 
150 
     | 
    
         
             
                valid = false
         
     | 
| 
       211 
151 
     | 
    
         
             
                until valid 
         
     | 
| 
       212 
152 
     | 
    
         
             
                  print message + " "
         
     | 
| 
         @@ -227,20 +167,20 @@ class RomloaderCli 
     | 
|
| 
       227 
167 
     | 
    
         
             
                input
         
     | 
| 
       228 
168 
     | 
    
         
             
              end
         
     | 
| 
       229 
169 
     | 
    
         | 
| 
       230 
     | 
    
         
            -
              #  
     | 
| 
      
 170 
     | 
    
         
            +
              # Downloads the selected game to the local directory (~/videogame_roms)
         
     | 
| 
       231 
171 
     | 
    
         
             
              def download_rom(game)
         
     | 
| 
       232 
     | 
    
         
            -
                 
     | 
| 
       233 
     | 
    
         
            -
                # => 1. game (GameRom): Selected by user through CLI
         
     | 
| 
       234 
     | 
    
         
            -
                #
         
     | 
| 
       235 
     | 
    
         
            -
                # Return:
         
     | 
| 
       236 
     | 
    
         
            -
                # => nil
         
     | 
| 
      
 172 
     | 
    
         
            +
                file_or_dir_to_open = ""
         
     | 
| 
       237 
173 
     | 
    
         
             
                puts "Downloading #{game.name} (#{game.size})..."
         
     | 
| 
       238 
     | 
    
         
            -
                result = Dir.chdir(File.join(Dir.home,"videogame_roms"))  
     | 
| 
       239 
     | 
    
         
            -
             
     | 
| 
      
 174 
     | 
    
         
            +
                result = Dir.chdir(File.join(Dir.home,"videogame_roms")) { system("curl -Og# \"#{game.download_url}\"") }
         
     | 
| 
      
 175 
     | 
    
         
            +
                if result == true 
         
     | 
| 
      
 176 
     | 
    
         
            +
                  puts "Finished downloading #{game.filename} to #{File.join(Dir.home,"videogame_roms")}.\n"
         
     | 
| 
      
 177 
     | 
    
         
            +
                  file_or_dir_to_open = RomLoader::ArchiveExtractor.extract(File.join(Dir.home,"videogame_roms",game.filename),game)
         
     | 
| 
      
 178 
     | 
    
         
            +
                else
         
     | 
| 
      
 179 
     | 
    
         
            +
                  puts "An error occured, the rom couldn't be downloaded.\n"
         
     | 
| 
       240 
180 
     | 
    
         
             
                end
         
     | 
| 
       241 
     | 
    
         
            -
                result ? puts("Finished downloading to #{File.join(Dir.home,"videogame_roms")}.\n") : puts("An error occured, the rom couldn't be downloaded.\n")
         
     | 
| 
       242 
181 
     | 
    
         
             
                sleep 3
         
     | 
| 
       243 
182 
     | 
    
         
             
                puts "\n"
         
     | 
| 
      
 183 
     | 
    
         
            +
                file_or_dir_to_open
         
     | 
| 
       244 
184 
     | 
    
         
             
              end
         
     | 
| 
       245 
185 
     | 
    
         | 
| 
       246 
186 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: romloader
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version:  
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.0.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Efrain Perez Jr
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2016-10- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2016-10-07 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: nokogiri
         
     | 
| 
         @@ -24,6 +24,48 @@ dependencies: 
     | 
|
| 
       24 
24 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       25 
25 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
26 
     | 
    
         
             
                    version: '1.6'
         
     | 
| 
      
 27 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 28 
     | 
    
         
            +
              name: rubyzip
         
     | 
| 
      
 29 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 30 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 31 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 33 
     | 
    
         
            +
                    version: '1.2'
         
     | 
| 
      
 34 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 35 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 37 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 38 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 39 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 40 
     | 
    
         
            +
                    version: '1.2'
         
     | 
| 
      
 41 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 42 
     | 
    
         
            +
              name: seven_zip_ruby
         
     | 
| 
      
 43 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 44 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 45 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 46 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 47 
     | 
    
         
            +
                    version: '1.2'
         
     | 
| 
      
 48 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 49 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 50 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 51 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 52 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 53 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 54 
     | 
    
         
            +
                    version: '1.2'
         
     | 
| 
      
 55 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 56 
     | 
    
         
            +
              name: fileutils
         
     | 
| 
      
 57 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 58 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 59 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 60 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 61 
     | 
    
         
            +
                    version: '0.7'
         
     | 
| 
      
 62 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 63 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 64 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 65 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 66 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 67 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 68 
     | 
    
         
            +
                    version: '0.7'
         
     | 
| 
       27 
69 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       28 
70 
     | 
    
         
             
              name: bundler
         
     | 
| 
       29 
71 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -79,11 +121,12 @@ files: 
     | 
|
| 
       79 
121 
     | 
    
         
             
            - README.md
         
     | 
| 
       80 
122 
     | 
    
         
             
            - bin/romloader
         
     | 
| 
       81 
123 
     | 
    
         
             
            - lib/romloader.rb
         
     | 
| 
      
 124 
     | 
    
         
            +
            - lib/romloader/archive_extractor.rb
         
     | 
| 
       82 
125 
     | 
    
         
             
            - lib/romloader/freeroms_scraper.rb
         
     | 
| 
       83 
126 
     | 
    
         
             
            - lib/romloader/game_rom.rb
         
     | 
| 
       84 
127 
     | 
    
         
             
            - lib/romloader/game_system.rb
         
     | 
| 
       85 
128 
     | 
    
         
             
            - lib/romloader/romloader_cli.rb
         
     | 
| 
       86 
     | 
    
         
            -
            - lib/romloader/scraping_error/ 
     | 
| 
      
 129 
     | 
    
         
            +
            - lib/romloader/scraping_error/errors.rb
         
     | 
| 
       87 
130 
     | 
    
         
             
            homepage: https://github.com/jinstrider2000/romloader-cli-gem
         
     | 
| 
       88 
131 
     | 
    
         
             
            licenses:
         
     | 
| 
       89 
132 
     | 
    
         
             
            - MIT
         
     |