qiita_matome 0.0.1
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.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +22 -0
- data/.rspec +2 -0
- data/.rubocop.yml +0 -0
- data/.travis.yml +8 -0
- data/CONTRIBUTING.md +44 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +22 -0
- data/README.md +210 -0
- data/Rakefile +8 -0
- data/bin/qiitam +34 -0
- data/lib/display.rb +10 -0
- data/lib/display/display_consts.rb +35 -0
- data/lib/display/displayer.rb +81 -0
- data/lib/file_writer.rb +19 -0
- data/lib/models/article.rb +38 -0
- data/lib/models/articles.rb +40 -0
- data/lib/qiita_json_loader.rb +43 -0
- data/lib/qiita_matome/version.rb +4 -0
- data/lib/qiita_matome_core.rb +121 -0
- data/lib/qiita_matome_dsl.rb +31 -0
- data/lib/qiita_matome_dsl_model.rb +37 -0
- data/lib/sort.rb +10 -0
- data/lib/sort/sort_consts.rb +28 -0
- data/lib/sort/sorter.rb +51 -0
- data/lib/validators.rb +13 -0
- data/lib/validators/article_validator.rb +19 -0
- data/lib/validators/articles_validator.rb +16 -0
- data/lib/validators/display_columns_validator.rb +41 -0
- data/lib/validators/sort_type_validator.rb +19 -0
- data/manual_test_docs/.gitkeep +0 -0
- data/qiita_matome.gemspec +28 -0
- data/samples/matome_title_asc.md +25 -0
- data/spec/display/displayer_spec.rb +341 -0
- data/spec/file_writer_spec.rb +92 -0
- data/spec/models/article_spec.rb +131 -0
- data/spec/models/articles_spec.rb +305 -0
- data/spec/qiita_matome_core_spec.rb +46 -0
- data/spec/sort/sorter_spec.rb +392 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/validators/article_validator_spec.rb +53 -0
- data/spec/validators/articles_validator_spec.rb +54 -0
- data/spec/validators/display_columns_validator_spec.rb +58 -0
- data/spec/validators/sort_type_validator_spec.rb +54 -0
- metadata +202 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'file_writer'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
# rubocop:disable LineLength, UnusedMethodArgument
|
7
|
+
describe QiitaMatome::FileWriter do
|
8
|
+
context :new do
|
9
|
+
cases = [
|
10
|
+
{
|
11
|
+
case_no: 1,
|
12
|
+
case_title: 'valid output path',
|
13
|
+
contents: "hoge\nhige",
|
14
|
+
output_file: './tmp/output.md',
|
15
|
+
expected: './tmp/output.md'
|
16
|
+
}
|
17
|
+
]
|
18
|
+
|
19
|
+
cases.each do |c|
|
20
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
21
|
+
begin
|
22
|
+
case_before c
|
23
|
+
|
24
|
+
# -- given --
|
25
|
+
file_writer = QiitaMatome::FileWriter.new(c[:output_file], c[:contents])
|
26
|
+
|
27
|
+
# -- when --
|
28
|
+
actual = file_writer.output_file
|
29
|
+
|
30
|
+
# -- then --
|
31
|
+
expect(actual).to eq(c[:expected])
|
32
|
+
ensure
|
33
|
+
case_after c
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def case_before(c)
|
38
|
+
# implement each case before
|
39
|
+
end
|
40
|
+
|
41
|
+
def case_after(c)
|
42
|
+
# implement each case after
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context :write do
|
48
|
+
WRITE_TMP = 'write_tmp'
|
49
|
+
cases = [
|
50
|
+
{
|
51
|
+
case_no: 1,
|
52
|
+
case_title: 'valid output path',
|
53
|
+
contents: "hoge\nhige",
|
54
|
+
output_file: './tmp/output.md',
|
55
|
+
expected: "hoge\nhige"
|
56
|
+
}
|
57
|
+
]
|
58
|
+
|
59
|
+
cases.each do |c|
|
60
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
61
|
+
begin
|
62
|
+
case_before c
|
63
|
+
|
64
|
+
# -- given --
|
65
|
+
file_writer = QiitaMatome::FileWriter.new(c[:output_file], c[:contents])
|
66
|
+
|
67
|
+
# -- when --
|
68
|
+
file_writer.write
|
69
|
+
actual = File.read(c[:output_file])
|
70
|
+
|
71
|
+
# -- then --
|
72
|
+
expect(actual).to eq(c[:expected])
|
73
|
+
ensure
|
74
|
+
case_after c
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def case_before(c)
|
79
|
+
# implement each case before
|
80
|
+
Dir.mkdir(WRITE_TMP) unless Dir.exist? WRITE_TMP
|
81
|
+
Dir.chdir(WRITE_TMP)
|
82
|
+
end
|
83
|
+
|
84
|
+
def case_after(c)
|
85
|
+
# implement each case after
|
86
|
+
Dir.chdir('../')
|
87
|
+
FileUtils.rm_rf(WRITE_TMP) if Dir.exist? WRITE_TMP
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
# rubocop:enable LineLength, UnusedMethodArgument
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'models/article'
|
4
|
+
|
5
|
+
# rubocop:disable LineLength, UnusedMethodArgument
|
6
|
+
describe QiitaMatome::Article do
|
7
|
+
context :created_at_ymdhms do
|
8
|
+
cases = [
|
9
|
+
{
|
10
|
+
case_no: 1,
|
11
|
+
case_title: '2 list case',
|
12
|
+
init: {
|
13
|
+
'created_at' => '2014-06-17 21:29:59 +0900',
|
14
|
+
'updated_at' => '2014-06-18 20:28:58 +0900'
|
15
|
+
},
|
16
|
+
expected: '2014/06/17 21:29:59'
|
17
|
+
}
|
18
|
+
]
|
19
|
+
|
20
|
+
cases.each do |c|
|
21
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
22
|
+
begin
|
23
|
+
case_before c
|
24
|
+
|
25
|
+
# -- given --
|
26
|
+
article = QiitaMatome::Article.new(c[:init])
|
27
|
+
|
28
|
+
# -- when --
|
29
|
+
actual = article.created_at_ymdhms
|
30
|
+
|
31
|
+
# -- then --
|
32
|
+
expect(actual).to eq(c[:expected])
|
33
|
+
ensure
|
34
|
+
case_after c
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def case_before(_c)
|
39
|
+
# implement each case before
|
40
|
+
end
|
41
|
+
|
42
|
+
def case_after(_c)
|
43
|
+
# implement each case after
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context :updated_at_ymdhms do
|
49
|
+
cases = [
|
50
|
+
{
|
51
|
+
case_no: 1,
|
52
|
+
case_title: '2 list case',
|
53
|
+
init: {
|
54
|
+
'created_at' => '2014-06-17 21:29:59 +0900',
|
55
|
+
'updated_at' => '2014-06-18 20:28:58 +0900'
|
56
|
+
},
|
57
|
+
expected: '2014/06/18 20:28:58'
|
58
|
+
}
|
59
|
+
]
|
60
|
+
|
61
|
+
cases.each do |c|
|
62
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
63
|
+
begin
|
64
|
+
case_before c
|
65
|
+
|
66
|
+
# -- given --
|
67
|
+
article = QiitaMatome::Article.new(c[:init])
|
68
|
+
|
69
|
+
# -- when --
|
70
|
+
actual = article.updated_at_ymdhms
|
71
|
+
|
72
|
+
# -- then --
|
73
|
+
expect(actual).to eq(c[:expected])
|
74
|
+
ensure
|
75
|
+
case_after c
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def case_before(_c)
|
80
|
+
# implement each case before
|
81
|
+
end
|
82
|
+
|
83
|
+
def case_after(_c)
|
84
|
+
# implement each case after
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context :title_link do
|
90
|
+
cases = [
|
91
|
+
{
|
92
|
+
case_no: 1,
|
93
|
+
case_title: '2 list case',
|
94
|
+
init: {
|
95
|
+
'title' => 'title | subtitle',
|
96
|
+
'uuid' => '123',
|
97
|
+
'user' => { 'url_name' => 'tbpgr' }
|
98
|
+
},
|
99
|
+
expected: '[title subtitle](http://qiita.com/tbpgr/items/123)'
|
100
|
+
}
|
101
|
+
]
|
102
|
+
|
103
|
+
cases.each do |c|
|
104
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
105
|
+
begin
|
106
|
+
case_before c
|
107
|
+
|
108
|
+
# -- given --
|
109
|
+
article = QiitaMatome::Article.new(c[:init])
|
110
|
+
|
111
|
+
# -- when --
|
112
|
+
actual = article.title_link
|
113
|
+
|
114
|
+
# -- then --
|
115
|
+
expect(actual).to eq(c[:expected])
|
116
|
+
ensure
|
117
|
+
case_after c
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def case_before(_c)
|
122
|
+
# implement each case before
|
123
|
+
end
|
124
|
+
|
125
|
+
def case_after(_c)
|
126
|
+
# implement each case after
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
# rubocop:enable LineLength, UnusedMethodArgument
|
@@ -0,0 +1,305 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'models/articles'
|
4
|
+
require 'models/article'
|
5
|
+
|
6
|
+
# rubocop:disable LineLength, UnusedMethodArgument
|
7
|
+
describe QiitaMatome::Articles do
|
8
|
+
context :<< do
|
9
|
+
cases = [
|
10
|
+
{
|
11
|
+
case_no: 1,
|
12
|
+
case_title: '2 list case',
|
13
|
+
appends: [QiitaMatome::Article.new, QiitaMatome::Article.new],
|
14
|
+
expected: 2
|
15
|
+
},
|
16
|
+
{
|
17
|
+
case_no: 2,
|
18
|
+
case_title: '1 list case',
|
19
|
+
appends: [QiitaMatome::Article.new],
|
20
|
+
expected: 1
|
21
|
+
}
|
22
|
+
]
|
23
|
+
|
24
|
+
cases.each do |c|
|
25
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
26
|
+
begin
|
27
|
+
case_before c
|
28
|
+
|
29
|
+
# -- given --
|
30
|
+
qiita_matome_articles = QiitaMatome::Articles.new
|
31
|
+
|
32
|
+
# -- when --
|
33
|
+
c[:appends].each { |e|qiita_matome_articles << e }
|
34
|
+
actual = qiita_matome_articles.size
|
35
|
+
|
36
|
+
# -- then --
|
37
|
+
expect(actual).to eq(c[:expected])
|
38
|
+
ensure
|
39
|
+
case_after c
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def case_before(_c)
|
44
|
+
# implement each case before
|
45
|
+
end
|
46
|
+
|
47
|
+
def case_after(_c)
|
48
|
+
# implement each case after
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context :+ do
|
54
|
+
cases = [
|
55
|
+
{
|
56
|
+
case_no: 1,
|
57
|
+
case_title: 'init 0 append 2 list case',
|
58
|
+
init: [],
|
59
|
+
appends: QiitaMatome::Articles.new([QiitaMatome::Article.new, QiitaMatome::Article.new]),
|
60
|
+
expected: 2
|
61
|
+
},
|
62
|
+
{
|
63
|
+
case_no: 2,
|
64
|
+
case_title: 'init 2 append 2 list case',
|
65
|
+
init: [QiitaMatome::Article.new, QiitaMatome::Article.new],
|
66
|
+
appends: QiitaMatome::Articles.new([QiitaMatome::Article.new, QiitaMatome::Article.new]),
|
67
|
+
expected: 4
|
68
|
+
}
|
69
|
+
]
|
70
|
+
|
71
|
+
cases.each do |c|
|
72
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
73
|
+
begin
|
74
|
+
case_before c
|
75
|
+
|
76
|
+
# -- given --
|
77
|
+
qiita_matome_articles = QiitaMatome::Articles.new(c[:init])
|
78
|
+
|
79
|
+
# -- when --
|
80
|
+
qiita_matome_articles += c[:appends]
|
81
|
+
actual = qiita_matome_articles.size
|
82
|
+
|
83
|
+
# -- then --
|
84
|
+
expect(actual).to eq(c[:expected])
|
85
|
+
ensure
|
86
|
+
case_after c
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def case_before(_c)
|
91
|
+
# implement each case before
|
92
|
+
end
|
93
|
+
|
94
|
+
def case_after(_c)
|
95
|
+
# implement each case after
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context :size do
|
101
|
+
cases = [
|
102
|
+
{
|
103
|
+
case_no: 1,
|
104
|
+
case_title: '2 list case',
|
105
|
+
articles: [QiitaMatome::Article.new, QiitaMatome::Article.new],
|
106
|
+
expected: 2
|
107
|
+
},
|
108
|
+
{
|
109
|
+
case_no: 2,
|
110
|
+
case_title: 'empty list case',
|
111
|
+
articles: [],
|
112
|
+
expected: 0
|
113
|
+
}
|
114
|
+
]
|
115
|
+
|
116
|
+
cases.each do |c|
|
117
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
118
|
+
begin
|
119
|
+
case_before c
|
120
|
+
|
121
|
+
# -- given --
|
122
|
+
qiita_matome_articles = QiitaMatome::Articles.new(c[:articles])
|
123
|
+
|
124
|
+
# -- when --
|
125
|
+
actual = qiita_matome_articles.size
|
126
|
+
|
127
|
+
# -- then --
|
128
|
+
expect(actual).to eq(c[:expected])
|
129
|
+
ensure
|
130
|
+
case_after c
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def case_before(_c)
|
135
|
+
# implement each case before
|
136
|
+
end
|
137
|
+
|
138
|
+
def case_after(_c)
|
139
|
+
# implement each case after
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context :each do
|
145
|
+
cases = [
|
146
|
+
{
|
147
|
+
case_no: 1,
|
148
|
+
case_title: '2 list case',
|
149
|
+
articles: [QiitaMatome::Article.new('user' => 1), QiitaMatome::Article.new('user' => 2)],
|
150
|
+
expected: 3
|
151
|
+
}
|
152
|
+
]
|
153
|
+
|
154
|
+
cases.each do |c|
|
155
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
156
|
+
begin
|
157
|
+
case_before c
|
158
|
+
|
159
|
+
# -- given --
|
160
|
+
qiita_matome_articles = QiitaMatome::Articles.new(c[:articles])
|
161
|
+
|
162
|
+
# -- when --
|
163
|
+
total = 0
|
164
|
+
qiita_matome_articles.each { |e|total += e.user }
|
165
|
+
|
166
|
+
# -- then --
|
167
|
+
expect(total).to eq(c[:expected])
|
168
|
+
ensure
|
169
|
+
case_after c
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def case_before(_c)
|
174
|
+
# implement each case before
|
175
|
+
end
|
176
|
+
|
177
|
+
def case_after(_c)
|
178
|
+
# implement each case after
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
context :filter_by_tag do
|
184
|
+
cases = [
|
185
|
+
{
|
186
|
+
case_no: 1,
|
187
|
+
case_title: 'init 4 Ruby-tag 2 list case',
|
188
|
+
init: [
|
189
|
+
QiitaMatome::Article.new('tags' => [{ 'name' => 'Ruby', 'url_name' => 'ruby', 'icon_url' => 'icon', 'versions' => [] }]),
|
190
|
+
QiitaMatome::Article.new('tags' => [{ 'name' => 'Java', 'url_name' => 'java', 'icon_url' => 'icon', 'versions' => [] }]),
|
191
|
+
QiitaMatome::Article.new('tags' => [{ 'name' => 'Ruby', 'url_name' => 'ruby', 'icon_url' => 'icon', 'versions' => [] }]),
|
192
|
+
QiitaMatome::Article.new('tags' => [{ 'name' => 'C', 'url_name' => 'c', 'icon_url' => 'icon', 'versions' => [] }])
|
193
|
+
],
|
194
|
+
filter_tag: 'Ruby',
|
195
|
+
expected: 2
|
196
|
+
},
|
197
|
+
{
|
198
|
+
case_no: 1,
|
199
|
+
case_title: 'init 4 Swift-tag 0 list case',
|
200
|
+
init: [
|
201
|
+
QiitaMatome::Article.new('tags' => [{ 'name' => 'Ruby', 'url_name' => 'ruby', 'icon_url' => 'icon', 'versions' => [] }]),
|
202
|
+
QiitaMatome::Article.new('tags' => [{ 'name' => 'Java', 'url_name' => 'java', 'icon_url' => 'icon', 'versions' => [] }]),
|
203
|
+
QiitaMatome::Article.new('tags' => [{ 'name' => 'Ruby', 'url_name' => 'ruby', 'icon_url' => 'icon', 'versions' => [] }]),
|
204
|
+
QiitaMatome::Article.new('tags' => [{ 'name' => 'C', 'url_name' => 'c', 'icon_url' => 'icon', 'versions' => [] }])
|
205
|
+
],
|
206
|
+
filter_tag: 'Swift',
|
207
|
+
expected: 0
|
208
|
+
}
|
209
|
+
]
|
210
|
+
|
211
|
+
cases.each do |c|
|
212
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
213
|
+
begin
|
214
|
+
case_before c
|
215
|
+
|
216
|
+
# -- given --
|
217
|
+
qiita_matome_articles = QiitaMatome::Articles.new(c[:init])
|
218
|
+
|
219
|
+
# -- when --
|
220
|
+
actual = qiita_matome_articles.filter_by_tag(c[:filter_tag])
|
221
|
+
|
222
|
+
# -- then --
|
223
|
+
expect(actual.size).to eq(c[:expected])
|
224
|
+
ensure
|
225
|
+
case_after c
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def case_before(_c)
|
230
|
+
# implement each case before
|
231
|
+
end
|
232
|
+
|
233
|
+
def case_after(_c)
|
234
|
+
# implement each case after
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
context :exclude_uuid do
|
240
|
+
cases = [
|
241
|
+
{
|
242
|
+
case_no: 1,
|
243
|
+
case_title: 'exclude uuid case',
|
244
|
+
init: [
|
245
|
+
QiitaMatome::Article.new('title' => 'title1', 'uuid' => '1'),
|
246
|
+
QiitaMatome::Article.new('title' => 'title2', 'uuid' => '2'),
|
247
|
+
QiitaMatome::Article.new('title' => 'title3', 'uuid' => '3'),
|
248
|
+
QiitaMatome::Article.new('title' => 'title4', 'uuid' => '4')
|
249
|
+
],
|
250
|
+
uuids: %w(2 3),
|
251
|
+
expected: [
|
252
|
+
QiitaMatome::Article.new('title' => 'title1', 'uuid' => '1'),
|
253
|
+
QiitaMatome::Article.new('title' => 'title4', 'uuid' => '4')
|
254
|
+
]
|
255
|
+
},
|
256
|
+
{
|
257
|
+
case_no: 2,
|
258
|
+
case_title: 'exclude uuid case(no target)',
|
259
|
+
init: [
|
260
|
+
QiitaMatome::Article.new('title' => 'title1', 'uuid' => '1'),
|
261
|
+
QiitaMatome::Article.new('title' => 'title2', 'uuid' => '2'),
|
262
|
+
QiitaMatome::Article.new('title' => 'title3', 'uuid' => '3'),
|
263
|
+
QiitaMatome::Article.new('title' => 'title4', 'uuid' => '4')
|
264
|
+
],
|
265
|
+
uuids: ['5'],
|
266
|
+
expected: [
|
267
|
+
QiitaMatome::Article.new('title' => 'title1', 'uuid' => '1'),
|
268
|
+
QiitaMatome::Article.new('title' => 'title2', 'uuid' => '2'),
|
269
|
+
QiitaMatome::Article.new('title' => 'title3', 'uuid' => '3'),
|
270
|
+
QiitaMatome::Article.new('title' => 'title4', 'uuid' => '4')
|
271
|
+
]
|
272
|
+
}
|
273
|
+
]
|
274
|
+
|
275
|
+
cases.each do |c|
|
276
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
277
|
+
begin
|
278
|
+
case_before c
|
279
|
+
|
280
|
+
# -- given --
|
281
|
+
# nothing
|
282
|
+
|
283
|
+
# -- when --
|
284
|
+
actual = QiitaMatome::Articles.exclude_uuid(c[:init], c[:uuids])
|
285
|
+
|
286
|
+
# -- then --
|
287
|
+
actual.each_with_index do |e, i|
|
288
|
+
expect(e.title).to eq(c[:expected][i].title)
|
289
|
+
end
|
290
|
+
ensure
|
291
|
+
case_after c
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
def case_before(_c)
|
296
|
+
# implement each case before
|
297
|
+
end
|
298
|
+
|
299
|
+
def case_after(_c)
|
300
|
+
# implement each case after
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
# rubocop:enable LineLength, UnusedMethodArgument
|