sosowa 1.1.2 → 2.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.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 2.0
2
+
3
+ * 処理をmegalith gemに任せる形に
4
+ * Novel.ps => Novel.aft
5
+
1
6
  ## 1.1
2
7
 
3
8
  * コメント関連のバグを修成
@@ -1,3 +1,3 @@
1
1
  module Sosowa
2
- VERSION = "1.1.2"
2
+ VERSION = "2.0"
3
3
  end
data/lib/sosowa.rb CHANGED
@@ -1,64 +1,21 @@
1
1
  # coding: utf-8
2
2
 
3
- require "kconv"
4
- require "nokogiri"
5
- require "net/http"
6
- require "time"
7
- require "uri"
3
+ require "megalith"
8
4
 
9
5
  $LOAD_PATH.unshift(File.expand_path("../", __FILE__))
10
6
  require "sosowa/version"
11
- require "sosowa/scheme"
12
- require "sosowa/parser"
13
7
 
14
8
  module Sosowa
15
- BASE_URL = URI.parse("http://coolier.sytes.net:8080/sosowa/ssw_l/")
16
-
17
- protected
18
-
19
- # @param [Hash] parameter
20
- # @return [String] URL Serialized parameters
21
- def self.serialize_parameter(parameter, add_prefix=true)
22
- return "" unless parameter.class == Hash
23
- ant = Hash.new
24
- parameter.each do |key, value|
25
- ant[key.to_sym] = value.to_s
26
- end
27
- param = ant.inject(""){|k,v|k+"&#{v[0]}=#{URI.escape(v[1])}"}
28
- if add_prefix
29
- param.sub!(/^&/,"?")
30
- else
31
- param.sub!(/^&/,"")
32
- end
33
- return param ? param : ""
34
- end
35
-
36
- def self.send_req(args)
37
- params = serialize_parameter(args)
38
- path = File.join(BASE_URL.path, params)
39
-
40
- Net::HTTP.version_1_2
41
- Net::HTTP.start(BASE_URL.host, BASE_URL.port) do |http|
42
- response = http.get(path, 'User-Agent' => "Sosowa Ruby Wrapper #{Sosowa::VERSION}")
43
- return Nokogiri::HTML(response.body.toutf8)
44
- end
45
- return false
46
- end
47
-
48
- public
9
+ BASE_URL = "http://coolier.sytes.net:8080/sosowa/ssw_l/"
49
10
 
50
11
  def self.get(args={})
51
12
  args[:log] ||= 0
52
- parser = Parser.new
53
- if args.has_key?(:key)
54
- parser.fetch_novel(args[:log], args[:key])
55
- else
56
- parser.fetch_index(args[:log])
57
- end
13
+ megalith = Megalith.new(BASE_URL)
14
+ megalith.get args
58
15
  end
59
16
 
60
- def self.search(query, args={})
61
- parser = Parser.new
62
- parser.search(query, args)
63
- end
17
+ #def self.search(query, args={})
18
+ # parser = Parser.new
19
+ # parser.search(query, args)
20
+ #end
64
21
  end
data/sosowa.gemspec CHANGED
@@ -14,5 +14,5 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "sosowa"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Sosowa::VERSION
17
- gem.add_dependency "nokogiri"
17
+ gem.add_dependency "megalith"
18
18
  end
data/spec/sosowa_spec.rb CHANGED
@@ -8,35 +8,35 @@ describe Sosowa, "が #get, :log => 0 を呼ぶ時は" do
8
8
  @log = Sosowa.get :log => 0
9
9
  end
10
10
 
11
- it "Sosowa::Logを返すこと" do
12
- @log.class.should == Sosowa::Log
11
+ it "Megalith::Subjectを返すこと" do
12
+ @log.class.should == Megalith::Subject
13
13
  end
14
14
 
15
- it "最初がSosowa::Indexであること" do
16
- @log.first.class.should == Sosowa::Index
15
+ it "最初がMegalith::Indexであること" do
16
+ @log.first.class.should == Megalith::Index
17
17
  end
18
18
 
19
19
  it "最初のタイトルがStringであること" do
20
20
  @log.first.title.class.should == String
21
21
  end
22
22
 
23
- it "#next_pageがSosowa::Logを返すこと" do
24
- @log.next_page.class.should == Sosowa::Log
23
+ it "#next_pageがMegalith::Subjectを返すこと" do
24
+ @log.next_page.class.should == Megalith::Subject
25
25
  end
26
26
 
27
- it "#prev_pageがSosowa::Logを返すこと" do
28
- @log.prev_page.class.should == Sosowa::Log
27
+ it "#prev_pageがMegalith::Subjectを返すこと" do
28
+ @log.prev_page.class.should == Megalith::Subject
29
29
  end
30
30
 
31
31
  it "#latest_logがFixnumを返すこと" do
32
32
  @log.latest_log.class.should == Fixnum
33
33
  end
34
34
 
35
- it "最初を#fetchしたらSosowa::Novelを返すこと" do
36
- @log.first.fetch.class.should == Sosowa::Novel
35
+ it "最初を#fetchしたらMegalith::Novelを返すこと" do
36
+ @log.first.fetch.class.should == Megalith::Novel
37
37
  end
38
38
 
39
- it "最初を#fetchしたSosowa::Novel#titleがStringなこと" do
39
+ it "最初を#fetchしたMegalith::Novel#titleがStringなこと" do
40
40
  @log.first.fetch.title.class.should == String
41
41
  end
42
42
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sosowa
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: '2.0'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,10 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-22 00:00:00.000000000 Z
12
+ date: 2012-08-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: nokogiri
15
+ name: megalith
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
@@ -43,8 +43,6 @@ files:
43
43
  - README.md
44
44
  - Rakefile
45
45
  - lib/sosowa.rb
46
- - lib/sosowa/parser.rb
47
- - lib/sosowa/scheme.rb
48
46
  - lib/sosowa/version.rb
49
47
  - samples/chara_recognize.rb
50
48
  - samples/feature-0.3.rb
@@ -68,7 +66,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
68
66
  version: '0'
69
67
  segments:
70
68
  - 0
71
- hash: -4539044172263954536
69
+ hash: 3888570212557509469
72
70
  required_rubygems_version: !ruby/object:Gem::Requirement
73
71
  none: false
74
72
  requirements:
@@ -77,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
75
  version: '0'
78
76
  segments:
79
77
  - 0
80
- hash: -4539044172263954536
78
+ hash: 3888570212557509469
81
79
  requirements: []
82
80
  rubyforge_project:
83
81
  rubygems_version: 1.8.24
data/lib/sosowa/parser.rb DELETED
@@ -1,85 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Sosowa
4
- class Parser
5
- def initialize
6
-
7
- end
8
-
9
- def search(query, args={})
10
- page = Sosowa.send_req({:mode => :search, :type => (args[:type] ? args[:type] : :insubject), :query => query.tosjis})
11
- parse_index(page)
12
- end
13
-
14
- def fetch_index(log)
15
- page = Sosowa.send_req({:log => log})
16
- indexes = parse_index(page)
17
- abs_log_num = parse_absolute_log_number(page)
18
- Log.new(indexes, page, abs_log_num)
19
- end
20
-
21
- def parse_absolute_log_number(page)
22
- li = page.search(%{ul[@id="pages"] li > *})
23
- log = li.size
24
- li.each do |l|
25
- if l.attributes["id"] && l.attributes["id"].value == "selectedPage"
26
- return log
27
- end
28
- log -= 1
29
- end
30
- end
31
-
32
- def parse_latest_log_number(page)
33
- li = page.search(%{ul[@id="pages"] li > *})
34
- return li.size
35
- end
36
-
37
- def parse_index(page)
38
- indexes = []
39
- tr = page.search("tr")
40
- tr = tr[1, tr.size-1]
41
- num = 1
42
- tr.each do |tr|
43
- unless (tr/%{td[@class="tags"]}).size > 0
44
- title = tr.search(%{td[@class="title cell_title"] > a})[0].children[0].text.strip
45
- tags = tr.search(%{td[@class="title cell_title"] > a})[0].attributes["title"].value.split(" / ").reject{|n| n == ""}
46
- log = parse_absolute_log_number(page)
47
- key = tr.search(%{td[@class="title cell_title"] > a})[0].attributes["href"].value.gsub(/^.+key=(.+?)&.+$/, '\1').to_i
48
- author = tr.search(%{td[@class="cell_author"]})[0].inner_html.to_s.strip
49
- created_at = Time.parse(tr.search(%{td[@class="cell_created"]})[0].inner_html.to_s.strip).strftime("%Y/%m/%d %H:%M:%S")
50
- updated_at = Time.parse(tr.search(%{td[@class="cell_lastup"]})[0].inner_html.to_s.strip).strftime("%Y/%m/%d %H:%M:%S")
51
- eval = tr.search(%{td[@class="cell_eval"]})[0].inner_html.to_s.strip.split("/")
52
- review_count = eval[1].to_i
53
- comment_count = eval[0].to_i
54
- point = tr.search(%{td[@class="cell_point"]})[0].inner_html.to_s.strip.to_i
55
- rate = tr.search(%{td[@class="cell_rate"]})[0].inner_html.to_s.strip.to_f
56
- size = tr.search(%{td[@class="cell_size"]})[0].inner_html.to_s.strip
57
- url = tr.search(%{td[@class="title cell_title"] > a})[0].attributes["href"].value
58
- index = {
59
- :log => log,
60
- :key => key,
61
- :title => title,
62
- :author => author,
63
- :created_at => created_at,
64
- :updated_at => updated_at,
65
- :review_count => review_count,
66
- :comment_count => comment_count,
67
- :point => point,
68
- :tags => tags,
69
- :rate => rate,
70
- :size => size,
71
- :url => URI.join(Sosowa::BASE_URL, "?mode=read&key=#{key}&log=#{log}").to_s
72
- }
73
- indexes << Index.new(index)
74
- end
75
- num += 1
76
- end
77
- return indexes
78
- end
79
-
80
- def fetch_novel(log, key)
81
- novel = Novel.new(:log => log, :key => key)
82
- return novel
83
- end
84
- end
85
- end
data/lib/sosowa/scheme.rb DELETED
@@ -1,194 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Sosowa
4
- class Scheme
5
- attr_reader :element
6
-
7
- def initialize(element)
8
- @element = element
9
- end
10
-
11
- def method_missing(action, *args)
12
- return @element[action.to_s.to_sym] rescue nil
13
- end
14
-
15
- def params() @element.keys.map{|k|k.to_sym} ; end
16
- alias_method :available_methods, :params
17
-
18
- def to_hash
19
- @element
20
- end
21
- end
22
-
23
- class Novel < Scheme
24
- attr_reader :log
25
- attr_reader :key
26
- attr_reader :page
27
-
28
- def initialize(args)
29
- @log = args[:log] || 0
30
- @key = args[:key]
31
- @page = nil
32
- super(fetch(@log, @key))
33
- end
34
-
35
- def fetch(log, key)
36
- @page = Sosowa.send_req({:mode => :read, :log => log, :key => key})
37
- title = (@page/%{div[@class="header"] > h1})[0].inner_html.to_s.toutf8.strip
38
- tags = (@page/%{dl[@class="info"][1] > dd > a}).map{|t| t.inner_html.to_s.toutf8 }
39
- text = ""
40
- text_node = @page/%{div[@class="contents ss"]}
41
- text_node.children.each do |node|
42
- text += node.inner_html.to_s.toutf8.strip
43
- end
44
- aft = @page/%{div[@class="aft"]}
45
- ps = (aft.size > 0) ? aft[0].inner_html.to_s.toutf8 : ""
46
- author_name = (@page/%{div[@class="author"] b})[0].inner_html.to_s.toutf8
47
- author_email, author_website = (@page/%{div[@class="author"] a}).map{|e| e.attributes["href"].value}
48
- author = Author.new(:name => author_name, :email => (author_email ? author_email.gsub(/^mailto:/, "") : nil), :website => author_website)
49
- header = (@page/%{div[@class="header"] > span})[0].inner_html.to_s.toutf8.split(/\r?\n/).map{|n| n.strip}.reject{|n| n == ""}.map{|n| n.split(": ")}
50
- review = header[3][1].split("/")
51
- comments = []
52
- comment_element = (@page/%{div[@class="comments"] > dl > *})
53
- if comment_element.size > 0
54
- comment_element[1, comment_element.size-1].each_slice(2) do |element|
55
- bobj = element[0].search("b").map{|n| n.inner_html.to_s.toutf8.strip}
56
- point = element[0].search("span").inner_html.to_s.toutf8.to_i
57
- id = element[0].inner_html.to_s.toutf8.split(/\r?\n/).map{|n| n.strip}[1].to_i
58
- comment = Comment.new(
59
- :id => id,
60
- :point => point,
61
- :name => bobj[0],
62
- :created_at => bobj[1] ? Time.parse(bobj[1].gsub(/[^\/\d\s:]/, "")) : nil,
63
- :text => element[1] ? element[1].inner_html.to_s.toutf8.strip : nil
64
- )
65
- comments << comment
66
- end
67
- end
68
- novel = {
69
- :title => title,
70
- :text => text,
71
- :ps => ps,
72
- :author => author,
73
- :tags => tags,
74
- :log => log,
75
- :key => key,
76
- :created_at => Time.parse(header[1][1]).strftime("%Y/%m/%d %H:%M:%S"),
77
- :updated_at => Time.parse(header[2][1]).strftime("%Y/%m/%d %H:%M:%S"),
78
- :review_count => review[1].to_i,
79
- :comment_count => review[0].to_i,
80
- :point => header[4][1].to_i,
81
- :rate => header[5][1].to_f,
82
- :comments => comments
83
- }
84
- return novel
85
- end
86
-
87
- def simple_rating(point)
88
- # Get cookie
89
- get_params = Sosowa.serialize_parameter({
90
- :mode => :read,
91
- :key => @key,
92
- :log => @log
93
- })
94
- http = Net::HTTP.new(BASE_URL.host, BASE_URL.port)
95
- req = Net::HTTP::Get.new(BASE_URL.path)
96
- req["User-Agent"] = "Sosowa Ruby Wrapper #{Sosowa::VERSION}"
97
- res = http.request(req, get_params)
98
- cookie = res["Set-Cookie"]
99
-
100
- # Post Comment
101
- post_uri_params = Sosowa.serialize_parameter({
102
- :mode => :update,
103
- :key => @key,
104
- :log => @log,
105
- :target => :res
106
- })
107
- post_params = Sosowa.serialize_parameter({:body => "#EMPTY#".tosjis, :point => point}, false)
108
- req = Net::HTTP::Post.new(File.join(BASE_URL.path, post_uri_params))
109
- req["Cookie"] = cookie
110
- req["User-Agent"] = "Sosowa Ruby Wrapper #{Sosowa::VERSION}"
111
- res = http.request(req, post_params)
112
- return res
113
- end
114
-
115
- def comment(text, params={})
116
- # Get cookie
117
- get_params = Sosowa.serialize_parameter({
118
- :mode => :read,
119
- :key => @key,
120
- :log => @log
121
- })
122
- http = Net::HTTP.new(BASE_URL.host, BASE_URL.port)
123
- req = Net::HTTP::Get.new(BASE_URL.path)
124
- req["User-Agent"] = "Sosowa Ruby Wrapper #{Sosowa::VERSION}"
125
- res = http.request(req, get_params)
126
- cookie = res["Set-Cookie"]
127
-
128
- # Post Comment
129
- post_uri_params = Sosowa.serialize_parameter({
130
- :mode => :update,
131
- :key => @key,
132
- :log => @log,
133
- :target => :res
134
- })
135
- params.each do |k, v|
136
- params[k] = v.tosjis
137
- end
138
- post_params = Sosowa.serialize_parameter({:body => text.tosjis}.update(params), false)
139
- req = Net::HTTP::Post.new(File.join(BASE_URL.path, post_uri_params))
140
- req["Cookie"] = cookie
141
- req["User-Agent"] = "Sosowa Ruby Wrapper #{Sosowa::VERSION}"
142
- res = http.request(req, post_params)
143
- return res
144
- end
145
-
146
- def plain
147
- return @element[:text].gsub(/(<br>|\r?\n)/, "")
148
- end
149
- end
150
-
151
- class Comment < Scheme
152
-
153
- end
154
-
155
- class Author < Scheme
156
-
157
- end
158
-
159
- class Index < Scheme
160
- def fetch
161
- Novel.new(:log => @element[:log], :key => @element[:key])
162
- end
163
- alias_method :get, :fetch
164
- end
165
-
166
- class Log < Array
167
- attr_accessor :element
168
- attr_reader :log
169
-
170
- def initialize(element, page, log=0)
171
- super(element)
172
- @element = element
173
- @page = page
174
- @log = log
175
- end
176
-
177
- def next_page
178
- parser = Parser.new
179
- parser.fetch_index(@log-1)
180
- end
181
- alias_method :next, :next_page
182
-
183
- def prev_page
184
- parser = Parser.new
185
- parser.fetch_index(@log+1)
186
- end
187
- alias_method :prev, :prev_page
188
-
189
- def latest_log
190
- parser = Parser.new
191
- parser.parse_latest_log_number(@page)
192
- end
193
- end
194
- end