uq-libraries 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 93aa6b64252c43c27fc73ca5861fc8206939fb71
4
+ data.tar.gz: aca350c261701f290810d6ae2fb477a5fe76b8d5
5
+ SHA512:
6
+ metadata.gz: ef937106b27634536994bfb5cf911acf503d04e8f5efa9d8402231335ce99b702766919d5552231bcf372d88a31d2a375aa4c7f3b6a2a3e36945129aaec3d145
7
+ data.tar.gz: 846a0837ba8c43d7d0480554d7262ec578701636db0c4fd6b68e4199025330fd0fbf453e6308940b4f303277f0efe137ecf6fc9479297db4b6e412eb27691dc0
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/uq_libraries'
3
+
4
+ UqLibraries::CLI.new.call
5
+
6
+ get '/' do
7
+ uq-libraries = UqLibraries::CLI.new
8
+ return uq-libraries.call
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'pry'
2
+ require 'nokogiri'
3
+ require 'open-uri'
4
+ require 'colorize'
5
+
6
+ require_relative '../lib/uq_libraries/scraper'
7
+ require_relative '../lib/uq_libraries/library'
8
+ require_relative '../lib/uq_libraries/library_details'
9
+ require_relative '../lib/uq_libraries/cli'
@@ -0,0 +1,4 @@
1
+ module UqLibraries
2
+ end
3
+
4
+ require_relative '../config/environment'
@@ -0,0 +1,85 @@
1
+ class UqLibraries::CLI
2
+
3
+ def call
4
+ loading # Shows loading screen while waiting for libraries to be scraped
5
+
6
+ create_libraries # Creates library instances for each library hash
7
+
8
+ display_libraries # Iterates through all libraries and lists them with an index
9
+
10
+ run_gem # Takes the user input and calls methods depending on input
11
+ end
12
+
13
+ def loading # Shows loading screen while waiting for libraries to be scraped
14
+ puts "Loading...\n"
15
+ end
16
+
17
+ def display_libraries # Gets libraries from array and puts out their names preceded by their index starting at 1.
18
+ system "clear" or system "cls"
19
+ UqLibraries::Library.all.each.with_index(1) do |library, index|
20
+ puts "#{index}. #{library.name}: #{status(index)}"
21
+ end
22
+ end
23
+
24
+ def create_libraries # Creates library instances for each library hash
25
+ UqLibraries::Library.create_from_collection(UqLibraries::Scraper.scrape_main_page)
26
+ end
27
+
28
+ def status(index) # Helper method for #display_libraries. Shows status of library QUIET/NORMAL/BUSY
29
+ library = UqLibraries::Library.all[index - 1]
30
+
31
+ if library.total_available.to_i <= 0.3333333333 * library.total_out_of_available.to_i
32
+ "BUSY".colorize(:red)
33
+ elsif library.total_available.to_i > 0.3333333333 * library.total_out_of_available.to_i && library.total_available.to_i <= 0.666666666666 * library.total_out_of_available.to_i
34
+ "NORMAL".colorize(:yellow)
35
+ elsif library.total_available.to_i > 0.666666666666 * library.total_out_of_available.to_i
36
+ "QUIET".colorize(:green)
37
+ end
38
+ end
39
+
40
+ def run_gem # Takes the user input and calls methods depending on input
41
+ puts "\nEnter a number (1-9) to show more information about a library."
42
+ puts "Type `list` to see the library list again or type 'exit' to leave."
43
+ print "> "
44
+ input = gets.strip.downcase
45
+
46
+ if input.to_i.between?(1, 12)
47
+ system "clear" or system "cls"
48
+ puts "#{UqLibraries::Library.all[input.to_i - 1].name}"
49
+ puts "---------------------------------------------------".colorize(:blue)
50
+ more_info(input.to_i - 1)
51
+ puts "---------------------------------------------------".colorize(:blue)
52
+ run_gem
53
+ elsif input == "list"
54
+ system "clear" or system "cls"
55
+ display_libraries
56
+ run_gem
57
+ elsif input == "exit"
58
+ system "clear" or system "cls"
59
+ exit
60
+ else
61
+ system "clear" or system "cls"
62
+ puts "\nThat's not a library! Enter the index number of a library (1-9) or type 'list' for a list of libraries.".colorize(:red)
63
+ run_gem
64
+ end
65
+ end
66
+
67
+ def more_info(input) # Helper method for #run_gem. Displays more information on the library using the input provided by the user
68
+ details = UqLibraries::Library.all[input].details
69
+
70
+ details.each do |level|
71
+ if level[:available].to_i > 0.6666666666 * level[:out_of_available].to_i
72
+ print "QUIET: ".colorize(:green)
73
+ puts "#{level[:level]} has #{level[:available]} computers available out of #{level[:out_of_available]}".gsub("Entry ", "")
74
+
75
+ elsif level[:available].to_i > 0.3333333333 * level[:out_of_available].to_i && level[:available].to_i <= 0.666666666666 * level[:out_of_available].to_i
76
+ print "NORMAL: ".colorize(:yellow)
77
+ puts "#{level[:level]} has #{level[:available]} computers available out of #{level[:out_of_available]}".gsub("Entry ", "")
78
+
79
+ elsif level[:available].to_i <= 0.3333333333 * level[:out_of_available].to_i
80
+ print "BUSY: ".colorize(:red)
81
+ puts "#{level[:level]} has #{level[:available]} computers available out of #{level[:out_of_available]}".gsub("Entry ", "")
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,22 @@
1
+ class UqLibraries::Library
2
+ attr_accessor :name, :library_url, :total_available, :total_out_of_available, :details
3
+ @@all = []
4
+
5
+ def initialize(library_hash)
6
+ library_hash.each {|attribute, value| self.send("#{attribute}=", value)}
7
+ add_details
8
+ @@all << self
9
+ end
10
+
11
+ def self.create_from_collection(libraries_array) # Creates library instance from an array of hashes returned by Scraper#scrape_main_page
12
+ libraries_array.each {|i| self.new(i)}
13
+ end
14
+
15
+ def self.all # Getter method for @@all array. Returns all Library instances
16
+ @@all
17
+ end
18
+
19
+ def add_details # Sets library.details equal to an array of hashes containing different details for each level of the library
20
+ @details = UqLibraries::LibraryDetails.create_from_collection(UqLibraries::Scraper.scrape_details_page(@library_url))
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ class UqLibraries::LibraryDetails
2
+ attr_accessor :level, :available, :out_of_available
3
+ @@all = []
4
+
5
+ def initialize(details_hash)
6
+ @level = details_hash[:level]
7
+ @available = details_hash[:available]
8
+ @out_of_available = details_hash[:out_of_available]
9
+
10
+ @@all << self
11
+ end
12
+
13
+ def self.create_from_collection(details_array) # Creates library_details instance from array of hashes returned by Scraper#scrape_details_page
14
+ details_array.each {|details_hash| self.new(details_hash)}
15
+ end
16
+
17
+ def self.all # Getter method for @@all array. Returns all LibraryDetails instances
18
+ @@all
19
+ end
20
+ end
@@ -0,0 +1,34 @@
1
+ class UqLibraries::Scraper
2
+
3
+ @base_url = "https://www.library.uq.edu.au/uqlsm/" # URL without page
4
+ @main_page = "availablepcsembed.php" # Page to append to URL
5
+ @main_url = "#{@base_url}#{@main_page}" # Adds page and URL together
6
+
7
+
8
+ def self.scrape_main_page # Scrapes the main libraries page for primary details
9
+ libraries = []
10
+ frontpage = Nokogiri::HTML(open(@main_url))
11
+
12
+ frontpage.css(".chart tr").each do |row|
13
+ name = row.css("a[href]").text
14
+
15
+ total_available = row.css(".right").text.split(" ")[0]
16
+ out_of_available = row.css(".right").text.split(" ")[3]
17
+
18
+ library_page = row.css("a[href]")[0]["href"]
19
+ library_url = "#{@base_url}#{library_page}"
20
+
21
+ libraries << {name: name, total_available: total_available, total_out_of_available: out_of_available, library_url: library_url}
22
+ end
23
+ libraries
24
+ end
25
+
26
+ def self.scrape_details_page(library_url) # Scrapes library details page for secondary details
27
+ details_page = Nokogiri::HTML(open(library_url))
28
+
29
+ details_page.css("table.chart tr").collect do |level|
30
+ right = level.css(".right").text.split
31
+ {level: level.css(".left").text, available: right[0], out_of_available: right[3]}
32
+ end
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: uq-libraries
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Matt Hough
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.8.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.8.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.15.4
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.15.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 12.0.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 12.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: nokogiri
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Shows users how busy a selected UQ library is.
98
+ email: matt@hough.tv
99
+ executables:
100
+ - uq-libraries
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - bin/uq-libraries
105
+ - config/environment.rb
106
+ - lib/uq_libraries.rb
107
+ - lib/uq_libraries/cli.rb
108
+ - lib/uq_libraries/library.rb
109
+ - lib/uq_libraries/library_details.rb
110
+ - lib/uq_libraries/scraper.rb
111
+ homepage: http://rubygems.org/gems/uq-libraries
112
+ licenses:
113
+ - MIT
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 2.6.14
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: How busy are UQ libraries?
135
+ test_files: []