simple2ch 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,215 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <title>Method List</title>
19
+ <base id="base_target" target="_parent" />
20
+ </head>
21
+ <body>
22
+ <script type="text/javascript" charset="utf-8">
23
+ if (window.top.frames.main) {
24
+ document.getElementById('base_target').target = 'main';
25
+ document.body.className = 'frames';
26
+ }
27
+ </script>
28
+ <div id="content">
29
+ <h1 id="full_list_header">Method List</h1>
30
+ <div id="nav">
31
+
32
+ <span><a target="_self" href="class_list.html">
33
+ Classes
34
+ </a></span>
35
+
36
+ <span><a target="_self" href="method_list.html">
37
+ Methods
38
+ </a></span>
39
+
40
+ <span><a target="_self" href="file_list.html">
41
+ Files
42
+ </a></span>
43
+
44
+ </div>
45
+ <div id="search">Search: <input type="text" /></div>
46
+
47
+ <ul id="full_list" class="method">
48
+
49
+
50
+ <li class="r1 ">
51
+ <span class='object_link'><a href="Simple2ch/Res.html#author-instance_method" title="Simple2ch::Res#author (method)">#author</a></span>
52
+ <small>Simple2ch::Res</small>
53
+ </li>
54
+
55
+
56
+ <li class="r2 ">
57
+ <span class='object_link'><a href="Simple2ch/Res.html#author_id-instance_method" title="Simple2ch::Res#author_id (method)">#author_id</a></span>
58
+ <small>Simple2ch::Res</small>
59
+ </li>
60
+
61
+
62
+ <li class="r1 ">
63
+ <span class='object_link'><a href="Simple2ch/Thre.html#board-instance_method" title="Simple2ch::Thre#board (method)">#board</a></span>
64
+ <small>Simple2ch::Thre</small>
65
+ </li>
66
+
67
+
68
+ <li class="r2 ">
69
+ <span class='object_link'><a href="Simple2ch/Board.html#board_name-instance_method" title="Simple2ch::Board#board_name (method)">#board_name</a></span>
70
+ <small>Simple2ch::Board</small>
71
+ </li>
72
+
73
+
74
+ <li class="r1 ">
75
+ <span class='object_link'><a href="Simple2ch/Res.html#contents-instance_method" title="Simple2ch::Res#contents (method)">#contents</a></span>
76
+ <small>Simple2ch::Res</small>
77
+ </li>
78
+
79
+
80
+ <li class="r2 ">
81
+ <span class='object_link'><a href="Simple2ch/Res.html#date-instance_method" title="Simple2ch::Res#date (method)">#date</a></span>
82
+ <small>Simple2ch::Res</small>
83
+ </li>
84
+
85
+
86
+ <li class="r1 ">
87
+ <span class='object_link'><a href="Simple2ch.html#fetch-class_method" title="Simple2ch.fetch (method)">fetch</a></span>
88
+ <small>Simple2ch</small>
89
+ </li>
90
+
91
+
92
+ <li class="r2 ">
93
+ <span class='object_link'><a href="Simple2ch/Board.html#initialize-instance_method" title="Simple2ch::Board#initialize (method)">#initialize</a></span>
94
+ <small>Simple2ch::Board</small>
95
+ </li>
96
+
97
+
98
+ <li class="r1 ">
99
+ <span class='object_link'><a href="Simple2ch/Res.html#initialize-instance_method" title="Simple2ch::Res#initialize (method)">#initialize</a></span>
100
+ <small>Simple2ch::Res</small>
101
+ </li>
102
+
103
+
104
+ <li class="r2 ">
105
+ <span class='object_link'><a href="Simple2ch/Dat.html#initialize-instance_method" title="Simple2ch::Dat#initialize (method)">#initialize</a></span>
106
+ <small>Simple2ch::Dat</small>
107
+ </li>
108
+
109
+
110
+ <li class="r1 ">
111
+ <span class='object_link'><a href="Simple2ch/Thre.html#initialize-instance_method" title="Simple2ch::Thre#initialize (method)">#initialize</a></span>
112
+ <small>Simple2ch::Thre</small>
113
+ </li>
114
+
115
+
116
+ <li class="r2 ">
117
+ <span class='object_link'><a href="Simple2ch/Thre.html#kako_log%3F-instance_method" title="Simple2ch::Thre#kako_log? (method)">#kako_log?</a></span>
118
+ <small>Simple2ch::Thre</small>
119
+ </li>
120
+
121
+
122
+ <li class="r1 ">
123
+ <span class='object_link'><a href="Simple2ch/Dat.html#kako_log%3F-instance_method" title="Simple2ch::Dat#kako_log? (method)">#kako_log?</a></span>
124
+ <small>Simple2ch::Dat</small>
125
+ </li>
126
+
127
+
128
+ <li class="r2 ">
129
+ <span class='object_link'><a href="Simple2ch/Res.html#mail-instance_method" title="Simple2ch::Res#mail (method)">#mail</a></span>
130
+ <small>Simple2ch::Res</small>
131
+ </li>
132
+
133
+
134
+ <li class="r1 ">
135
+ <span class='object_link'><a href="Simple2ch/Thre.html#num_of_response-instance_method" title="Simple2ch::Thre#num_of_response (method)">#num_of_response</a></span>
136
+ <small>Simple2ch::Thre</small>
137
+ </li>
138
+
139
+
140
+ <li class="r2 ">
141
+ <span class='object_link'><a href="Simple2ch/Res.html#parse-class_method" title="Simple2ch::Res.parse (method)">parse</a></span>
142
+ <small>Simple2ch::Res</small>
143
+ </li>
144
+
145
+
146
+ <li class="r1 ">
147
+ <span class='object_link'><a href="Simple2ch/Res.html#res_num-instance_method" title="Simple2ch::Res#res_num (method)">#res_num</a></span>
148
+ <small>Simple2ch::Res</small>
149
+ </li>
150
+
151
+
152
+ <li class="r2 ">
153
+ <span class='object_link'><a href="Simple2ch/Dat.html#reses-instance_method" title="Simple2ch::Dat#reses (method)">#reses</a></span>
154
+ <small>Simple2ch::Dat</small>
155
+ </li>
156
+
157
+
158
+ <li class="r1 ">
159
+ <span class='object_link'><a href="Simple2ch/Thre.html#reses-instance_method" title="Simple2ch::Thre#reses (method)">#reses</a></span>
160
+ <small>Simple2ch::Thre</small>
161
+ </li>
162
+
163
+
164
+ <li class="r2 ">
165
+ <span class='object_link'><a href="Simple2ch.html#root-class_method" title="Simple2ch.root (method)">root</a></span>
166
+ <small>Simple2ch</small>
167
+ </li>
168
+
169
+
170
+ <li class="r1 ">
171
+ <span class='object_link'><a href="Simple2ch/Board.html#server_name-instance_method" title="Simple2ch::Board#server_name (method)">#server_name</a></span>
172
+ <small>Simple2ch::Board</small>
173
+ </li>
174
+
175
+
176
+ <li class="r2 ">
177
+ <span class='object_link'><a href="Simple2ch/Dat.html#thread_key-instance_method" title="Simple2ch::Dat#thread_key (method)">#thread_key</a></span>
178
+ <small>Simple2ch::Dat</small>
179
+ </li>
180
+
181
+
182
+ <li class="r1 ">
183
+ <span class='object_link'><a href="Simple2ch/Thre.html#thread_key-instance_method" title="Simple2ch::Thre#thread_key (method)">#thread_key</a></span>
184
+ <small>Simple2ch::Thre</small>
185
+ </li>
186
+
187
+
188
+ <li class="r2 ">
189
+ <span class='object_link'><a href="Simple2ch/Board.html#threads-instance_method" title="Simple2ch::Board#threads (method)">#threads</a></span>
190
+ <small>Simple2ch::Board</small>
191
+ </li>
192
+
193
+
194
+ <li class="r1 ">
195
+ <span class='object_link'><a href="Simple2ch/Board.html#title-instance_method" title="Simple2ch::Board#title (method)">#title</a></span>
196
+ <small>Simple2ch::Board</small>
197
+ </li>
198
+
199
+
200
+ <li class="r2 ">
201
+ <span class='object_link'><a href="Simple2ch/Thre.html#title-instance_method" title="Simple2ch::Thre#title (method)">#title</a></span>
202
+ <small>Simple2ch::Thre</small>
203
+ </li>
204
+
205
+
206
+ <li class="r1 ">
207
+ <span class='object_link'><a href="Simple2ch/Board.html#url-instance_method" title="Simple2ch::Board#url (method)">#url</a></span>
208
+ <small>Simple2ch::Board</small>
209
+ </li>
210
+
211
+
212
+ </ul>
213
+ </div>
214
+ </body>
215
+ </html>
@@ -0,0 +1,112 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.8.7.4
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '';
20
+ framesUrl = "frames.html#!top-level-namespace.html";
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="_index.html">Index</a> &raquo;
35
+
36
+
37
+ <span class="title">Top Level Namespace</span>
38
+
39
+
40
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
41
+ </div>
42
+
43
+ <div id="search">
44
+
45
+ <a class="full_list_link" id="class_list_link"
46
+ href="class_list.html">
47
+ Class List
48
+ </a>
49
+
50
+ <a class="full_list_link" id="method_list_link"
51
+ href="method_list.html">
52
+ Method List
53
+ </a>
54
+
55
+ <a class="full_list_link" id="file_list_link"
56
+ href="file_list.html">
57
+ File List
58
+ </a>
59
+
60
+ </div>
61
+ <div class="clear"></div>
62
+ </div>
63
+
64
+ <iframe id="search_frame"></iframe>
65
+
66
+ <div id="content"><h1>Top Level Namespace
67
+
68
+
69
+
70
+ </h1>
71
+
72
+ <dl class="box">
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+ </dl>
82
+ <div class="clear"></div>
83
+
84
+ <h2>Defined Under Namespace</h2>
85
+ <p class="children">
86
+
87
+
88
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="Simple2ch.html" title="Simple2ch (module)">Simple2ch</a></span>
89
+
90
+
91
+
92
+
93
+ </p>
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ </div>
104
+
105
+ <div id="footer">
106
+ Generated on Sun Sep 7 11:29:29 2014 by
107
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
108
+ 0.8.7.4 (ruby-2.1.2).
109
+ </div>
110
+
111
+ </body>
112
+ </html>
@@ -0,0 +1,70 @@
1
+ module Simple2ch
2
+ class Board
3
+ # @return [URI] 板のURL
4
+ attr_reader :url
5
+ # @return [String] 板のタイトル
6
+ attr_reader :title
7
+ # @return [String] サーバ名
8
+ attr_reader :server_name
9
+ # @return [String] 板の名前(コンピュータ名)
10
+ attr_reader :board_name
11
+
12
+
13
+ # @param [String] title 板の名前
14
+ # @param [String] url 板のURL
15
+ def initialize(title, url)
16
+ @server_name = @board_name = nil
17
+ @url = validate_url url
18
+ @title = title
19
+ @thres = []
20
+ end
21
+
22
+ # 板に属する全てのスレッドを返す
23
+ # @return [Array<Thre>] 板に属する全てのスレッド
24
+ def threads
25
+ if @thres.size > 0
26
+ @thres
27
+ else
28
+ fetch_all_thres
29
+ end
30
+ end
31
+
32
+ private
33
+ # URLが正しいかバリデーションする
34
+ # @param [URI] url
35
+ # @raise [Simple2ch::NotA2chUrlException] 2chのフォーマットで無いURLを渡したときに発生
36
+ # @raise [URI::InvalidURIError] そもそもURLのフォーマットで無いときに発生
37
+ def validate_url(url)
38
+ sp_uri = URI.parse url
39
+ board_url = ''
40
+
41
+ if sp_uri.host.index '2ch'
42
+ case url
43
+ when /http:\/\/(.+)\.2ch.(net|sc)\/test\/read.cgi\/(.+)\/([0-9]+)/,
44
+ /http:\/\/(.+)\.2ch\.(net|sc)\/(.+)\/subject\.txt/,
45
+ /http:\/\/(.+)\.2ch\.(net|sc)\/(.+)\//,
46
+ /http:\/\/(.+)\.2ch\.(net|sc)\/(\w+)/,
47
+ /http:\/\/(.+)\.2ch.(net|sc)\/(.+)\/dat\/([0-9]+)\.dat/
48
+ @server_name = $1; @board_name = $3
49
+ board_url = URI.parse("http://#{$1}.2ch.sc/#{$3}/")
50
+ else
51
+ raise NotA2chUrlException
52
+ end
53
+ else
54
+ raise NotA2chUrlException
55
+ end
56
+ end
57
+
58
+ # 板に属する全てのスレッドをsubject.txtから取得する
59
+ # @return [Array<Thre>] 板に属する全てのスレッド
60
+ def fetch_all_thres
61
+ subject_url = @url+'subject.txt'
62
+
63
+ subject_txt = Simple2ch.fetch(subject_url)
64
+ subject_txt.each_line do |line|
65
+ @thres << Thre.new(self, line)
66
+ end
67
+ @thres
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,57 @@
1
+ module Simple2ch
2
+ class Dat
3
+ # @return [String] スレッドキー
4
+ attr_reader :thread_key
5
+
6
+ # @param [Thre] thre スレッド
7
+ def initialize(thre)
8
+ @thre = thre
9
+ @thread_key = thre.thread_key
10
+ @data = nil
11
+ @reses = nil
12
+ @f_kako_log = nil
13
+ end
14
+
15
+ # Datを解析して、レスを返す
16
+ # @return [Array<Res>] レス
17
+ def reses
18
+ @reses || parse_dat[0]
19
+ end
20
+
21
+ # Datを解析して過去ログかどうかを返す
22
+ # @return [Boolean] 過去ログか否か
23
+ def kako_log?
24
+ @f_kako_log || parse_dat[1]
25
+ end
26
+
27
+ private
28
+ # datのURLを返す
29
+ # @return [URI] datのURL
30
+ def dat_url
31
+ @thre.board.url+'dat/'+(@thread_key+'.dat')
32
+ end
33
+
34
+ # datファイルを取得する
35
+ # @return [String] 取得したdatファイルの中身
36
+ def fetch_dat
37
+ @data || (@data = Simple2ch.fetch dat_url)
38
+ end
39
+
40
+ # datファイルを解析してResを作成する
41
+ # @return [Array<Res>] 全てのレス
42
+ def parse_dat
43
+ res_num = 0
44
+ tmp = []
45
+ f_kako_log = false
46
+ fetch_dat.each_line do |l|
47
+ res_num += 1
48
+ begin
49
+ tmp << Res.parse(res_num, l)
50
+ rescue KakoLogException
51
+ f_kako_log = true
52
+ end
53
+ end
54
+ return @reses=tmp, @f_kako_log=f_kako_log
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,70 @@
1
+ module Simple2ch
2
+ class Res
3
+ # @return [Fixnum] レス番号
4
+ attr_reader :res_num
5
+ # @return [String] 投稿者名
6
+ attr_reader :author
7
+ # @return [String] ID
8
+ attr_reader :author_id
9
+ # @return [Time] 書き込み日時
10
+ attr_reader :date
11
+ # @return [String] メール欄
12
+ attr_reader :mail
13
+ # @return [String] 内容
14
+ attr_reader :contents
15
+
16
+ KAKO_LOG_INFO = '過去ログ ★<><>[過去ログ]<><em>■ このスレッドは過去ログ倉庫に格納されています</em><>'
17
+
18
+ #
19
+ # @param [Fixnum] res_num レス番号
20
+ # @param [String] author 投稿者名
21
+ # @param [String] author_id ID
22
+ # @param [Time] date 書き込み日時
23
+ # @param [String] mail メール欄
24
+ # @param [String] contents 内容
25
+ def initialize(res_num, author: '', author_id: '', date: nil, mail: '', contents: '')
26
+ @res_num = res_num
27
+ @author = author
28
+ @author_id = author_id
29
+ @date = date
30
+ @mail = mail
31
+ @contents = contents
32
+ end
33
+
34
+ # Datの1行から各項目を分離して、Resオブジェクトを返す
35
+ # @param [Fixnum] res_num レス番号
36
+ # @param [String] contents datのデータ1行
37
+ # @return [Res] 新規Resオブジェクト
38
+ # @raise [KakoLogException] 過去ログ情報をパースしようとした際に発生
39
+ def self.parse(res_num, contents)
40
+ unless contents.strip == KAKO_LOG_INFO
41
+ self.new res_num, self.parse_dat(contents)
42
+ else
43
+ raise KakoLogException
44
+ end
45
+ end
46
+
47
+ private
48
+ # Datの1行から各項目を分離して、Resオブジェクトを返すメソッドの実体
49
+ # @param [String] dat datのデータ1行
50
+ # @raise [DatParseException] Datのパースに失敗したときに発生
51
+ def self.parse_dat(dat)
52
+ split_date_and_id_regex = /(^\d{4}\/\d{2}\/\d{2}\(.\) \d{2}:\d{2}:\d{2}\.\d{2}) ID:(\S+)$/
53
+ ret = {}
54
+ split = dat.split('<>')
55
+ ret[:author] = split[0]
56
+ ret[:mail] = split[1]
57
+ date_and_author_id = split[2]
58
+ ret[:contents] = split[3].strip!
59
+
60
+ date_and_author_id =~ split_date_and_id_regex
61
+ if !$1 || !$2
62
+ raise DatParseException
63
+ end
64
+ ret[:date] = Time.parse $1
65
+ ret[:author_id] = $2
66
+
67
+ ret
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,6 @@
1
+ module Simple2ch
2
+ class Simple2chException < Exception; end
3
+ class NotA2chUrlException < Simple2chException; end
4
+ class KakoLogException < Simple2chException; end
5
+ class DatParseException < Simple2chException; end
6
+ end
@@ -0,0 +1,49 @@
1
+ module Simple2ch
2
+ class Thre
3
+ # @return [String] スレッドの名前
4
+ attr_reader :title
5
+ # @return [String] スレッドキー(Unix time)
6
+ attr_reader :thread_key
7
+ # @return [Fixnum] 返信の数
8
+ attr_reader :num_of_response
9
+ # @return [Board] 属する板
10
+ attr_reader :board
11
+
12
+ # @param [Board] board スレッドが属する板情報
13
+ # @param [String] thread_data 0000000000.dat<>スレッドタイトル (レス数)
14
+ def initialize(board, thread_data)
15
+ @board = board
16
+ thread_data =~ /(\d{10})\.dat<>(.+) \((\d+)\)/
17
+ @thread_key = $1
18
+ @title = $2
19
+ @num_of_response = $3.to_i
20
+ @reses = nil
21
+ @f_kako_log = nil
22
+ end
23
+
24
+ # Datを解析して、レスを返す
25
+ # @return [Array<Res>] レスの配列
26
+ def reses
27
+ @reses || fetch_dat[0]
28
+ end
29
+
30
+ # 過去ログかどうかを返す
31
+ # @return [Boolean] 過去ログか否か
32
+ def kako_log?
33
+ @f_kako_log || fetch_dat[1]
34
+ end
35
+
36
+ private
37
+ # Datを取ってきてレスと過去ログかどうかを返す
38
+ # @return [Array<Res>] reses レス
39
+ # @return [Boolean] f_kako_log 過去ログか否か
40
+ def fetch_dat
41
+ dat = Dat.new(self)
42
+ @reses, @f_kako_log = dat.reses, dat.kako_log?
43
+ dat = nil
44
+ return @reses, @f_kako_log
45
+ end
46
+
47
+ #TODO: スコアリング
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ module Simple2ch
2
+ VERSION = "0.0.1"
3
+ end
data/lib/simple2ch.rb ADDED
@@ -0,0 +1,31 @@
1
+ require "simple2ch/version"
2
+
3
+ module Simple2ch
4
+ DEBUG = true
5
+
6
+ require 'simple2ch/simple2ch_exception'
7
+ require 'simple2ch/board'
8
+ require 'simple2ch/dat'
9
+ require 'simple2ch/res'
10
+ require 'simple2ch/thre'
11
+ require 'net/http'
12
+ require 'pp' if DEBUG
13
+
14
+ def self.root
15
+ File.dirname __dir__
16
+ end
17
+
18
+ # HTTPでGETする
19
+ # @param [URI] url URL
20
+ # @return [String] 取得本文
21
+ def self.fetch(url)
22
+ req = Net::HTTP::Get.new(url.path)
23
+ res = Net::HTTP.start(url.host, url.port) {|http|
24
+ http.request(req)
25
+ }
26
+ res.body.force_encoding("cp932").encode!('utf-8', :undef => :replace)
27
+ end
28
+ end
29
+
30
+ #TODO: テストの用意。
31
+ #TODO: コメントを書いてメソッドを整える。
data/simple2ch.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'simple2ch/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "simple2ch"
8
+ spec.version = Simple2ch::VERSION
9
+ spec.authors = ["dogwood008"]
10
+ spec.email = ["dogwood008+rubygems@gmail.com"]
11
+ spec.summary = %q{A gem to read 2ch bbs.}
12
+ spec.description = spec.summary
13
+ spec.homepage = "https://github.com/dogwood008/simple2ch"
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_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "rspec-core"
25
+ spec.add_development_dependency 'rspec-its'
26
+ spec.add_development_dependency 'spork'
27
+
28
+ # spec.add_development_dependency 'spring'
29
+ # spec.add_development_dependency 'zeus'
30
+ # spec.add_development_dependency 'guard'
31
+ # spec.add_development_dependency 'guard-rspec'
32
+ # spec.add_development_dependency 'guard-zeus'
33
+ end