treerful_scanner 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd67da624a014451be06adda6a3fef925d0466159b92820db3c3de3347e6c0d8
4
- data.tar.gz: fdc4d06f0ee2b4402bc3a0d484942365402a82a66116b50f055e4d3a6f40027e
3
+ metadata.gz: 0a365a19a0eb1375fc78e84d6a2bea533452548b4bb56ee6843bd052ab3ac469
4
+ data.tar.gz: '08c18615a4d44f9d257010f40aace6ec423d2f4b61c59e43777bf7723aee7563'
5
5
  SHA512:
6
- metadata.gz: 29c354e88d57ce826b8b3e098d6ec8d4a825bb7e862db128d608750bb3eea19a33ba7c9c069658aed2d038d13c8b100be9739692a715c9f7a406f85d61e70528
7
- data.tar.gz: 56db138ec88c93517fae2d080827012b66794929e8d4e7e95a11c64cc8a2fbd9862f3d5c4c2db63ba99e93e5c0f55a1918879227d2e9c858a7cbc4b9a23ce478
6
+ metadata.gz: ff7a389844442ea8422095fb1f13b6e94d45b6429a0c331b8d1559173c1788509cfe6f8f7f02a231c077b1f8cb161a5cf98cf996e571a6909b0f191b81c053a9
7
+ data.tar.gz: 2f6cfbde0105d61b20929625c9e1a5319d4302bd0b28a9d8cc70aa45d3558e9124eff7134492c3d39e177d45c40d8f85020b23e647c211059b5b73daa8a324e4
data/bin/treerful_scanner CHANGED
@@ -6,22 +6,57 @@ require 'date'
6
6
  require 'optparse'
7
7
 
8
8
  options = {
9
- date: (Date.today + 1).to_s
9
+ date: (Date.today + 1).to_s,
10
+ places: [],
11
+ place_names: [],
12
+ format: 'terminal'
10
13
  }
11
14
 
12
15
  OptionParser.new do |opts|
13
16
  opts.banner = "Usage: #{File.basename __FILE__} [options]"
14
- opts.on('-d DATE', '--date=DATE', 'yyyy-mm-dd') do |date|
17
+ opts.on('-d DATE', '--date DATE', 'yyyy-mm-dd') do |date|
15
18
  options[:date] = date
16
19
  end
20
+
21
+ opts.on('-n x,y,z', '--place-names x,y,z', Array, 'Filter by place names') do |place_names|
22
+ options[:place_names] = place_names
23
+ end
24
+
25
+ opts.on('-p x,y,z', '--places x,y,z', Array, 'Filter by place IDs') do |ids|
26
+ options[:places] = ids
27
+ end
28
+
29
+ opts.on('-f FORMAT', '--format FORMAT', '"terminal" (default), "html", "png"') do |format|
30
+ options[:format] = format
31
+ end
17
32
  end.parse!
18
33
 
19
34
  client = TreerfulScanner::Client.new
20
- printer = TreerfulScanner::Printer.new([], options[:date])
21
35
 
22
- count = 0
23
- client.search_by_date(options[:date]) do |table|
24
- print printer.header if count % 10 == 0
25
- print printer.row(table)
26
- count += 1
36
+ place_filter = -> (place) do
37
+ return true if options[:place_names].empty? && options[:places].empty?
38
+ return options[:place_names].any?{ |name| place.name.include?(name) } unless options[:place_names].empty?
39
+ return options[:places].include?(place.id) unless options[:places].empty?
40
+ false
41
+ end
42
+
43
+ case options[:format]
44
+ when 'terminal'
45
+ printer = TreerfulScanner::Printer.new([], options[:date])
46
+ count = 0
47
+ client.search_by_date(options[:date], place_filter: place_filter) do |table|
48
+ print printer.header if count % 10 == 0
49
+ print printer.row(table)
50
+ count += 1
51
+ end
52
+ when 'html'
53
+ time_tables = client.search_by_date(options[:date], place_filter: place_filter)
54
+ printer = TreerfulScanner::HtmlPrinter.new(time_tables, options[:date])
55
+ print printer.print
56
+ when 'png'
57
+ time_tables = client.search_by_date(options[:date], place_filter: place_filter)
58
+ printer = TreerfulScanner::PngPrinter.new(time_tables, options[:date])
59
+ print printer.print
60
+ else
61
+ raise "unknown format: #{options[:format]}"
27
62
  end
@@ -10,7 +10,7 @@ module TreerfulScanner
10
10
  @parser = Parser.new
11
11
  end
12
12
 
13
- def search_by_date(date)
13
+ def search_by_date(date, place_filter: -> { true })
14
14
  date = date.to_s
15
15
  result = []
16
16
  EventMachine.run do
@@ -18,7 +18,7 @@ module TreerfulScanner
18
18
  client = conn.get path: '/space/result', keepalive: true
19
19
  client.callback do
20
20
  multi = EventMachine::MultiRequest.new
21
- places = @parser.parse_places(client.response)
21
+ places = @parser.parse_places(client.response).select(&place_filter)
22
22
  places.each do |place|
23
23
  client2 = conn.get path: "/space/allowTimes?id=#{place.id}&date=#{date}", keepalive: true
24
24
  client2.callback do
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'treerful_scanner'
4
+ require 'erb'
5
+
6
+ module TreerfulScanner
7
+ class HtmlPrinter < Printer
8
+ attr_reader :date
9
+
10
+ def initialize(*)
11
+ super
12
+ @template = IO.read("#{__dir__}/html_printer/template.erb")
13
+ end
14
+
15
+ def print
16
+ erb = ERB.new(@template)
17
+ erb.result(binding)
18
+ end
19
+
20
+ private
21
+
22
+ def tbody
23
+ "<tbody>#{@time_tables.map(&method(:to_tr)).join}</tbody>"
24
+ end
25
+
26
+ def to_tr(time_table)
27
+ result = String.new
28
+ result << "<tr><td><a href=\"https://www.treerful.com/space/#{time_table.place.id}\" rel=\"noopener noreferrer\" target=\"_blank\">#{time_table.place.name}</a></td><td>#{time_table.place.volume}</td>"
29
+ result <<
30
+ binary_form(time_table).each_char.map do |c|
31
+ case c
32
+ when ' ' then '<td></td>'
33
+ when 'O' then '<td class="available"></td>'
34
+ end
35
+ end.join
36
+ result << '</tr>'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'treerful_scanner'
4
+ require 'tmpdir'
5
+ require 'English'
6
+
7
+ module TreerfulScanner
8
+ class PngPrinter < Printer
9
+ CHROME_BINS = [
10
+ 'chromium-browser',
11
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
12
+ ].freeze
13
+ WINDOW_HEIGHT_OFFSET = 200
14
+ WINDOW_CELL_HEIGHT = 24.5
15
+
16
+ def print
17
+ html_printer = HtmlPrinter.new(@time_tables, @date)
18
+ Dir.mktmpdir do |dir|
19
+ html_path = "#{dir}/output.html"
20
+ IO.write(html_path, html_printer.print)
21
+ chrome_bin = CHROME_BINS.find(&File.method(:exist?)) || ENV['CHROME_BIN']
22
+ raise 'ENV["CHROME_BIN"] is nil' unless chrome_bin
23
+ window_height = WINDOW_HEIGHT_OFFSET + WINDOW_CELL_HEIGHT * @time_tables.length
24
+ Dir.chdir(dir) do
25
+ raise "chrome exited with status #{$CHILD_STATUS}" unless system(
26
+ chrome_bin,
27
+ '--headless',
28
+ '--disable-gpu',
29
+ '--disable-software-rasterizer',
30
+ '--disable-dev-shm-usage',
31
+ '--no-sandbox',
32
+ '--screenshot',
33
+ '--hide-scrollbars',
34
+ "--window-size=1280,#{window_height}",
35
+ html_path
36
+ )
37
+ IO.read('screenshot.png', mode: 'rb')
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -17,18 +17,21 @@ module TreerfulScanner
17
17
  end
18
18
 
19
19
  def row(time_table)
20
- tmp = String.new
21
- tmp << ' ' * (BEGIN_HOUR..END_HOUR).size * 2
20
+ fixed_string(time_table.place.name, TITLE_WIDTH) +
21
+ binary_form(time_table).each_char.map { |i| format('%-2s', i) }.join +
22
+ "\n"
23
+ end
24
+
25
+ def binary_form(time_table)
26
+ result = String.new
27
+ result << ' ' * (BEGIN_HOUR..END_HOUR).size * 2
22
28
  offset = BEGIN_HOUR * 60
23
29
  time_table.durations.each do |duration|
24
30
  start = (duration.from - offset) / 30
25
31
  finish = (duration.to - offset) / 30
26
- tmp[start..finish] = 'O' * (finish - start + 1)
32
+ result[start...finish] = 'O' * (finish - start)
27
33
  end
28
-
29
- fixied_string(time_table.place.name, TITLE_WIDTH) +
30
- tmp.each_char.map { |i| format('%-2s', i) }.join +
31
- "\n"
34
+ result
32
35
  end
33
36
 
34
37
  def print
@@ -42,7 +45,7 @@ module TreerfulScanner
42
45
 
43
46
  private
44
47
 
45
- def fixied_string(string, width)
48
+ def fixed_string(string, width)
46
49
  length = string.length + string.scan(/\p{Han}|\p{Katakana}|\p{Hiragana}\p{Hangul}/).length
47
50
  diff = width - length
48
51
  return string + (' ' * diff) if diff > 0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: treerful_scanner
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jian Weihang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-18 00:00:00.000000000 Z
11
+ date: 2018-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -91,8 +91,10 @@ files:
91
91
  - lib/treerful_scanner.rb
92
92
  - lib/treerful_scanner/client.rb
93
93
  - lib/treerful_scanner/duration.rb
94
+ - lib/treerful_scanner/html_printer.rb
94
95
  - lib/treerful_scanner/parser.rb
95
96
  - lib/treerful_scanner/place.rb
97
+ - lib/treerful_scanner/png_printer.rb
96
98
  - lib/treerful_scanner/printer.rb
97
99
  - lib/treerful_scanner/time_table.rb
98
100
  homepage: https://github.com/tonytonyjan/treerful_scanner