hipchat_searcher 0.0.3 → 1.0.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.
- checksums.yaml +4 -4
- data/.rspec +3 -0
- data/CHANGELOG.md +12 -0
- data/README.md +19 -2
- data/bin/hps +6 -1
- data/hipchat_searcher.gemspec +1 -0
- data/lib/hipchat_searcher.rb +6 -1
- data/lib/hipchat_searcher/command.rb +52 -14
- data/lib/hipchat_searcher/deep_runner.rb +27 -0
- data/lib/hipchat_searcher/item_extention.rb +25 -0
- data/lib/hipchat_searcher/message.rb +5 -4
- data/lib/hipchat_searcher/options.rb +13 -3
- data/lib/hipchat_searcher/result.rb +8 -4
- data/lib/hipchat_searcher/runner.rb +33 -0
- data/lib/hipchat_searcher/search_proxy.rb +12 -0
- data/lib/hipchat_searcher/search_proxy/grep.rb +91 -0
- data/lib/hipchat_searcher/search_proxy/simple.rb +89 -0
- data/lib/hipchat_searcher/version.rb +1 -1
- data/spec/data/item-list-100.json +1409 -0
- data/spec/data/item-list-empty.json +7 -0
- data/spec/hipchat_searcher_spec.rb +1 -2
- data/spec/lib/hipchat_searcher/message_spec.rb +79 -0
- data/spec/lib/hipchat_searcher/result_spec.rb +47 -25
- data/spec/lib/hipchat_searcher/room_spec.rb +58 -0
- data/spec/lib/hipchat_searcher/{searcher_spec.rb → search_proxy/grep_spec.rb} +50 -115
- data/spec/lib/hipchat_searcher/search_proxy/simple_spec.rb +267 -0
- metadata +35 -5
- data/lib/hipchat_searcher/searcher.rb +0 -149
@@ -0,0 +1,267 @@
|
|
1
|
+
describe HipchatSearcher::SearchProxy::Simple do
|
2
|
+
def searcher(pattern, result, options={})
|
3
|
+
described_class.new(pattern, result, options)
|
4
|
+
end
|
5
|
+
|
6
|
+
describe '#before?' do
|
7
|
+
context 'when no "date" option' do
|
8
|
+
subject { searcher("hoge", double(:result)).before?("2014-07-13") }
|
9
|
+
|
10
|
+
it { should be_falsy }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when argument is nil' do
|
14
|
+
subject { searcher("hoge", double(:result)).before?(nil) }
|
15
|
+
|
16
|
+
it { should be_falsy }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when option date is later than argument date' do
|
20
|
+
subject { searcher("hoge", double(:result), date: "2014-07-13").before?("2014-07-10") }
|
21
|
+
|
22
|
+
it { should be_truthy }
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when option date is equal to argument date ' do
|
26
|
+
subject { searcher("hoge", double(:result), date: "2014-07-13").before?("2014-07-13") }
|
27
|
+
|
28
|
+
it { should be_falsy }
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when option date is newer than argument date ' do
|
32
|
+
subject { searcher("hoge", double(:result), date: "2014-07-13").before?("2014-07-20") }
|
33
|
+
|
34
|
+
it { should be_falsy }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#items' do
|
39
|
+
subject { searcher(pattern, result).items }
|
40
|
+
|
41
|
+
let(:pattern) { 'hoge' }
|
42
|
+
let(:result) do
|
43
|
+
response = File.read(File.join('spec', 'data', 'item-list.json'))
|
44
|
+
HipchatSearcher::Result.new(response)
|
45
|
+
end
|
46
|
+
|
47
|
+
it { should be_instance_of Array }
|
48
|
+
|
49
|
+
it 'should return array with Hashie::Mash objects' do
|
50
|
+
subject.first.should be_instance_of ::Hashie::Mash
|
51
|
+
subject.last.should be_instance_of ::Hashie::Mash
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#search' do
|
56
|
+
context 'when matches pattern in messages' do
|
57
|
+
subject { searcher(pattern, result).search }
|
58
|
+
|
59
|
+
let(:pattern) { 'yare' }
|
60
|
+
let(:result) do
|
61
|
+
response = File.read(File.join('spec', 'data', 'item-list.json'))
|
62
|
+
HipchatSearcher::Result.new(response).tap do |r|
|
63
|
+
r.room = "Joestars"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
let(:search_result) do
|
67
|
+
"\e[4;39;49mJoestars\e[0m" + "\n" + \
|
68
|
+
" Date: 2014-05-30T01:38:16.741565+00:00" + "\n" + \
|
69
|
+
" @jotaro: \e[0;31;49myare\e[0m\e[0;31;49myare\e[0m daze" + "\n" + \
|
70
|
+
"\n"
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should print roomname & search result' do
|
74
|
+
expect do
|
75
|
+
subject
|
76
|
+
end.to output(search_result).to_stdout
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'when matches pattern in many messages' do
|
81
|
+
subject { searcher(pattern, result).search }
|
82
|
+
|
83
|
+
let(:pattern) { 'ze' }
|
84
|
+
let(:result) do
|
85
|
+
response = File.read(File.join('spec', 'data', 'item-list.json'))
|
86
|
+
HipchatSearcher::Result.new(response).tap do |r|
|
87
|
+
r.room = "Joestars"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
let(:search_result) do
|
91
|
+
"\e[4;39;49mJoestars\e[0m" + "\n" + \
|
92
|
+
" Date: 2014-06-09T11:29:10.209014+00:00" + "\n" + \
|
93
|
+
" @polnareff: a... arinomama ima okotta koto wo hanasu \e[0;31;49mze\e[0m" + "\n" + \
|
94
|
+
"\n" + \
|
95
|
+
" Date: 2014-05-30T01:38:16.741565+00:00" + "\n" + \
|
96
|
+
" @jotaro: yareyare da\e[0;31;49mze\e[0m" + "\n" \
|
97
|
+
"\n"
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should print roomname & search result' do
|
101
|
+
expect do
|
102
|
+
subject
|
103
|
+
end.to output(search_result).to_stdout
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'when you specify option date and include item date no later than this date' do
|
108
|
+
subject { searcher(pattern, result, date: '2014-06-10').search }
|
109
|
+
|
110
|
+
let(:pattern) { 'ze' }
|
111
|
+
let(:result) do
|
112
|
+
response = File.read(File.join('spec', 'data', 'item-list-with-overlap.json'))
|
113
|
+
HipchatSearcher::Result.new(response).tap do |r|
|
114
|
+
r.room = "Joestars"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
let(:search_result) do
|
119
|
+
"\e[4;39;49mJoestars\e[0m" + "\n" + \
|
120
|
+
" Date: 2014-06-11T19:20:47.726182+00:00" + "\n" + \
|
121
|
+
" @lggy: inu zuki no kodomo ha migoroshiniha dekine-\e[0;31;49mze\e[0m" + "\n" + \
|
122
|
+
"\n"
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should print the matched message since option date' do
|
126
|
+
expect do
|
127
|
+
subject
|
128
|
+
end.to output(search_result).to_stdout
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "when don't match pattern in messages" do
|
133
|
+
subject { searcher(pattern, result).search }
|
134
|
+
|
135
|
+
let(:pattern) { 'abcd' }
|
136
|
+
let(:result) do
|
137
|
+
response = File.read(File.join('spec', 'data', 'item-list.json'))
|
138
|
+
HipchatSearcher::Result.new(response)
|
139
|
+
end
|
140
|
+
|
141
|
+
it { should be_nil }
|
142
|
+
|
143
|
+
it 'should no output to stdout' do
|
144
|
+
expect do
|
145
|
+
subject
|
146
|
+
end.to output('').to_stdout
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context "when pattern can't convert regexp" do
|
151
|
+
subject { searcher(pattern, result).search }
|
152
|
+
|
153
|
+
let(:pattern) { nil }
|
154
|
+
let(:result) do
|
155
|
+
response = File.read(File.join('spec', 'data', 'item-list.json'))
|
156
|
+
HipchatSearcher::Result.new(response)
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'should raise exception' do
|
160
|
+
expect do
|
161
|
+
subject
|
162
|
+
end.to raise_error
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe '#puts_search_result' do
|
168
|
+
def extended_items(path, pattern)
|
169
|
+
hash = JSON.parse(File.read(path))
|
170
|
+
items = ::Hashie::Mash.new(hash).items
|
171
|
+
items.map do |itm|
|
172
|
+
itm.extend(HipchatSearcher::ItemExtention).tap do |i|
|
173
|
+
i.pattern = Regexp.new(pattern)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'when only person in room' do
|
179
|
+
subject { searcher(pattern, result).puts_search_result(item) }
|
180
|
+
|
181
|
+
let(:pattern) { 'yare' }
|
182
|
+
let(:result) { double(:result, room: 'Joestars') }
|
183
|
+
let(:item) do
|
184
|
+
path = File.join('spec', 'data', 'item-list.json')
|
185
|
+
extended_items(path, pattern).first
|
186
|
+
end
|
187
|
+
|
188
|
+
let(:search_result) do
|
189
|
+
"\e[4;39;49mJoestars\e[0m" + "\n" + \
|
190
|
+
" Date: 2014-05-30T01:38:16.741565+00:00" + "\n" + \
|
191
|
+
" @jotaro: \e[0;31;49myare\e[0m\e[0;31;49myare\e[0m daze" + "\n" + \
|
192
|
+
"\n"
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'should print message of search result' do
|
196
|
+
expect do
|
197
|
+
subject
|
198
|
+
end.to output(search_result).to_stdout
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
context 'when person and bot in room' do
|
203
|
+
subject { searcher(pattern, result).puts_search_result(item) }
|
204
|
+
|
205
|
+
let(:pattern) { 'mgi166' }
|
206
|
+
let(:result) { double(:result, room: 'Joestars') }
|
207
|
+
let(:item) do
|
208
|
+
path = File.join('spec', 'data', 'item-list-with-bot.json')
|
209
|
+
extended_items(path, pattern).first
|
210
|
+
end
|
211
|
+
|
212
|
+
let(:search_result) do
|
213
|
+
"\e[4;39;49mJoestars\e[0m" + "\n" + \
|
214
|
+
' Date: 2014-06-17T08:14:48.305590+00:00' + "\n" + \
|
215
|
+
" @GitHub: \e[0;31;49mmgi166\e[0m commented on pull request 118 ..." + "\n\n"
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'should print message of search result' do
|
219
|
+
expect do
|
220
|
+
subject
|
221
|
+
end.to output(search_result).to_stdout
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
context "when user options specified but the user don't speak this message" do
|
226
|
+
subject { searcher(pattern, result, user: 'jotaro').puts_search_result(item) }
|
227
|
+
|
228
|
+
let(:pattern) { 'ze' }
|
229
|
+
let(:result) { double(:result, room: 'Joestars') }
|
230
|
+
let(:item) do
|
231
|
+
path = File.join('spec', 'data', 'item-list.json')
|
232
|
+
extended_items(path, pattern).last
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'should not print message' do
|
236
|
+
expect do
|
237
|
+
subject
|
238
|
+
end.to output('').to_stdout
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
context "when user options specified and the user speak this message" do
|
243
|
+
subject { searcher(pattern, result, user: 'jotaro').puts_search_result(item) }
|
244
|
+
|
245
|
+
let(:pattern) { 'ze' }
|
246
|
+
let(:result) { double(:result, room: 'Joestars') }
|
247
|
+
let(:item) do
|
248
|
+
path = File.join('spec', 'data', 'item-list.json')
|
249
|
+
extended_items(path, pattern).first
|
250
|
+
end
|
251
|
+
|
252
|
+
let(:search_result) do
|
253
|
+
"\e[4;39;49mJoestars\e[0m" + "\n" + \
|
254
|
+
" Date: 2014-05-30T01:38:16.741565+00:00" + "\n" + \
|
255
|
+
" @jotaro: yareyare da\e[0;31;49mze\e[0m" + "\n" \
|
256
|
+
"\n"
|
257
|
+
end
|
258
|
+
|
259
|
+
it 'should print message for specified user' do
|
260
|
+
expect do
|
261
|
+
subject
|
262
|
+
end.to output(search_result).to_stdout
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
end
|
267
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hipchat_searcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mgi166
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hipchat
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: webmock
|
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'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: coveralls
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,6 +145,7 @@ extensions: []
|
|
131
145
|
extra_rdoc_files: []
|
132
146
|
files:
|
133
147
|
- ".gitignore"
|
148
|
+
- ".rspec"
|
134
149
|
- ".travis.yml"
|
135
150
|
- CHANGELOG.md
|
136
151
|
- Gemfile
|
@@ -142,19 +157,29 @@ files:
|
|
142
157
|
- lib/hipchat_searcher.rb
|
143
158
|
- lib/hipchat_searcher/command.rb
|
144
159
|
- lib/hipchat_searcher/config.rb
|
160
|
+
- lib/hipchat_searcher/deep_runner.rb
|
161
|
+
- lib/hipchat_searcher/item_extention.rb
|
145
162
|
- lib/hipchat_searcher/message.rb
|
146
163
|
- lib/hipchat_searcher/options.rb
|
147
164
|
- lib/hipchat_searcher/result.rb
|
148
165
|
- lib/hipchat_searcher/room.rb
|
149
|
-
- lib/hipchat_searcher/
|
166
|
+
- lib/hipchat_searcher/runner.rb
|
167
|
+
- lib/hipchat_searcher/search_proxy.rb
|
168
|
+
- lib/hipchat_searcher/search_proxy/grep.rb
|
169
|
+
- lib/hipchat_searcher/search_proxy/simple.rb
|
150
170
|
- lib/hipchat_searcher/version.rb
|
171
|
+
- spec/data/item-list-100.json
|
172
|
+
- spec/data/item-list-empty.json
|
151
173
|
- spec/data/item-list-with-bot.json
|
152
174
|
- spec/data/item-list-with-overlap.json
|
153
175
|
- spec/data/item-list.json
|
154
176
|
- spec/data/room-list.txt
|
155
177
|
- spec/hipchat_searcher_spec.rb
|
178
|
+
- spec/lib/hipchat_searcher/message_spec.rb
|
156
179
|
- spec/lib/hipchat_searcher/result_spec.rb
|
157
|
-
- spec/lib/hipchat_searcher/
|
180
|
+
- spec/lib/hipchat_searcher/room_spec.rb
|
181
|
+
- spec/lib/hipchat_searcher/search_proxy/grep_spec.rb
|
182
|
+
- spec/lib/hipchat_searcher/search_proxy/simple_spec.rb
|
158
183
|
- spec/spec_helper.rb
|
159
184
|
homepage: https://github.com/mgi166/hipchat_searcher
|
160
185
|
licenses:
|
@@ -181,11 +206,16 @@ signing_key:
|
|
181
206
|
specification_version: 4
|
182
207
|
summary: Search hipchat log on terminal
|
183
208
|
test_files:
|
209
|
+
- spec/data/item-list-100.json
|
210
|
+
- spec/data/item-list-empty.json
|
184
211
|
- spec/data/item-list-with-bot.json
|
185
212
|
- spec/data/item-list-with-overlap.json
|
186
213
|
- spec/data/item-list.json
|
187
214
|
- spec/data/room-list.txt
|
188
215
|
- spec/hipchat_searcher_spec.rb
|
216
|
+
- spec/lib/hipchat_searcher/message_spec.rb
|
189
217
|
- spec/lib/hipchat_searcher/result_spec.rb
|
190
|
-
- spec/lib/hipchat_searcher/
|
218
|
+
- spec/lib/hipchat_searcher/room_spec.rb
|
219
|
+
- spec/lib/hipchat_searcher/search_proxy/grep_spec.rb
|
220
|
+
- spec/lib/hipchat_searcher/search_proxy/simple_spec.rb
|
191
221
|
- spec/spec_helper.rb
|
@@ -1,149 +0,0 @@
|
|
1
|
-
require 'colorize'
|
2
|
-
|
3
|
-
module HipchatSearcher
|
4
|
-
class Searcher
|
5
|
-
def initialize(pattern, result, options={})
|
6
|
-
@result = result
|
7
|
-
@options = options
|
8
|
-
@pattern = Regexp.new(pattern, Regexp::IGNORECASE)
|
9
|
-
@print_room = false
|
10
|
-
@print_item = {}
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.search(pattern, result, options)
|
14
|
-
new(pattern, result, options).search
|
15
|
-
end
|
16
|
-
|
17
|
-
def extended_items(index)
|
18
|
-
items[range(index)].map do |itm|
|
19
|
-
itm.extend(ItemExtention).tap do |i|
|
20
|
-
i.pattern = @pattern
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def items
|
26
|
-
@items ||= @result.items
|
27
|
-
end
|
28
|
-
|
29
|
-
def puts_search_result(item)
|
30
|
-
if option_user?
|
31
|
-
if @options[:user] == item.mention_name
|
32
|
-
puts_contents(item)
|
33
|
-
end
|
34
|
-
else
|
35
|
-
puts_contents(item)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def search
|
40
|
-
items.each_with_index do |item, idx|
|
41
|
-
next unless @pattern =~ item.message
|
42
|
-
|
43
|
-
if option_search?
|
44
|
-
extended_items(idx).each do |itm|
|
45
|
-
puts_search_result(itm)
|
46
|
-
end
|
47
|
-
else
|
48
|
-
ext = item.extend(ItemExtention)
|
49
|
-
ext.pattern = @pattern
|
50
|
-
puts_search_result(ext)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
nil
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def option_after?
|
60
|
-
!!@options[:after_context]
|
61
|
-
end
|
62
|
-
|
63
|
-
def option_before?
|
64
|
-
!!@options[:before_context]
|
65
|
-
end
|
66
|
-
|
67
|
-
def option_context?
|
68
|
-
!!@options[:context]
|
69
|
-
end
|
70
|
-
|
71
|
-
def option_search?
|
72
|
-
option_after? || option_before? || option_context?
|
73
|
-
end
|
74
|
-
|
75
|
-
def option_user?
|
76
|
-
!!@options[:user]
|
77
|
-
end
|
78
|
-
|
79
|
-
def print_room?
|
80
|
-
!!@print_room
|
81
|
-
end
|
82
|
-
|
83
|
-
def puts_room
|
84
|
-
@print_room = true
|
85
|
-
puts room.underline
|
86
|
-
end
|
87
|
-
|
88
|
-
def puts_contents(item)
|
89
|
-
print_room? ? nil : puts_room
|
90
|
-
puts item.contents unless printed?(item.id)
|
91
|
-
end
|
92
|
-
|
93
|
-
def range(index)
|
94
|
-
param = []
|
95
|
-
|
96
|
-
case
|
97
|
-
when option_before?
|
98
|
-
_i = index - @options[:before_context].to_i
|
99
|
-
param = _i < 0 ? [0, index] : [_i, index]
|
100
|
-
when option_after?
|
101
|
-
_i = index + @options[:after_context].to_i
|
102
|
-
param = [index, _i]
|
103
|
-
when option_context?
|
104
|
-
_i = index - @options[:context].to_i
|
105
|
-
_j = index + @options[:context].to_i
|
106
|
-
param = _i < 0 ? [0, _j] : [_i, _j]
|
107
|
-
end
|
108
|
-
|
109
|
-
Range.new(*param)
|
110
|
-
end
|
111
|
-
|
112
|
-
def room
|
113
|
-
@result.room
|
114
|
-
end
|
115
|
-
|
116
|
-
def printed?(id)
|
117
|
-
if @print_item.key?(id)
|
118
|
-
true
|
119
|
-
else
|
120
|
-
@print_item[id] = 1
|
121
|
-
false
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
module ItemExtention
|
126
|
-
attr_accessor :pattern
|
127
|
-
|
128
|
-
def contents
|
129
|
-
"%s\n%s\n\n" % [_date, _message]
|
130
|
-
end
|
131
|
-
|
132
|
-
def mention_name
|
133
|
-
self.from.mention_name rescue self.from
|
134
|
-
end
|
135
|
-
|
136
|
-
def _date
|
137
|
-
" Date: %s" % self.date
|
138
|
-
end
|
139
|
-
|
140
|
-
def _message
|
141
|
-
msg = self.message.gsub(pattern) do |matched|
|
142
|
-
matched.colorize(:red)
|
143
|
-
end
|
144
|
-
|
145
|
-
" @%s: %s" % [mention_name, msg]
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|