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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8309c6be22ec8e7c5c8f3f84f6f6821cd6cb5b8
|
4
|
+
data.tar.gz: f63d664d10d4d230be61613ab41522969985c215
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd7a35657366b4ab599b2a455c4cf7e1b1bf66aa9b659d6b26adf4f9caf46087e666ab4dda00aa8dae24224097e9d7e77d25b64049a4a20d620112717edc3fcd
|
7
|
+
data.tar.gz: 32da7707e122689d756fd2e137bd6521f4c1c59ea44c7142e9da0e91c86025cf56b5939fb2bdc15fe5f79bf74e8ae0a3052daff4afb16c90177c486032ae5c41
|
data/.rspec
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
# 1.0.0
|
2
|
+
### Feature
|
3
|
+
* Newer search result is output to the upstream
|
4
|
+
* Enable to search option `-e` named `deep-search`
|
5
|
+
* Specify this option, search the log older than 75 recently
|
6
|
+
* Specify `date` option, also search the log with option `-e`
|
7
|
+
* The reason is that refer to the `Bugfix`
|
8
|
+
* Refactor the code
|
9
|
+
|
10
|
+
### Bugfix
|
11
|
+
* Date option searches the date *until* you specify, Fix to search to the date of latest from you specified
|
12
|
+
|
1
13
|
# 0.0.3
|
2
14
|
### Feature
|
3
15
|
* Enable to search option `-A`, `-B`, `-C`, such as `grep`
|
data/README.md
CHANGED
@@ -25,8 +25,7 @@ echo {access_token} > ~/.hps
|
|
25
25
|
`hipchat_searcher` search for a regular expression the words that you specify.
|
26
26
|
In the specifications of the [hipchat api](https://www.hipchat.com/docs/apiv2/), `hipchat_searcher` search of the upcoming 100 comments.
|
27
27
|
|
28
|
-
* Search the words in all room
|
29
|
-
* But it searches ALL the room that user know, so there may be heavy.
|
28
|
+
* Search the words in all room. (but it searches ALL the room that user know, so there may be heavy)
|
30
29
|
|
31
30
|
```
|
32
31
|
hps word
|
@@ -38,6 +37,24 @@ hps word
|
|
38
37
|
hps word -r room-name
|
39
38
|
```
|
40
39
|
|
40
|
+
* Search the words of trailing context after each match. Such as `grep` command option.
|
41
|
+
|
42
|
+
```
|
43
|
+
hps word -A 2
|
44
|
+
```
|
45
|
+
|
46
|
+
* Search the words of trailing context before each match. Such as `grep` command option.
|
47
|
+
|
48
|
+
```
|
49
|
+
hps word -B 2
|
50
|
+
```
|
51
|
+
|
52
|
+
* Search the words of trailing context surrounding each match. The following is equivalent to -A 2 -B 2.
|
53
|
+
|
54
|
+
```
|
55
|
+
hps word -C 2
|
56
|
+
```
|
57
|
+
|
41
58
|
* Search the words that specified user talks
|
42
59
|
|
43
60
|
```
|
data/bin/hps
CHANGED
@@ -23,4 +23,9 @@ end.to_hash
|
|
23
23
|
options = HipchatSearcher::Options.new(hash)
|
24
24
|
|
25
25
|
# run command
|
26
|
-
|
26
|
+
begin
|
27
|
+
HipchatSearcher::Command.run(ARGV.shift, options)
|
28
|
+
rescue Interrupt
|
29
|
+
$stderr.puts "HipchatSearcher execute interrupt, exit..."
|
30
|
+
exit 1
|
31
|
+
end
|
data/hipchat_searcher.gemspec
CHANGED
@@ -25,5 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.6"
|
26
26
|
spec.add_development_dependency "rake"
|
27
27
|
spec.add_development_dependency "rspec"
|
28
|
+
spec.add_development_dependency "webmock"
|
28
29
|
spec.add_development_dependency "coveralls"
|
29
30
|
end
|
data/lib/hipchat_searcher.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
require 'hipchat_searcher/command'
|
2
2
|
require 'hipchat_searcher/config'
|
3
|
+
require 'hipchat_searcher/item_extention'
|
3
4
|
require 'hipchat_searcher/message'
|
4
5
|
require 'hipchat_searcher/options'
|
6
|
+
require 'hipchat_searcher/search_proxy'
|
7
|
+
require 'hipchat_searcher/search_proxy/simple'
|
8
|
+
require 'hipchat_searcher/search_proxy/grep'
|
5
9
|
require 'hipchat_searcher/result'
|
6
10
|
require 'hipchat_searcher/room'
|
7
|
-
require 'hipchat_searcher/
|
11
|
+
require 'hipchat_searcher/runner'
|
12
|
+
require 'hipchat_searcher/deep_runner'
|
8
13
|
require 'hipchat_searcher/version'
|
@@ -3,7 +3,9 @@ module HipchatSearcher
|
|
3
3
|
def initialize(pattern, options)
|
4
4
|
@pattern = pattern
|
5
5
|
@options = options
|
6
|
-
@config
|
6
|
+
@options.config = Config.new
|
7
|
+
|
8
|
+
config_valid!
|
7
9
|
end
|
8
10
|
|
9
11
|
def self.run(pattern, options)
|
@@ -11,22 +13,58 @@ module HipchatSearcher
|
|
11
13
|
end
|
12
14
|
|
13
15
|
def run
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
else
|
22
|
-
all_room
|
23
|
-
end
|
16
|
+
if @options.deep?
|
17
|
+
deep_run
|
18
|
+
else
|
19
|
+
simple_run
|
20
|
+
end
|
21
|
+
end
|
24
22
|
|
25
|
-
|
23
|
+
def deep_run
|
24
|
+
rooms.each do |room|
|
25
|
+
DeepRunner.run(@pattern, room, @options)
|
26
|
+
end
|
27
|
+
end
|
26
28
|
|
29
|
+
def simple_run
|
27
30
|
rooms.each do |room|
|
28
|
-
|
29
|
-
|
31
|
+
Runner.run(@pattern, room, @options)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def all_room
|
38
|
+
Room.new(@options.config.token, @options.room_options).all_room
|
39
|
+
end
|
40
|
+
|
41
|
+
def config_valid!
|
42
|
+
unless @options.config.valid?
|
43
|
+
print_no_authorization_token
|
44
|
+
exit 1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def print_no_authorization_token
|
49
|
+
puts <<-EOS
|
50
|
+
Authorization token required.
|
51
|
+
|
52
|
+
* To create config file, run this command
|
53
|
+
`echo {auth_token} > ~/.hps`
|
54
|
+
|
55
|
+
* To get new auth_token, visit and sign in.
|
56
|
+
https://www.hipchat.com/
|
57
|
+
EOS
|
58
|
+
end
|
59
|
+
|
60
|
+
def rooms
|
61
|
+
if @options.room?
|
62
|
+
room_names = @options.room.split(',')
|
63
|
+
all_room.select do |r|
|
64
|
+
room_names.include?(r.name)
|
65
|
+
end
|
66
|
+
else
|
67
|
+
all_room
|
30
68
|
end
|
31
69
|
end
|
32
70
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module HipchatSearcher
|
2
|
+
class DeepRunner < Runner
|
3
|
+
def run
|
4
|
+
result = @message.history(@room)
|
5
|
+
i = 1
|
6
|
+
while result.items.size == limit
|
7
|
+
break if @options.end?
|
8
|
+
|
9
|
+
if i == 1
|
10
|
+
i += 1
|
11
|
+
search(result)
|
12
|
+
else
|
13
|
+
option = { date: result.oldest_date }
|
14
|
+
result = @message.history(@room, option)
|
15
|
+
@limit_flag = true
|
16
|
+
search(result)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def limit
|
24
|
+
@limit_flag ? 100 : 75
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module HipchatSearcher
|
2
|
+
module ItemExtention
|
3
|
+
attr_accessor :pattern
|
4
|
+
|
5
|
+
def contents
|
6
|
+
"%s\n%s\n\n" % [_date, _message]
|
7
|
+
end
|
8
|
+
|
9
|
+
def mention_name
|
10
|
+
self.from.mention_name rescue self.from
|
11
|
+
end
|
12
|
+
|
13
|
+
def _date
|
14
|
+
" Date: %s" % self.date
|
15
|
+
end
|
16
|
+
|
17
|
+
def _message
|
18
|
+
msg = self.message.gsub(pattern) do |matched|
|
19
|
+
matched.colorize(:red)
|
20
|
+
end
|
21
|
+
|
22
|
+
" @%s: %s" % [mention_name, msg]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -8,15 +8,16 @@ module HipchatSearcher
|
|
8
8
|
@client = ::HipChat::Client.new(@token, api_version: 'v2')
|
9
9
|
end
|
10
10
|
|
11
|
-
def get_history(id)
|
12
|
-
@
|
11
|
+
def get_history(id, options)
|
12
|
+
option = @options.merge(options)
|
13
|
+
@client[id].history(option)
|
13
14
|
end
|
14
15
|
|
15
|
-
def history(room)
|
16
|
+
def history(room, options={})
|
16
17
|
id = room.id rescue room
|
17
18
|
room_name = room.name rescue room
|
18
19
|
|
19
|
-
h = get_history(id)
|
20
|
+
h = get_history(id, options)
|
20
21
|
Result.new(h).tap {|r| r.room = room_name }
|
21
22
|
end
|
22
23
|
end
|
@@ -2,8 +2,12 @@ require 'hashie/mash'
|
|
2
2
|
|
3
3
|
module HipchatSearcher
|
4
4
|
class Options < Hashie::Mash
|
5
|
+
def deep?
|
6
|
+
!!self['deep'] || !!self['date']
|
7
|
+
end
|
8
|
+
|
5
9
|
def message_options
|
6
|
-
|
10
|
+
{}
|
7
11
|
end
|
8
12
|
|
9
13
|
def room_options
|
@@ -16,9 +20,14 @@ module HipchatSearcher
|
|
16
20
|
o.merge!(after_context: after_context) if after_context?
|
17
21
|
o.merge!(before_context: before_context) if before_context?
|
18
22
|
o.merge!(context: context) if context?
|
23
|
+
o.merge!(date: date) if date?
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
27
|
+
def grep_options?
|
28
|
+
!!before_context || !!after_context || !!context
|
29
|
+
end
|
30
|
+
|
22
31
|
class << self
|
23
32
|
|
24
33
|
# [shortname, longname, description]
|
@@ -26,7 +35,7 @@ module HipchatSearcher
|
|
26
35
|
[
|
27
36
|
['r=', 'room=', 'Search only the log of the room that you specified'],
|
28
37
|
['u=', 'user=', 'Search only the log that specified user talk'],
|
29
|
-
['d=', 'date=', 'Search the log
|
38
|
+
['d=', 'date=', 'Search the log until the day of latest from the date you specified'],
|
30
39
|
['A=', 'after_context=', 'Search the log that trails context after each match'],
|
31
40
|
['B=', 'before_context=', 'Search the log that trails context before each match'],
|
32
41
|
['C=', 'context=', 'Search the log that trails context surround each match'],
|
@@ -36,7 +45,8 @@ module HipchatSearcher
|
|
36
45
|
# [shortname, longname, description]
|
37
46
|
def with_boolean
|
38
47
|
[
|
39
|
-
['a', 'archived', 'Include in the search of the room that have been archived']
|
48
|
+
['a', 'archived', 'Include in the search of the room that have been archived'],
|
49
|
+
['e', 'deep', 'Search older than comment of 75 recently']
|
40
50
|
]
|
41
51
|
end
|
42
52
|
end
|
@@ -11,12 +11,16 @@ module HipchatSearcher
|
|
11
11
|
valid!
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
@response['items'].map {|i| ::Hashie::Mash.new(i) }
|
14
|
+
def items
|
15
|
+
@items ||= JSON.parse(@response)['items'].map {|i| ::Hashie::Mash.new(i) }
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
18
|
+
def oldest_date
|
19
|
+
items.first.date rescue nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def rooms
|
23
|
+
@response['items'].map {|i| ::Hashie::Mash.new(i) }
|
20
24
|
end
|
21
25
|
|
22
26
|
def valid!
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module HipchatSearcher
|
2
|
+
class Runner
|
3
|
+
def initialize(pattern, room, options)
|
4
|
+
@pattern = pattern
|
5
|
+
@room = room
|
6
|
+
@options = options
|
7
|
+
@message = Message.new(@options.config.token, @options.message_options)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.run(pattern, room, options)
|
11
|
+
new(pattern, room, options).run
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
result = @message.history(@room)
|
16
|
+
search(result)
|
17
|
+
end
|
18
|
+
|
19
|
+
def search(result)
|
20
|
+
search_proxy.search(@pattern, result, @options.search_options)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def search_proxy
|
26
|
+
if @options.grep_options?
|
27
|
+
SearchProxy.new('grep')
|
28
|
+
else
|
29
|
+
SearchProxy.new('simple')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
module HipchatSearcher
|
5
|
+
class SearchProxy
|
6
|
+
class Grep < Simple
|
7
|
+
|
8
|
+
def initialize(pattern, result, options={})
|
9
|
+
super
|
10
|
+
@print_room = false
|
11
|
+
@print_item = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.search(pattern, result, options)
|
15
|
+
new(pattern, result, options).search
|
16
|
+
end
|
17
|
+
|
18
|
+
def around_items(index)
|
19
|
+
items[range(index)].map do |itm|
|
20
|
+
itm.extend(HipchatSearcher::ItemExtention).tap do |i|
|
21
|
+
i.pattern = pattern
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def search
|
27
|
+
items.each_with_index do |item, idx|
|
28
|
+
if before?(item.date)
|
29
|
+
@options[:end] = true
|
30
|
+
break
|
31
|
+
end
|
32
|
+
|
33
|
+
if pattern =~ item.message
|
34
|
+
around_items(idx).each do |itm|
|
35
|
+
puts_search_result(itm)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def option_after?
|
46
|
+
!!@options[:after_context]
|
47
|
+
end
|
48
|
+
|
49
|
+
def option_before?
|
50
|
+
!!@options[:before_context]
|
51
|
+
end
|
52
|
+
|
53
|
+
def option_context?
|
54
|
+
!!@options[:context]
|
55
|
+
end
|
56
|
+
|
57
|
+
def printed?(id)
|
58
|
+
if @print_item.key?(id)
|
59
|
+
true
|
60
|
+
else
|
61
|
+
@print_item[id] = 1
|
62
|
+
false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def range(index)
|
67
|
+
param = []
|
68
|
+
|
69
|
+
case
|
70
|
+
when option_before?
|
71
|
+
_i = index - @options[:before_context].to_i
|
72
|
+
param = _i < 0 ? [0, index] : [_i, index]
|
73
|
+
when option_after?
|
74
|
+
_i = index + @options[:after_context].to_i
|
75
|
+
param = [index, _i]
|
76
|
+
when option_context?
|
77
|
+
_i = index - @options[:context].to_i
|
78
|
+
_j = index + @options[:context].to_i
|
79
|
+
param = _i < 0 ? [0, _j] : [_i, _j]
|
80
|
+
end
|
81
|
+
|
82
|
+
Range.new(*param)
|
83
|
+
end
|
84
|
+
|
85
|
+
def puts_contents(item)
|
86
|
+
print_room? ? nil : puts_room
|
87
|
+
puts item.contents unless printed?(item.id)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|