nthuevent 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7c73ab820a67a71b30aa865d86d127e92d3c36e0
4
+ data.tar.gz: 672fd8ebd74712b3837f336cfa405fb1588ed0bd
5
+ SHA512:
6
+ metadata.gz: be1466d9dfa7ff8b297838ea56416043a9c827a2d6e72b0c0b90bdb3f351438ea9f549d329967de26c0699cad1830d9801849f7ebd589c89b713fb22d93bbc73
7
+ data.tar.gz: 47b6dbcd9ac4cf98f8727b12f51cc175b17077a40f0cd86cae54ce4dd9a6175342b6d3a8ca5245693117f5bc308aaad88a9c654017a66e01437b9b2fda71188a
data/.gitignore ADDED
@@ -0,0 +1,53 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ # Used by dotenv library to load environment variables.
14
+ # .env
15
+
16
+ ## Specific to RubyMotion:
17
+ .dat*
18
+ .repl_history
19
+ build/
20
+ *.bridgesupport
21
+ build-iPhoneOS/
22
+ build-iPhoneSimulator/
23
+
24
+ ## Specific to RubyMotion (use of CocoaPods):
25
+ #
26
+ # We recommend against adding the Pods directory to your .gitignore. However
27
+ # you should judge for yourself, the pros and cons are mentioned at:
28
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
29
+ #
30
+ # vendor/Pods/
31
+
32
+ ## Documentation cache and generated files:
33
+ /.yardoc/
34
+ /_yardoc/
35
+ /doc/
36
+ /rdoc/
37
+
38
+ ## Environment normalization:
39
+ /.bundle/
40
+ /vendor/bundle
41
+ /lib/bundler/man/
42
+
43
+ # for a library or gem, you might want to ignore these files since the code is
44
+ # intended to run in multiple environments; otherwise, check them in:
45
+ # Gemfile.lock
46
+ # .ruby-version
47
+ # .ruby-gemset
48
+
49
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
50
+ .rvmrc
51
+
52
+ # macOS file system
53
+ .DS_Store
data/.rubocop.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ AllCops:
3
+ TargetRubyVersion: 2.3
4
+
5
+ Style/LineLength:
6
+ Enabled: true
7
+ Max: 120
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ source 'https://rubygems.org'
3
+
4
+ gem 'nokogiri'
5
+ gem 'rubocop'
data/Gemfile.lock ADDED
@@ -0,0 +1,29 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ ast (2.3.0)
5
+ mini_portile2 (2.1.0)
6
+ nokogiri (1.6.8.1)
7
+ mini_portile2 (~> 2.1.0)
8
+ parser (2.3.2.0)
9
+ ast (~> 2.2)
10
+ powerpack (0.1.1)
11
+ rainbow (2.1.0)
12
+ rubocop (0.45.0)
13
+ parser (>= 2.3.1.1, < 3.0)
14
+ powerpack (~> 0.1)
15
+ rainbow (>= 1.99.1, < 3.0)
16
+ ruby-progressbar (~> 1.7)
17
+ unicode-display_width (~> 1.0, >= 1.0.1)
18
+ ruby-progressbar (1.8.1)
19
+ unicode-display_width (1.1.1)
20
+
21
+ PLATFORMS
22
+ ruby
23
+
24
+ DEPENDENCIES
25
+ nokogiri
26
+ rubocop
27
+
28
+ BUNDLED WITH
29
+ 1.13.6
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT LICENSE
2
+
3
+ Copyright (c)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/bin/nthuevent ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
+ require 'nthu_event'
5
+
6
+ event_type = ARGV[0] || 'admin'
7
+ # unless event_type
8
+ # puts 'USAGE: nthuevent [org_id]'
9
+ # exit(1)
10
+ # end
11
+
12
+ events = NthuEvent::Event.find(type: event_type, page: 1)
13
+
14
+ unless events.nil?
15
+ events.first(3).each.with_index(1) do |event, index|
16
+ print "#{index}: "
17
+ puts "#{event.title} (#{event.date})"
18
+ puts event.content
19
+ puts
20
+ end
21
+ end
data/lib/crawl.rb ADDED
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+ require 'nokogiri'
3
+ require 'uri'
4
+
5
+ admin_board_uri = 'http://bulletin.web.nthu.edu.tw/files/40-1912-5074-1.php?Lang=zh-tw'
6
+
7
+ doc = Nokogiri::HTML(open(admin_board_uri))
8
+
9
+ events = doc.css('div.h5').map do |node|
10
+ date = node.css('.date').text.gsub(/[\[\]\s]+/, '')
11
+ event_node = node.css('.ptname a')
12
+ link = URI.join(admin_board_uri, event_node.attr('href').value)
13
+
14
+ title = event_node.attr('title').value
15
+ content_doc = Nokogiri::HTML(open(link))
16
+ content = content_doc.css('.ptcontent').text.strip
17
+
18
+ { title: title, content: content, link: link, date: date }
19
+ end
20
+
21
+ events.each do |event|
22
+ puts event
23
+ end
data/lib/nthu_event.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ files = Dir.glob(File.join(File.dirname(__FILE__), 'nthuevent/*.rb'))
4
+ files.each { |lib| require_relative lib }
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'nthu_event_api'
3
+
4
+ module NthuEvent
5
+ # Single event on organiztion's feed
6
+ class Event
7
+ attr_reader :title, :content, :url, :date
8
+
9
+ def initialize(event_data)
10
+ load_data(event_data)
11
+ end
12
+
13
+ def self.find(type: nil, page: nil)
14
+ events_data = NthuEvent::NthuEventApi.events(type: type, page: page)
15
+ events = events_data.map do |event_data|
16
+ new(event_data)
17
+ end
18
+ events
19
+ end
20
+
21
+ private
22
+
23
+ def load_data(event_data)
24
+ @title = event_data[:title]
25
+ @content = event_data[:content]
26
+ @url = event_data[:url]
27
+ @date = event_data[:date]
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+ require 'open-uri'
3
+ require 'nokogiri'
4
+ require 'uri'
5
+
6
+ module NthuEvent
7
+ # Service for all FB API calls
8
+ class NthuEventApi
9
+ BASE_URL = 'http://bulletin.web.nthu.edu.tw/files/'
10
+ EVENT_TYPE_URL = {
11
+ admin: '40-1912-5074',
12
+ recruit_internal: '40-1912-5075',
13
+ recruit_external: '40-1912-5081',
14
+ admission: '40-1912-5082',
15
+ art: '40-1912-5083',
16
+ academic: '40-1912-5084',
17
+ student: '40-1912-5085',
18
+ others: '40-1912-5086'
19
+ }.freeze
20
+
21
+ def self.events(type: :admin, page: 0)
22
+ type = EVENT_TYPE_URL[type.to_sym]
23
+ events, totalpage = get_event_list("#{BASE_URL}#{type}-#{page}.php")
24
+ return events if page.positive?
25
+
26
+ # get all pages if page is zero
27
+ (2..totalpage).each do |p|
28
+ evnts, _total = get_event_list("#{BASE_URL}#{type}-#{p}.php")
29
+ events += evnts
30
+ end
31
+ events
32
+ end
33
+
34
+ private_class_method
35
+
36
+ def self.get_event_list(url)
37
+ doc = Nokogiri::HTML(open(url))
38
+ events = doc.css('div.h5').map do |node|
39
+ date, link, title = parse_event_metadata(node)
40
+ content = get_event_content(link)
41
+
42
+ { title: title, content: content, url: link, date: date }
43
+ end
44
+
45
+ # get total page
46
+ totalpage = get_pagenum_from_url(doc.css('#navigate a.pagenum').attr('href').value)
47
+ [events, totalpage]
48
+ end
49
+
50
+ def self.parse_event_metadata(node)
51
+ date = node.css('.date').text.gsub(/[\[\]\s]+/, '')
52
+ event_node = node.css('.ptname a')
53
+ link = URI.join(BASE_URL, event_node.attr('href').value)
54
+ title = event_node.attr('title').value
55
+ [date, link, title]
56
+ end
57
+
58
+ def self.get_event_content(url)
59
+ content_doc = Nokogiri::HTML(open(url))
60
+ content = content_doc.css('.ptcontent').text.strip
61
+ content
62
+ end
63
+
64
+ private_class_method
65
+
66
+ def self.get_pagenum_from_url(url)
67
+ match_data = url.match('-(\d+)\.php')
68
+ Integer(match_data.captures[0])
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NthuEvent
4
+ VERSION = '0.1.1'
5
+ end
data/nthuevent.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ require 'nthuevent/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'nthuevent'
7
+ s.version = NthuEvent::VERSION
8
+
9
+ s.summary = 'Gets event content from NTHU bulletin'
10
+ s.description = 'Extracts the title, content, and other informaiton of an event'
11
+ s.authors = ['JJC', 'Rollee Chen', 'shannywu']
12
+ s.email = ['jjc@nlplab.cc']
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- spec/*`.split("\n")
16
+ s.executables << 'nthuevent'
17
+
18
+ s.add_runtime_dependency 'nokogiri', '~> 1.6'
19
+
20
+ s.add_development_dependency 'minitest', '~> 5.9'
21
+ s.add_development_dependency 'minitest-rg', '~> 5.2'
22
+ s.add_development_dependency 'rake', '~> 11.3'
23
+ s.add_development_dependency 'vcr', '~> 3.0'
24
+ s.add_development_dependency 'webmock', '~> 2.1'
25
+ s.add_development_dependency 'simplecov', '~> 0.12'
26
+ s.add_development_dependency 'flog', '~> 4.4'
27
+ s.add_development_dependency 'flay', '~> 2.8'
28
+ s.add_development_dependency 'rubocop', '~> 0.42'
29
+
30
+ s.homepage = 'https://github.com/twentyfour7/nthu-event'
31
+ s.license = 'MIT'
32
+ end
metadata ADDED
@@ -0,0 +1,199 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nthuevent
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - JJC
8
+ - Rollee Chen
9
+ - shannywu
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2017-01-06 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.6'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '1.6'
29
+ - !ruby/object:Gem::Dependency
30
+ name: minitest
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '5.9'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '5.9'
43
+ - !ruby/object:Gem::Dependency
44
+ name: minitest-rg
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '5.2'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '5.2'
57
+ - !ruby/object:Gem::Dependency
58
+ name: rake
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '11.3'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '11.3'
71
+ - !ruby/object:Gem::Dependency
72
+ name: vcr
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '3.0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '3.0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: webmock
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '2.1'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '2.1'
99
+ - !ruby/object:Gem::Dependency
100
+ name: simplecov
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '0.12'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '0.12'
113
+ - !ruby/object:Gem::Dependency
114
+ name: flog
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '4.4'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '4.4'
127
+ - !ruby/object:Gem::Dependency
128
+ name: flay
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '2.8'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '2.8'
141
+ - !ruby/object:Gem::Dependency
142
+ name: rubocop
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '0.42'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '0.42'
155
+ description: Extracts the title, content, and other informaiton of an event
156
+ email:
157
+ - jjc@nlplab.cc
158
+ executables:
159
+ - nthuevent
160
+ extensions: []
161
+ extra_rdoc_files: []
162
+ files:
163
+ - ".gitignore"
164
+ - ".rubocop.yml"
165
+ - Gemfile
166
+ - Gemfile.lock
167
+ - LICENSE
168
+ - bin/nthuevent
169
+ - lib/crawl.rb
170
+ - lib/nthu_event.rb
171
+ - lib/nthuevent/event.rb
172
+ - lib/nthuevent/nthu_event_api.rb
173
+ - lib/nthuevent/version.rb
174
+ - nthuevent.gemspec
175
+ homepage: https://github.com/twentyfour7/nthu-event
176
+ licenses:
177
+ - MIT
178
+ metadata: {}
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 2.5.1
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: Gets event content from NTHU bulletin
199
+ test_files: []