simple2ch 0.1.8 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +25 -0
  4. data/.travis.yml +8 -0
  5. data/README.md +24 -31
  6. data/UPDATES.md +46 -9
  7. data/lib/simple2ch.rb +67 -83
  8. data/lib/simple2ch/bbs.rb +54 -0
  9. data/lib/simple2ch/board.rb +26 -50
  10. data/lib/simple2ch/dat.rb +22 -20
  11. data/lib/simple2ch/regex.rb +16 -0
  12. data/lib/simple2ch/{res.rb → response.rb} +58 -57
  13. data/lib/simple2ch/simple2ch_error.rb +9 -0
  14. data/lib/simple2ch/thread.rb +113 -0
  15. data/lib/simple2ch/version.rb +1 -1
  16. data/simple2ch.gemspec +8 -0
  17. data/spec/bbs_spec.rb +30 -0
  18. data/spec/board_spec.rb +89 -54
  19. data/spec/dat_spec.rb +20 -19
  20. data/spec/response_spec.rb +131 -0
  21. data/spec/simple2ch_spec.rb +19 -50
  22. data/spec/spec_helper.rb +65 -37
  23. data/spec/thread_spec.rb +76 -0
  24. data/spec/vcr/Simple2ch_BBS/_boards/use_cache/behaves_like_boards/from_2ch_sc/1_1_1_1_1_2.yml +1117 -0
  25. data/spec/vcr/Simple2ch_BBS/_boards/use_cache/behaves_like_boards/from_open2ch_net/1_1_1_1_2_2.yml +1136 -0
  26. data/spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_2ch_sc/1_1_2_1_1_2.yml +1117 -0
  27. data/spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_2ch_sc/1_1_2_1_1_3.yml +1117 -0
  28. data/spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_open2ch_net/1_1_2_1_2_2.yml +1136 -0
  29. data/spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_open2ch_net/1_1_2_1_2_3.yml +1136 -0
  30. data/spec/vcr/Simple2ch_Board/_threads/1_4_1.yml +1238 -0
  31. data/spec/vcr/Simple2ch_Board/_threads/1_4_2.yml +1238 -0
  32. data/spec/vcr/Simple2ch_Board/_threads/1_4_3.yml +1238 -0
  33. data/spec/vcr/Simple2ch_Board/_threads/1_4_7.yml +1238 -0
  34. data/spec/vcr/Simple2ch_Board/_threads/1_4_8.yml +1238 -0
  35. data/spec/vcr/Simple2ch_Board/_threads/1_4_9.yml +1238 -0
  36. data/spec/vcr/Simple2ch_Dat/should_have_responses/1_2_1.yml +953 -0
  37. data/spec/vcr/Simple2ch_Dat/should_have_responses/1_2_3.yml +953 -0
  38. data/spec/vcr/Simple2ch_Dat/should_have_responses/1_2_4.yml +953 -0
  39. data/spec/vcr/Simple2ch_Dat/should_have_responses/size/1_2_2_1.yml +953 -0
  40. data/spec/vcr/Simple2ch_Response/_anchors/when_a_thre_have_both_id_and_non-id_responses/1_2_7_1.yml +5321 -0
  41. data/spec/vcr/Simple2ch_Response/_parse/when_real_data/when_2ch_sc/1_1_2_1_1.yml +1599 -0
  42. data/spec/vcr/Simple2ch_Response/_parse/when_real_data/when_open2ch_net/1_1_2_2_1.yml +1465 -0
  43. data/spec/vcr/Simple2ch_Thread/_new/2ch_sc/1_1_1_1.yml +1410 -0
  44. data/spec/vcr/Simple2ch_Thread/_new/2ch_sc/1_1_1_2.yml +1692 -0
  45. data/spec/vcr/Simple2ch_Thread/_new/open2ch_net/1_1_2_1.yml +1410 -0
  46. data/spec/vcr/Simple2ch_Thread/_new/open2ch_net/1_1_2_2.yml +1999 -0
  47. data/spec/vcr/Simple2ch_Thread/_responses/1_2_1.yml +1599 -0
  48. data/spec/vcr/Simple2ch_Thread/_responses/first/1_2_2_1.yml +1599 -0
  49. data/spec/vcr/Simple2ch_Thread/_responses/first/1_2_3_1.yml +1599 -0
  50. data/spec/vcr/Simple2ch_Thread/_title/1_3_1.yml +1599 -0
  51. data/spec/vcr/Simple2ch_Thread/_title/size/1_3_2_1.yml +1599 -0
  52. metadata +185 -11
  53. data/lib/simple2ch/simple2ch_exception.rb +0 -7
  54. data/lib/simple2ch/thre.rb +0 -140
  55. data/spec/res_spec.rb +0 -123
  56. data/spec/thre_spec.rb +0 -122
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple2ch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dogwood008
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-09 00:00:00.000000000 Z
11
+ date: 2016-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,76 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
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
+ - !ruby/object:Gem::Dependency
98
+ name: pry-byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-stack_explorer
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: vcr
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: webmock
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.1'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.1'
83
153
  - !ruby/object:Gem::Dependency
84
154
  name: charwidth
85
155
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +164,48 @@ dependencies:
94
164
  - - "~>"
95
165
  - !ruby/object:Gem::Version
96
166
  version: 0.1.3
167
+ - !ruby/object:Gem::Dependency
168
+ name: htmlentities
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 4.3.3
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 4.3.3
181
+ - !ruby/object:Gem::Dependency
182
+ name: retryable
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 2.0.1
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 2.0.1
195
+ - !ruby/object:Gem::Dependency
196
+ name: bbs_2ch_url_validator
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.1'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '0.1'
97
209
  description: 2ch Japanese BBS simple reader.
98
210
  email:
99
211
  - dogwood008+rubygems@gmail.com
@@ -102,25 +214,59 @@ extensions: []
102
214
  extra_rdoc_files: []
103
215
  files:
104
216
  - ".gitignore"
217
+ - ".rspec"
218
+ - ".rubocop.yml"
219
+ - ".travis.yml"
105
220
  - Gemfile
106
221
  - LICENSE.txt
107
222
  - README.md
108
223
  - Rakefile
109
224
  - UPDATES.md
110
225
  - lib/simple2ch.rb
226
+ - lib/simple2ch/bbs.rb
111
227
  - lib/simple2ch/board.rb
112
228
  - lib/simple2ch/dat.rb
113
- - lib/simple2ch/res.rb
114
- - lib/simple2ch/simple2ch_exception.rb
115
- - lib/simple2ch/thre.rb
229
+ - lib/simple2ch/regex.rb
230
+ - lib/simple2ch/response.rb
231
+ - lib/simple2ch/simple2ch_error.rb
232
+ - lib/simple2ch/thread.rb
116
233
  - lib/simple2ch/version.rb
117
234
  - simple2ch.gemspec
235
+ - spec/bbs_spec.rb
118
236
  - spec/board_spec.rb
119
237
  - spec/dat_spec.rb
120
- - spec/res_spec.rb
238
+ - spec/response_spec.rb
121
239
  - spec/simple2ch_spec.rb
122
240
  - spec/spec_helper.rb
123
- - spec/thre_spec.rb
241
+ - spec/thread_spec.rb
242
+ - spec/vcr/Simple2ch_BBS/_boards/use_cache/behaves_like_boards/from_2ch_sc/1_1_1_1_1_2.yml
243
+ - spec/vcr/Simple2ch_BBS/_boards/use_cache/behaves_like_boards/from_open2ch_net/1_1_1_1_2_2.yml
244
+ - spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_2ch_sc/1_1_2_1_1_2.yml
245
+ - spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_2ch_sc/1_1_2_1_1_3.yml
246
+ - spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_open2ch_net/1_1_2_1_2_2.yml
247
+ - spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_open2ch_net/1_1_2_1_2_3.yml
248
+ - spec/vcr/Simple2ch_Board/_threads/1_4_1.yml
249
+ - spec/vcr/Simple2ch_Board/_threads/1_4_2.yml
250
+ - spec/vcr/Simple2ch_Board/_threads/1_4_3.yml
251
+ - spec/vcr/Simple2ch_Board/_threads/1_4_7.yml
252
+ - spec/vcr/Simple2ch_Board/_threads/1_4_8.yml
253
+ - spec/vcr/Simple2ch_Board/_threads/1_4_9.yml
254
+ - spec/vcr/Simple2ch_Dat/should_have_responses/1_2_1.yml
255
+ - spec/vcr/Simple2ch_Dat/should_have_responses/1_2_3.yml
256
+ - spec/vcr/Simple2ch_Dat/should_have_responses/1_2_4.yml
257
+ - spec/vcr/Simple2ch_Dat/should_have_responses/size/1_2_2_1.yml
258
+ - spec/vcr/Simple2ch_Response/_anchors/when_a_thre_have_both_id_and_non-id_responses/1_2_7_1.yml
259
+ - spec/vcr/Simple2ch_Response/_parse/when_real_data/when_2ch_sc/1_1_2_1_1.yml
260
+ - spec/vcr/Simple2ch_Response/_parse/when_real_data/when_open2ch_net/1_1_2_2_1.yml
261
+ - spec/vcr/Simple2ch_Thread/_new/2ch_sc/1_1_1_1.yml
262
+ - spec/vcr/Simple2ch_Thread/_new/2ch_sc/1_1_1_2.yml
263
+ - spec/vcr/Simple2ch_Thread/_new/open2ch_net/1_1_2_1.yml
264
+ - spec/vcr/Simple2ch_Thread/_new/open2ch_net/1_1_2_2.yml
265
+ - spec/vcr/Simple2ch_Thread/_responses/1_2_1.yml
266
+ - spec/vcr/Simple2ch_Thread/_responses/first/1_2_2_1.yml
267
+ - spec/vcr/Simple2ch_Thread/_responses/first/1_2_3_1.yml
268
+ - spec/vcr/Simple2ch_Thread/_title/1_3_1.yml
269
+ - spec/vcr/Simple2ch_Thread/_title/size/1_3_2_1.yml
124
270
  homepage: https://github.com/dogwood008/simple2ch
125
271
  licenses:
126
272
  - MIT
@@ -141,15 +287,43 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
287
  version: '0'
142
288
  requirements: []
143
289
  rubyforge_project:
144
- rubygems_version: 2.2.2
290
+ rubygems_version: 2.5.1
145
291
  signing_key:
146
292
  specification_version: 4
147
293
  summary: 2ch Japanese BBS simple reader.
148
294
  test_files:
295
+ - spec/bbs_spec.rb
149
296
  - spec/board_spec.rb
150
297
  - spec/dat_spec.rb
151
- - spec/res_spec.rb
298
+ - spec/response_spec.rb
152
299
  - spec/simple2ch_spec.rb
153
300
  - spec/spec_helper.rb
154
- - spec/thre_spec.rb
155
- has_rdoc:
301
+ - spec/thread_spec.rb
302
+ - spec/vcr/Simple2ch_BBS/_boards/use_cache/behaves_like_boards/from_2ch_sc/1_1_1_1_1_2.yml
303
+ - spec/vcr/Simple2ch_BBS/_boards/use_cache/behaves_like_boards/from_open2ch_net/1_1_1_1_2_2.yml
304
+ - spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_2ch_sc/1_1_2_1_1_2.yml
305
+ - spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_2ch_sc/1_1_2_1_1_3.yml
306
+ - spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_open2ch_net/1_1_2_1_2_2.yml
307
+ - spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_open2ch_net/1_1_2_1_2_3.yml
308
+ - spec/vcr/Simple2ch_Board/_threads/1_4_1.yml
309
+ - spec/vcr/Simple2ch_Board/_threads/1_4_2.yml
310
+ - spec/vcr/Simple2ch_Board/_threads/1_4_3.yml
311
+ - spec/vcr/Simple2ch_Board/_threads/1_4_7.yml
312
+ - spec/vcr/Simple2ch_Board/_threads/1_4_8.yml
313
+ - spec/vcr/Simple2ch_Board/_threads/1_4_9.yml
314
+ - spec/vcr/Simple2ch_Dat/should_have_responses/1_2_1.yml
315
+ - spec/vcr/Simple2ch_Dat/should_have_responses/1_2_3.yml
316
+ - spec/vcr/Simple2ch_Dat/should_have_responses/1_2_4.yml
317
+ - spec/vcr/Simple2ch_Dat/should_have_responses/size/1_2_2_1.yml
318
+ - spec/vcr/Simple2ch_Response/_anchors/when_a_thre_have_both_id_and_non-id_responses/1_2_7_1.yml
319
+ - spec/vcr/Simple2ch_Response/_parse/when_real_data/when_2ch_sc/1_1_2_1_1.yml
320
+ - spec/vcr/Simple2ch_Response/_parse/when_real_data/when_open2ch_net/1_1_2_2_1.yml
321
+ - spec/vcr/Simple2ch_Thread/_new/2ch_sc/1_1_1_1.yml
322
+ - spec/vcr/Simple2ch_Thread/_new/2ch_sc/1_1_1_2.yml
323
+ - spec/vcr/Simple2ch_Thread/_new/open2ch_net/1_1_2_1.yml
324
+ - spec/vcr/Simple2ch_Thread/_new/open2ch_net/1_1_2_2.yml
325
+ - spec/vcr/Simple2ch_Thread/_responses/1_2_1.yml
326
+ - spec/vcr/Simple2ch_Thread/_responses/first/1_2_2_1.yml
327
+ - spec/vcr/Simple2ch_Thread/_responses/first/1_2_3_1.yml
328
+ - spec/vcr/Simple2ch_Thread/_title/1_3_1.yml
329
+ - spec/vcr/Simple2ch_Thread/_title/size/1_3_2_1.yml
@@ -1,7 +0,0 @@
1
- module Simple2ch
2
- class Simple2chException < StandardError; end
3
- class NotA2chUrlException < Simple2chException; end
4
- class KakoLogException < Simple2chException; end
5
- class DatParseException < Simple2chException; end
6
- class NoThreGivenException < Simple2chException; end
7
- end
@@ -1,140 +0,0 @@
1
- module Simple2ch
2
- class Thre
3
- # @return [String] スレッドキー(Unix time)
4
- attr_reader :thread_key
5
- # @return [Fixnum] 返信の数
6
- attr_reader :num_of_response
7
- # @return [Board] 属する板
8
- attr_reader :board
9
-
10
- # @param [Board] board スレッドが属する板情報
11
- # @param [String] thread_key スレッドキー
12
- # @param [String] title スレッド名
13
- # @param [Fixnum] num_of_response 総書き込み数
14
- def initialize(board, thread_key, title: '', num_of_response: '')
15
- @board = board
16
- @thread_key = thread_key
17
- @title = title
18
- @num_of_response = num_of_response
19
- @reses = nil
20
- @f_kako_log = nil
21
- @received_anchors = nil
22
- end
23
-
24
- # 板オブジェクトとsubject.txtの1行データを渡すとスレオブジェクトを返す
25
- # @param [Board] board スレッドが属する板情報
26
- # @param [String] thread_data 0000000000.dat<>スレッドタイトル (レス数)
27
- # @return [Thre] スレ
28
- def self.parse(board, thread_data)
29
- thread_data =~ /(\d{10})\.dat<>(.+) \((\d+)\)/
30
- hash = {}
31
- thread_key = $1
32
- hash[:title] = $2
33
- hash[:num_of_response] = $3.to_i
34
- self.new board, thread_key, hash
35
- end
36
-
37
- # スレのURLからスレオブジェクトを生成して返す
38
- # @param [String] url URL
39
- # @return [Thre] スレ
40
- def self.create_from_url(url)
41
- board = Simple2ch::Board.new('', url, fetch_title: true)
42
- thread_key = Simple2ch.parse_url(url)[:thread_key]
43
- thre = board.thres.find{|t| t.thread_key == thread_key}
44
- unless thre
45
- thre = Thre.new board, thread_key
46
- thre.reses
47
- end
48
- thre
49
- end
50
-
51
- # Datを解析して、レスを返す
52
- # @param [Array<Fixnum>,Fixnum] num_of_reses 取得したいレス番号
53
- # @return [Array<Res>] レスの配列
54
- def reses(num_of_reses=nil)
55
- fetch_dat unless @reses
56
- case num_of_reses
57
- when Array
58
- if num_of_reses.size > 0
59
- @reses.find_all { |r|
60
- num_of_reses.index(r.res_num)
61
- }
62
- else
63
- raise 'Blank array was given.'
64
- end
65
- when Fixnum
66
- @reses.find { |r| r.res_num == num_of_reses }
67
- when NilClass
68
- @reses
69
- end
70
- end
71
- alias_method :res, :reses
72
-
73
- # 過去ログかどうかを返す
74
- # @return [Boolean] 過去ログか否か
75
- def kako_log?
76
- fetch_dat if @f_kako_log.nil?
77
- @f_kako_log
78
- end
79
-
80
- # 全てのレスに対し、あるレスへのアンカーが書き込まれているレス番号のハッシュを返す
81
- # @return [Hash]{ res_num<Fixnum> => res_nums<Array<Fixnum>> } レス番号のハッシュ
82
- def received_anchors
83
- @received_anchors ||= calc_received_anchors
84
- end
85
-
86
- # 2chタイプ名の取得
87
- # @return [Symbol] 2chタイプ名(:net, :sc, :open)
88
- def type_of_2ch
89
- @board ? @board.type_of_2ch : nil
90
- end
91
-
92
- # スレのURLを返す
93
- # @return [String] スレのURL
94
- def url
95
- tld = type_of_2ch == :sc ? :sc : :net
96
- "http://#{@board.server_name}.#{type_of_2ch==:open ? 'open' : ''}2ch.#{tld}/test/read.cgi/#{@board.board_name}/#{@thread_key}/"
97
- end
98
-
99
- # スレのdatURLを返す
100
- # @return [String] スレのdatURL
101
- def dat_url
102
- tld = type_of_2ch == :sc ? :sc : :net
103
- "http://#{@board.server_name}.#{type_of_2ch==:open ? 'open' : ''}2ch.#{tld}/#{@board.board_name}/dat/#{@thread_key}.dat"
104
- end
105
-
106
- # タイトルを返す
107
- # @return [String] スレッドの名前
108
- def title
109
- unless @title
110
- fetch_dat
111
- end
112
- @title
113
- end
114
-
115
- private
116
- # 全てのレスに対し、あるレスへのアンカーが書き込まれているレス番号のハッシュを返す
117
- # @return [Hash]{ res_num<Fixnum> => res_nums<Array<Fixnum>> } レス番号のハッシュ
118
- def calc_received_anchors
119
- ret = {}
120
- reses.each do |res|
121
- res.anchors.each do |anchor|
122
- ret.store(anchor, ret.fetch(anchor, []).push(res.res_num))
123
- end
124
- end
125
- ret
126
- end
127
-
128
- # Datを取ってきてレスと過去ログかどうかを返す
129
- # @return [Boolean] f_kako_log 過去ログか否か
130
- def fetch_dat
131
- dat = Dat.new(self)
132
- @reses = dat.reses
133
- @num_of_response = @reses.size
134
- @f_kako_log = dat.kako_log?
135
- @title = dat.title if !@title || @title.empty?
136
- dat = nil
137
- @f_kako_log
138
- end
139
- end
140
- end
data/spec/res_spec.rb DELETED
@@ -1,123 +0,0 @@
1
- require 'rspec'
2
- require 'spec_helper'
3
-
4
- describe Simple2ch::Res do
5
- let(:dat_data) { %q{以下、\(^o^)/でVIPがお送りします<><>2014/09/04(木) 18:46:36.03 ID:wBAvTswZ0.net<> http://livedoor.blogimg.jp/hatima/imgs/b/c/bccae87d.jpg <br> <br> <br> ※二次創作ではなく、公式です <>古参よ、これが今の東方projectだ
6
- 以下、\(^o^)/でVIPがお送りします<><>2014/09/04(木) 18:47:10.12 ID:X4fy/81O0.net<> うそつけ <>
7
- 以下、\(^o^)/でVIPがお送りします<><>2014/09/04(木) 18:47:14.08 ID:WDyAzc5v0.net<> 嘘乙 <>
8
- 以下、\(^o^)/でVIPがお送りします<><>2014/09/04(木) 18:47:19.71 ID:9QYJSuKn0.net<> 正直楽しみ <>
9
- 以下、\(^o^)/でVIPがお送りします<><>2014/09/04(木) 18:47:35.65 ID:rbjZvMWo0.net<> はてぃま <>
10
- 以下、\(^o^)/でVIPがお送りします<><>2014/09/04(木) 18:47:41.41 ID:bHgEtoQU0.net<> 思い切り二次創作じゃねえか <br> PS4でやるんだっけ <>} }
11
- let(:res) { dat_data.split(/\n/).map.with_index(1) { |d, i| Simple2ch::Res.parse i, d } }
12
-
13
- describe 'should have res number' do
14
- subject { res[0].res_num }
15
- it { is_expected.to be_a_kind_of(Numeric) }
16
- it { is_expected.to be > 0 }
17
- end
18
-
19
- describe 'should have author' do
20
- subject { res[0].author }
21
- it { is_expected.to be_a_kind_of(String) }
22
- it { is_expected.not_to be eq nil }
23
- end
24
-
25
- describe 'should have author_id' do
26
- subject { res[0].author_id }
27
- it { is_expected.to be_a_kind_of(String) }
28
- it { is_expected.not_to be eq nil }
29
- end
30
-
31
- describe 'should have contents' do
32
- subject { res[0].contents }
33
- it { is_expected.to be_a_kind_of(String) }
34
- it { is_expected.not_to be eq nil }
35
- end
36
-
37
- describe 'should have date' do
38
- subject { res[0].date }
39
- it { is_expected.to be_a_kind_of(Time) }
40
- it { is_expected.not_to be eq nil }
41
- end
42
-
43
- describe '#anchors' do
44
- shared_examples('have valid anchors') do
45
- let(:res_num) { 100 }
46
- subject { Res.new(res_num, contents: contents) }
47
-
48
- describe 'that\'s anchored res is valid' do
49
- its(:anchors) { is_expected.to be_a_kind_of Array }
50
- its(:anchors) { is_expected.to be == anchor }
51
- its('anchors.size') { is_expected.to be == anchor.size }
52
- end
53
- end
54
- context 'when it have anchors separated commas' do
55
- let(:contents) { %Q{&gt;&gt;1, 2, 3,12, 34\n9} }
56
- let(:anchor) { [1, 2, 3, 12, 34] }
57
- it_behaves_like 'have valid anchors'
58
- end
59
- context 'when it have anchors separated commas & spaces' do
60
- let(:contents) { %Q{&gt;&gt;1, 2, 3 4 5 6, 12、 34\n9} }
61
- let(:anchor) { [1, 2, 3, 4, 5, 6, 12, 34] }
62
- it_behaves_like 'have valid anchors'
63
- end
64
- context 'when it have anchors range' do
65
- let(:contents) { %Q{&gt;1-5\n9} }
66
- let(:anchor) { (1..5).to_a }
67
- it_behaves_like 'have valid anchors'
68
- end
69
- context 'when it have range and separated anchors pattern#1' do
70
- let(:contents) { %Q{&gt;1-5,6,8} }
71
- let(:anchor) { [1, 2, 3, 4, 5, 6, 8] }
72
- it_behaves_like 'have valid anchors'
73
- end
74
- context 'when it have range and separated anchors pattern#2' do
75
- let(:contents) { %Q{&gt;1,3, 9−13\n25} }
76
- let(:anchor) { [1, 3, 9, 10, 11, 12, 13] }
77
- it_behaves_like 'have valid anchors'
78
- end
79
- context 'when it have ARASHI anchors' do
80
- let(:contents) { %Q{>1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,
81
- >52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,
82
-
83
- >>1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
84
-   ∧_∧
85
-   (´・ω・`)     n
86
-  ̄ ..    \    ( E)
87
- フ ア.フ.ィ /ヽ ヽ_//
88
- >>21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
89
-   ∧_∧
90
-   (´・ω・`)     n
91
-  ̄   ..  \    ( E)
92
- フ ア.フ.ィ /ヽ ヽ_//
93
- >>41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 } }
94
- let(:anchor) { [] }
95
- it_behaves_like 'have valid anchors'
96
- end
97
- context 'when a thre have both id and non-id reses', force: true do
98
- let(:board_name) { 'プログラム技術' }
99
- let(:url) { 'http://toro.2ch.sc/tech/' }
100
- let(:thread_key) { '1382307475' }
101
- let(:board) { Board.new(board_name, url) }
102
- let(:thre) { Thre.new(board, thread_key) }
103
- subject { thre.reses }
104
- it { is_expected.to be_a_kind_of Array }
105
- end
106
-
107
- end
108
-
109
- describe '#recepted_anchors' do
110
- let(:board_name) { 'ニュー速VIP' }
111
- let(:url) { 'http://viper.2ch.sc/news4vip/' }
112
- let(:thread_key) { '1409796283' }
113
- let(:board) { Board.new board_name, url }
114
- let(:thre) { Thre.new board, thread_key }
115
- let(:res) { thre.reses([40])[0] }
116
- let(:input_thre) { res.thre = thre }
117
- subject { input_thre; res.received_anchors }
118
- it { is_expected.to be_a_kind_of Array }
119
- its(:size) { is_expected.to be == 4 }
120
- it { is_expected.to be == [43, 44, 45, 54] }
121
- end
122
-
123
- end