nogizaka_blog 0.0.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: ea0a9f704e2faf48c660bebcaefbfb7793b630da
4
+ data.tar.gz: 6a183503c5aa54db0e3c2bf20852de568b58d138
5
+ SHA512:
6
+ metadata.gz: a90f802fd94b5b9c0ee90d1da098ffbdb788d38627c46d811e282feafc6eb3da32be438cf1cfb54003d006f14d4d4fbf296b911b445a1ffd691a7a22e4b3d078
7
+ data.tar.gz: aba40c4546624000b4f698ee6515412e54899d957d3c88ca832d2a3518a6d266cbcac29fd0923e0b4cd88add7326d2ffac6fe89fe14f77a08ff3bd9b4f2791b3
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in nogizaka_blog.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 hachy
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # NogizakaBlog
2
+
3
+ Get the number of comments and articles per month from Nogizaka46's blog
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'nogizaka_blog'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install nogizaka_blog
18
+
19
+ ## Usage
20
+
21
+ $ ruby nogizaka_blog -m 201405
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( https://github.com/[my-github-username]/nogizaka_blog/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/bin/nogizaka_blog ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'nogizaka_blog'
@@ -0,0 +1,114 @@
1
+ require 'nokogiri'
2
+ require 'open-uri'
3
+ require 'net/http'
4
+
5
+ module NogizakaBlog
6
+ class Amazing
7
+ using Extentions
8
+
9
+ def initialize(yearmonth)
10
+ @yearmonth = yearmonth
11
+ @member_size = MEMBER.size
12
+ end
13
+
14
+ attr_reader :member_size
15
+
16
+ def scraping
17
+ get_max_page
18
+ @member_max.each_with_index do |(name, max), idx|
19
+ @comment = []
20
+
21
+ # @comment = 0 when redirected
22
+ if max == -1
23
+ @comment << 0
24
+ elsif max == 0
25
+ url = "http://blog.nogizaka46.com/#{name}/?d=#{@yearmonth}"
26
+ get_comment_size(url)
27
+ else
28
+ (1..max).each do |n|
29
+ url = "http://blog.nogizaka46.com/#{name}/?p=#{n}&d=#{@yearmonth}"
30
+ get_comment_size(url)
31
+ end
32
+ end
33
+
34
+ if max == -1
35
+ article = 0
36
+ else
37
+ article = @comment.length
38
+ end
39
+
40
+ yield name, @comment.sum, article, idx
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def run
47
+ puts "#{@yearmonth[0..3]}/#{@yearmonth[4..5]}"
48
+ header = display_format('name', 'comment', 'article')
49
+ puts header
50
+ puts '-' * header.size
51
+ scraping do |name, comment, article, _|
52
+ puts display_format("#{name.to_kanji}(#{name})", comment, article)
53
+ end
54
+ end
55
+
56
+ def gen_json
57
+ last = @member_size - 1
58
+ print "["
59
+ scraping do |name, comment, article, idx|
60
+ if idx == last
61
+ print "{\"name\": \"#{name.to_kanji}\", \"comment\": #{comment}, \"article\": #{article}}"
62
+ else
63
+ print "{\"name\": \"#{name.to_kanji}\", \"comment\": #{comment}, \"article\": #{article}},"
64
+ end
65
+ end
66
+ print "]"
67
+ end
68
+
69
+ def get_max_page
70
+ nbsp = Nokogiri::HTML('&nbsp;').text
71
+ @member_max = []
72
+
73
+ MEMBER.keys.each do |name|
74
+ url = "http://blog.nogizaka46.com/#{name}/?d=#{@yearmonth}"
75
+ response = Net::HTTP.get_response(URI.parse(url))
76
+
77
+ # Be redirected if it doesn't exist @yearmonth.
78
+ case response
79
+ when Net::HTTPSuccess
80
+ doc = Nokogiri::HTML(open(url))
81
+ paginate_class = doc.css('.paginate:first a:nth-last-child(2)')
82
+ if paginate_class.empty?
83
+ num = 0
84
+ else
85
+ paginate_class.each do |link|
86
+ num = link.content
87
+ end
88
+ num.gsub!(nbsp, '')
89
+ end
90
+ when Net::HTTPRedirection
91
+ num = -1
92
+ end
93
+
94
+ @member_max << [name, num.to_i]
95
+ end
96
+ end
97
+
98
+ def get_comment_size(url)
99
+ doc = Nokogiri::HTML(open(url))
100
+ doc.css('.entrybottom a:last').each do |link|
101
+ link.content.scan(/\d+/) { |c| @comment << c }
102
+ end
103
+ end
104
+
105
+ def display_format(name, comment, article)
106
+ name_length = 28 - full_width_count(name)
107
+ [name.ljust(name_length), comment.to_s.rjust(7), article.to_s.rjust(7)].join(' | ')
108
+ end
109
+
110
+ def full_width_count(string)
111
+ string.each_char.select { |char| !(/[ -~。-゚]/.match(char)) }.count
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,27 @@
1
+ require 'optparse'
2
+
3
+ module NogizakaBlog
4
+ OptionParser.new do |opt|
5
+ opt.banner = "Usage: ruby nogizaka_blog.rb -m 201404"
6
+
7
+ opt.on('-m [yearmonth]', "specify the month you want to get. ex. 201404") do |yearmonth|
8
+ @yearmonth = yearmonth
9
+ unless ARGV.include?("-j")
10
+ nogizaka = NogizakaBlog::Amazing.new(@yearmonth)
11
+ nogizaka.__send__ :run
12
+ end
13
+ end
14
+
15
+ opt.on('-j', 'JSON format') do
16
+ nogizaka = NogizakaBlog::Amazing.new(@yearmonth)
17
+ nogizaka.__send__ :gen_json
18
+ end
19
+
20
+ opt.on_tail('-v', '--version', 'Show version') do
21
+ puts "NogizakaBlog #{NogizakaBlog::VERSION}"
22
+ exit
23
+ end
24
+
25
+ opt.parse!(ARGV)
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ module NogizakaBlog
2
+ module Extentions
3
+ refine String do
4
+ def to_kanji
5
+ MEMBER[self]
6
+ end
7
+ end
8
+
9
+ refine Array do
10
+ def sum
11
+ map(&:to_i).inject(:+)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module NogizakaBlog
2
+ MEMBER = {"manatsu.akimoto"=>"秋元真夏", "erika.ikuta"=>"生田絵梨花", "rina.ikoma"=>"生駒里奈", "rena.ichiki"=>"市來玲奈", "nene.ito"=>"伊藤寧々", "marika.ito"=>"伊藤万理華", "sayuri.inoue"=>"井上小百合", "misa.eto"=>"衛藤美彩", "hina.kawago"=>"川後陽菜", "mahiro.kawamura"=>"川村真洋", "hinako.kitano"=>"北野日奈子", "asuka.saito"=>"齋藤飛鳥", "chiharu.saito"=>"斎藤ちはる", "yuuri.saito"=>"斉藤優里", "reika.sakurai"=>"桜井玲香", "mai.shiraishi"=>"白石麻衣", "mai.shinuchi"=>"新内眞衣", "kazumi.takayama"=>"高山一実", "kana.nakada"=>"中田花奈", "himeka.nakamoto"=>"中元日芽香", "seira.nagashima"=>"永島聖羅", "nanase.nishino"=>"西野七瀬", "ami.noujo"=>"能條愛未", "nanami.hashimoto"=>"橋本奈々未", "seira.hatanaka"=>"畠中清羅", "hina.higuchi"=>"樋口日奈", "mai.fukagawa"=>"深川麻衣", "minami.hoshino"=>"星野みなみ", "miona.hori"=>"堀未央奈", "sayuri.matsumura"=>"松村沙友理", "rina.yamato"=>"大和里菜", "yumi.wakatsuki"=>"若月佑美", "maaya.wada"=>"和田まあや"}.freeze
3
+ end
@@ -0,0 +1,3 @@
1
+ module NogizakaBlog
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,5 @@
1
+ require 'nogizaka_blog/version'
2
+ require 'nogizaka_blog/member'
3
+ require 'nogizaka_blog/core_ext'
4
+ require 'nogizaka_blog/amazing'
5
+ require 'nogizaka_blog/cli'
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'nogizaka_blog/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "nogizaka_blog"
8
+ spec.version = NogizakaBlog::VERSION
9
+ spec.authors = ["hachy"]
10
+ spec.email = ["pekoett@gmail.com"]
11
+ spec.summary = %q{Get the number of comments and articles per month from Nogizaka46's blog}
12
+ spec.description = %q{Get the number of comments and articles per month from Nogizaka46's blog}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'nokogiri'
22
+ spec.add_development_dependency "bundler", "~> 1.6"
23
+ spec.add_development_dependency "rake"
24
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nogizaka_blog
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - hachy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
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.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Get the number of comments and articles per month from Nogizaka46's blog
56
+ email:
57
+ - pekoett@gmail.com
58
+ executables:
59
+ - nogizaka_blog
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - bin/nogizaka_blog
69
+ - lib/nogizaka_blog.rb
70
+ - lib/nogizaka_blog/amazing.rb
71
+ - lib/nogizaka_blog/cli.rb
72
+ - lib/nogizaka_blog/core_ext.rb
73
+ - lib/nogizaka_blog/member.rb
74
+ - lib/nogizaka_blog/version.rb
75
+ - nogizaka_blog.gemspec
76
+ homepage: ''
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.2.2
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Get the number of comments and articles per month from Nogizaka46's blog
100
+ test_files: []