steam-upcoming 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 60f01b9aab0c1d3bacfa0a33fab1b8de15e39770
4
- data.tar.gz: b7d96181a097415fa89b3237e37a61cae653815c
3
+ metadata.gz: ebff50ee91419aa83a61668f696ad91dc901808a
4
+ data.tar.gz: 373c94cadf069e76f068cf2eadc277920a2f53f3
5
5
  SHA512:
6
- metadata.gz: cea802dc82d096666bc4e5aacd30e7bf2db61c4023994bf1654f19c75297063dfe8d735df8dc1ec1883715dbd25fee56f1d397cf81440a5b42a49ef3f7460748
7
- data.tar.gz: 657b0553e3bb5170b02d7af469bd2a673df95bafd06722b68d959e3da260f412389931ef6cd90e9049e04293c729a1b2a5effbb84fdc3f3b4fe075fd5985137d
6
+ metadata.gz: 663ad82a66246991b656f6d25c287564bae04414a0848c0e4798e7a5e3f5efa98c1d6f4727f22ff889b1322d53c36fd8e5ad99be506a7a4b760bbf6f6c33383e
7
+ data.tar.gz: c43cd262f128b4d2bab0c649165acd69e83b02a658a8aee46947e82749e0b64a596c662ab4ce4e27015e22495eb87d6f1e435da98e1b997a1ec7283586bf6e36
@@ -1,3 +1,5 @@
1
+ require 'pry'
2
+
1
3
  class SteamUpcoming::CLI
2
4
  attr_accessor :url
3
5
 
@@ -8,25 +10,29 @@ class SteamUpcoming::CLI
8
10
  end
9
11
 
10
12
  def run #run the program
11
- puts "\nFetching latest games from the Steam Network...".colorize(:yellow)
13
+ puts "\nFetching latest games from the Steam Network...".colorize(:cyan)
12
14
  make_games(BASE_URL)
13
15
  pages
14
16
  start
15
17
  end
16
18
 
17
19
  def make_games(url) #creates the list of game objects from the chosen URL
18
- game_array = SteamUpcoming::Scraper.scrape_index_page(url)
19
- SteamUpcoming::Game.create_from_collection(game_array)
20
+ SteamUpcoming::Scraper.scrape_index_page(url)
20
21
  end
21
22
 
22
23
  def pages #generate list of page URLs as an array
23
- pages = SteamUpcoming::Game.create_pages(SteamUpcoming::Scraper.page_count(BASE_URL))
24
+ SteamUpcoming::Scraper.create_pages_with_urls(BASE_URL)
25
+ end
26
+
27
+ def number_of_results
28
+ results = SteamUpcoming::Scraper.get_number_of_results(BASE_URL)
24
29
  end
25
30
 
26
31
  def change_page #allow the users to select another page
27
32
  print "Enter a page number > "
28
- input = gets.chomp.strip
29
- if @url = pages[input.to_i-1] #use the users input to select the corresponding page URL from the #pages array
33
+ input = gets.chomp
34
+ @url = pages[input.to_i-1] #use the users input to select the corresponding page URL from the #pages array
35
+ if @url
30
36
  SteamUpcoming::Game.reset #clear out the class variable so it can be populated with a new list of games
31
37
  make_games(@url) #create the games with the new chosen URL
32
38
  list
@@ -36,18 +42,17 @@ class SteamUpcoming::CLI
36
42
  end
37
43
 
38
44
  def list_game(game) #list a game's details
39
- attributes = SteamUpcoming::Scraper.scrape_game_page(game.url)
40
- game.add_game_attributes(attributes)
45
+ SteamUpcoming::Scraper.scrape_game_page(game.url)
41
46
  puts "\n//-------------- #{game.name} --------------//\n".colorize(:yellow)
42
- puts "About #{game.name}".colorize(:light_blue)
47
+ puts "About #{game.name}".colorize(:yellow)
43
48
  puts game.about
44
- puts "\nTags:".colorize(:light_blue)
49
+ puts "\nTags:".colorize(:yellow)
45
50
  game.tags.each {|tag| puts " - #{tag}"}
46
- puts "\nDetails:".colorize(:light_blue)
51
+ puts "\nDetails:".colorize(:yellow)
47
52
  game.details.each {|detail| puts " - #{detail}"}
48
- puts "\nRelease Date:".colorize(:light_blue)
53
+ puts "\nRelease Date:".colorize(:yellow)
49
54
  puts " - #{game.release_date}"
50
- puts "\nPlatforms:".colorize(:light_blue)
55
+ puts "\nPlatforms:".colorize(:yellow)
51
56
  game.platforms.each {|platform| puts " - #{platform}"}
52
57
  puts ""
53
58
  end
@@ -57,13 +62,14 @@ class SteamUpcoming::CLI
57
62
  SteamUpcoming::Game.all.each.with_index do |game, index|
58
63
  puts "#{index+1}. #{game.name}"
59
64
  end
60
- puts "\nPage #{current_page} of #{pages.count}".colorize(:yellow)
65
+ puts "\nPage #{current_page} of #{pages.count}".colorize(:white)
66
+ puts "\n#{number_of_results} results".colorize(:white)
61
67
  end
62
68
 
63
69
  def current_page
64
70
  url = @url[-2,2] #return the last two characters of the URL string
65
71
  array = url.split("").map {|x| x.to_i} #split the two characters into an array
66
- array[0] == 0 ? current_page = array[0] + array[1] : current_page = "#{array[0]}".concat("#{array[1]}")
72
+ array[0] == 0 ? current_page = array[0] + array[1] : current_page = "#{array[0]}".concat("#{array[1]}").to_i
67
73
  #if the first element is a letter (it converts to 0), add it to the second element
68
74
  #if the both elements are numbers, concatenate them and return the new string
69
75
  end
@@ -73,9 +79,9 @@ class SteamUpcoming::CLI
73
79
  input = nil
74
80
  while input != "exit" #loop user input until user types 'exit'
75
81
  puts "\nLearn more about a game by typing a name or number.\n".colorize(:yellow)
76
- puts "Enter \'list\'' to list games.".colorize(:light_blue)
77
- puts "Enter \'exit\' to exit.".colorize(:light_blue)
78
- puts "Enter \'page\' to switch pages.".colorize(:light_blue)
82
+ puts "Enter \'list\'' to list games.".colorize(:yellow)
83
+ puts "Enter \'exit\' to exit.".colorize(:yellow)
84
+ puts "Enter \'page\' to switch pages.".colorize(:yellow)
79
85
  print "\n > "
80
86
  input = gets.chomp.strip
81
87
  if input == "list"
@@ -1,36 +1,15 @@
1
- # The SteamUpcoming::Game class is responsible for taking informatino scraped from the Steam website
2
- # and creating new Game objects with attributes.
1
+ # The SteamUpcoming::Game class is responsible for creating new Game objects with the information
2
+ # collected from the SteamUpcoming::Scraper class.
3
3
 
4
4
  class SteamUpcoming::Game
5
5
  attr_accessor :name, :release_date, :platforms, :url, :about, :tags, :details
6
6
 
7
7
  @@all = []
8
8
 
9
- def initialize(game_hash)
10
- game_hash.each {|key, value| self.send(("#{key}="), value)}
9
+ def initialize
11
10
  @@all << self
12
11
  end
13
12
 
14
- def self.create_from_collection(games_hash_array) #create game objects from an array of hashes
15
- games_hash_array.each do |game|
16
- object = SteamUpcoming::Game.new(game)
17
- end
18
- end
19
-
20
- def add_game_attributes(game_attributes_hash) #add attributes to the Game object
21
- game_attributes_hash.each {|key, value| self.send(("#{key}="), value)}
22
- end
23
-
24
- def self.create_pages(page_count) #Create the page urls
25
- i = 1
26
- pages = []
27
- while i <= page_count.to_i
28
- pages << "http://store.steampowered.com/search/?filter=comingsoon&sort_order=0&filter=comingsoon&page=#{i}"
29
- i += 1
30
- end
31
- pages
32
- end
33
-
34
13
  private
35
14
  def self.all #show all games
36
15
  @@all
@@ -1,33 +1,26 @@
1
- #The SteamUpcoming::Scraper class is responsible for scraping information off of the target webpage
2
- #and outputting hashes of information to be used by the SteamUpcoming::Game class.
1
+ # The SteamUpcoming::Scraper class is responsible for scraping information off of the target webpage
2
+ # and creating the SteamUpcoming::Game objects in the process.
3
+ #
4
+ # When the program is first run, ::Scraper will only collect information from the index page. When a game
5
+ # is selected by the user, Scraper will then scrape the remaining attributes from the game page, add them
6
+ # to the selected ::Game object, and then output the information to the terminal.
3
7
 
4
8
  class SteamUpcoming::Scraper
5
- attr_accessor :name, :release_date, :platforms, :url
6
-
7
- def self.scrape_index_page(index_url) #scrape the page and create an array of hashes (1 hash for each game)
9
+ def self.scrape_index_page(index_url) #scrape the page and create game objects with scraped properties
8
10
  doc = Nokogiri::HTML(open(index_url))
9
- game_array = []
10
11
  doc.css(".search_result_row").each do |game|
11
- game_hash = {
12
- :name=> game.css(".title").text,
13
- :release_date=> game.css(".search_released").text,
14
- :platforms=> self.convert_platforms(gather_platforms(game.css(".search_name p"))),
15
- :url=> game.first[1]
16
- }
17
- game_array << game_hash
12
+ game_object = SteamUpcoming::Game.new
13
+ game_object.name = game.css(".title").text
14
+ game_object.release_date = game.css(".search_released").text
15
+ game_object.platforms = gather_and_convert_platforms(game.css(".search_name p"))
16
+ game_object.url = game.first[1]
18
17
  end
19
- game_array
20
18
  end
21
19
 
22
- def self.gather_platforms(parent) #gather a list of platforms, then return an array of actual platforms
23
- platforms = parent.children.map do |platform|
24
- platform.attr('class')
25
- end
26
- platforms.select {|platform| platform != nil}
27
- end
28
-
29
- def self.convert_platforms(platform_array) #convert the platform array items into actual names, because the source is an image, not text
30
- platforms = platform_array.map! do |platform|
20
+ def self.gather_and_convert_platforms(parent) #gather platforms and convert the items into actual names, because the source is an image, not text
21
+ platforms = parent.children.map {|platform| platform.attr('class')}
22
+ platforms.delete_if {|platform| platform == nil}
23
+ platforms.map! do |platform|
31
24
  if platform.include?("win")
32
25
  platform = "Windows"
33
26
  elsif platform.include?("mac")
@@ -40,27 +33,42 @@ class SteamUpcoming::Scraper
40
33
  platform = "HTC Vive"
41
34
  elsif platform.include?("oculusrift")
42
35
  platform = "Oculus Rift"
43
- else
44
- platform = nil
36
+ else
37
+ next
45
38
  end
46
39
  end
47
- platforms.select {|platform| platform != nil}
48
40
  end
49
41
 
50
42
  def self.scrape_game_page(game_url) #scrape the page and create a hash of game attributes
51
43
  doc = Nokogiri::HTML(open(game_url))
52
- about = doc.css(".game_description_snippet")
44
+ about = doc.css(".game_area_description")
53
45
  tags = doc.css(".glance_tags a").map {|tag| tag.text}
54
46
  details = doc.css(".game_area_details_specs")
55
- game_attributes_hash = {
56
- :about => about.text.match(/\r|\n|\t/) ? about.text.delete("\t").delete("\r").delete("\n") : about.text,
57
- :tags => tags.map {|tag| tag.match(/\r|\n|\t/) ? tag.delete("\t").delete("\r").delete("\n") : tag },
58
- :details => details.map {|child| child.text}
59
- }
47
+ SteamUpcoming::Game.all.each do |game|
48
+ if game_url == game.url
49
+ game.about = about.text.match(/\r|\n|\t/) ? about.text.delete("\t").delete("\r").delete("\n") : about.text
50
+ game.tags = tags.map {|tag| tag.match(/\r|\n|\t/) ? tag.delete("\t").delete("\r").delete("\n") : tag }
51
+ game.details = details.map {|child| child.text}
52
+ return game
53
+ end
54
+ end
60
55
  end
61
56
 
62
- def self.page_count(index_url) #scrape the pages to get the total number of pages
57
+ def self.create_pages_with_urls(index_url) #scrape the pages to get the total number of pages
63
58
  doc = Nokogiri::HTML(open(index_url))
64
59
  page_count = doc.css(".search_pagination_right").first.children[5].text.to_i
60
+ i = 1
61
+ pages = []
62
+ while i <= page_count.to_i
63
+ pages << "http://store.steampowered.com/search/?filter=comingsoon&sort_order=0&filter=comingsoon&page=#{i}"
64
+ i += 1
65
+ end
66
+ pages
67
+ end
68
+
69
+ def self.get_number_of_results(index_url)
70
+ doc = Nokogiri::HTML(open(index_url))
71
+ results = doc.css(".search_pagination_left").first.children.text
72
+ results.match(/\d{3,}/).to_s
65
73
  end
66
74
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: steam-upcoming
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Cassara
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-03 00:00:00.000000000 Z
11
+ date: 2016-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler