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,79 @@ | |
| 1 | 
            +
            require 'webmock/rspec'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe HipchatSearcher::Message do
         | 
| 4 | 
            +
              def stub_request_with_headers(uri)
         | 
| 5 | 
            +
                stub_request(:get, uri).with(headers: headers)
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              let(:headers) do
         | 
| 9 | 
            +
                {
         | 
| 10 | 
            +
                  'Accept'       => 'application/json',
         | 
| 11 | 
            +
                  'Content-Type' => 'application/json',
         | 
| 12 | 
            +
                }
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              describe '#get_history' do
         | 
| 16 | 
            +
                context 'with no options' do
         | 
| 17 | 
            +
                  before do
         | 
| 18 | 
            +
                    stub_request_with_headers('https://api.hipchat.com/v2/room/id-12345/history?auth_token=abcd&date=recent&format=JSON&room_id=id-12345&timezone=UTC')
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  it 'should request to hipchat-api with default option of hipchat api' do
         | 
| 22 | 
            +
                    message = described_class.new('abcd')
         | 
| 23 | 
            +
                    message.get_history('id-12345', {})
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                context 'with options' do
         | 
| 28 | 
            +
                  before do
         | 
| 29 | 
            +
                    stub_request_with_headers('https://api.hipchat.com/v2/room/id-12345/history?auth_token=abcd&date=2014-07-12&format=JSON&room_id=id-12345&timezone=JST')
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  it 'should request to hipchat-api with option overridden of hipchat api' do
         | 
| 33 | 
            +
                    message = described_class.new('abcd')
         | 
| 34 | 
            +
                    message.get_history('id-12345', {date: '2014-07-12', timezone: 'JST'})
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                context 'when id must be escaped' do
         | 
| 39 | 
            +
                  before do
         | 
| 40 | 
            +
                    stub_request_with_headers('https://api.hipchat.com/v2/room/id%2012345/history?auth_token=abcd&date=recent&format=JSON&room_id=id%2012345&timezone=UTC')
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  it 'should request to url that is escaped' do
         | 
| 44 | 
            +
                    message = described_class.new('abcd')
         | 
| 45 | 
            +
                    message.get_history('id 12345', {})
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              describe '#history' do
         | 
| 51 | 
            +
                before do
         | 
| 52 | 
            +
                  stub_request_with_headers('https://api.hipchat.com/v2/room/id-12345/history?auth_token=abcd&date=recent&format=JSON&room_id=id-12345&timezone=UTC').to_return(body: response)
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                let(:response) do
         | 
| 56 | 
            +
                  path = File.join('spec', 'data', 'item-list.json')
         | 
| 57 | 
            +
                  File.read(path)
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                it 'should return HipchatSearcher::Result instance' do
         | 
| 61 | 
            +
                  message  = described_class.new('abcd')
         | 
| 62 | 
            +
                  response = message.history('id-12345')
         | 
| 63 | 
            +
                  response.should be_instance_of HipchatSearcher::Result
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                it 'when arguments is String should return the room name the same string of arguments' do
         | 
| 67 | 
            +
                  message  = described_class.new('abcd')
         | 
| 68 | 
            +
                  response = message.history('id-12345')
         | 
| 69 | 
            +
                  response.room.should == 'id-12345'
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                it 'when arguments is Hashie::Mash object should return the room name objects given' do
         | 
| 73 | 
            +
                  room     = Hashie::Mash.new(id: 'id-12345', name: 'room1')
         | 
| 74 | 
            +
                  message  = described_class.new('abcd')
         | 
| 75 | 
            +
                  response = message.history(room)
         | 
| 76 | 
            +
                  response.room.should == 'room1'
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
            end
         | 
| @@ -1,5 +1,3 @@ | |
| 1 | 
            -
            require 'spec_helper'
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            describe HipchatSearcher::Result do
         | 
| 4 2 | 
             
              def result(response)
         | 
| 5 3 | 
             
                described_class.new(response)
         | 
| @@ -61,29 +59,6 @@ describe HipchatSearcher::Result do | |
| 61 59 | 
             
                end
         | 
| 62 60 | 
             
              end
         | 
| 63 61 |  | 
| 64 | 
            -
              describe '#rooms' do
         | 
| 65 | 
            -
                context 'the value' do
         | 
| 66 | 
            -
                  subject { result(response).rooms }
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                  let(:response) { eval File.read(path) }
         | 
| 69 | 
            -
                  let(:path)     { File.join('spec', 'data', 'room-list.txt') }
         | 
| 70 | 
            -
             | 
| 71 | 
            -
                  it { should be_instance_of Array }
         | 
| 72 | 
            -
                end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                context 'the element' do
         | 
| 75 | 
            -
                  let(:rooms)    { result(response).rooms.first }
         | 
| 76 | 
            -
                  let(:response) { eval File.read(path) }
         | 
| 77 | 
            -
                  let(:path)     { File.join('spec', 'data', 'room-list.txt') }
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                  it { rooms.should be_instance_of ::Hashie::Mash }
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                  it 'should have keys "id", "links", "name"' do
         | 
| 82 | 
            -
                    rooms.keys.should == ['id', 'links', 'name']
         | 
| 83 | 
            -
                  end
         | 
| 84 | 
            -
                end
         | 
| 85 | 
            -
              end
         | 
| 86 | 
            -
             | 
| 87 62 | 
             
              describe '#items' do
         | 
| 88 63 | 
             
                context 'the value' do
         | 
| 89 64 | 
             
                  subject { result(response).items }
         | 
| @@ -144,4 +119,51 @@ describe HipchatSearcher::Result do | |
| 144 119 | 
             
                  end
         | 
| 145 120 | 
             
                end
         | 
| 146 121 | 
             
              end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
              describe '#oldest_date' do
         | 
| 124 | 
            +
                context 'when items is not empty' do
         | 
| 125 | 
            +
                  subject { result(response).oldest_date }
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                  let(:response) { File.read(path) }
         | 
| 128 | 
            +
                  let(:path)     { File.join('spec', 'data', 'item-list.json') }
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                  it { should be_instance_of String }
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                  it 'should return the oldest date in any items' do
         | 
| 133 | 
            +
                    should == "2014-05-30T01:38:16.741565+00:00"
         | 
| 134 | 
            +
                  end
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                context 'when item is empty' do
         | 
| 138 | 
            +
                  subject { result(response).oldest_date }
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                  let(:response) { File.read(path) }
         | 
| 141 | 
            +
                  let(:path)     { File.join('spec', 'data', 'item-list-empty.json') }
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                  it { should be_nil }
         | 
| 144 | 
            +
                end
         | 
| 145 | 
            +
              end
         | 
| 146 | 
            +
             | 
| 147 | 
            +
              describe '#rooms' do
         | 
| 148 | 
            +
                context 'the value' do
         | 
| 149 | 
            +
                  subject { result(response).rooms }
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                  let(:response) { eval File.read(path) }
         | 
| 152 | 
            +
                  let(:path)     { File.join('spec', 'data', 'room-list.txt') }
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                  it { should be_instance_of Array }
         | 
| 155 | 
            +
                end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                context 'the element' do
         | 
| 158 | 
            +
                  let(:rooms)    { result(response).rooms.first }
         | 
| 159 | 
            +
                  let(:response) { eval File.read(path) }
         | 
| 160 | 
            +
                  let(:path)     { File.join('spec', 'data', 'room-list.txt') }
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                  it { rooms.should be_instance_of ::Hashie::Mash }
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                  it 'should have keys "id", "links", "name"' do
         | 
| 165 | 
            +
                    rooms.keys.should == ['id', 'links', 'name']
         | 
| 166 | 
            +
                  end
         | 
| 167 | 
            +
                end
         | 
| 168 | 
            +
              end
         | 
| 147 169 | 
             
            end
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            require 'webmock/rspec'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe HipchatSearcher::Room do
         | 
| 4 | 
            +
              describe '#get_all_room' do
         | 
| 5 | 
            +
                context 'with no options' do
         | 
| 6 | 
            +
                  before do
         | 
| 7 | 
            +
                    stub_request(:get, 'https://api.hipchat.com/v2/room?auth_token=abcde')
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  it 'should request to hipchat api' do
         | 
| 11 | 
            +
                    room = described_class.new('abcde')
         | 
| 12 | 
            +
                    room.get_all_room
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                context 'when response code 400 from hipchat api' do
         | 
| 17 | 
            +
                  before do
         | 
| 18 | 
            +
                    stub_request(:get, 'https://api.hipchat.com/v2/room?auth_token=abcde')
         | 
| 19 | 
            +
                      .to_return(status: 401)
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  it 'should raise error HipChat::Unauthorized' do
         | 
| 23 | 
            +
                    room = described_class.new('abcde')
         | 
| 24 | 
            +
                    expect do
         | 
| 25 | 
            +
                      room.get_all_room
         | 
| 26 | 
            +
                    end.to raise_error HipChat::Unauthorized
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                context 'when response code 404 from hipchat api' do
         | 
| 31 | 
            +
                  before do
         | 
| 32 | 
            +
                    stub_request(:get, 'https://api.hipchat.com/v2/room?auth_token=abcde')
         | 
| 33 | 
            +
                      .to_return(status: 404)
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  it 'should raise error HipChat::UnknownRoom' do
         | 
| 37 | 
            +
                    room = described_class.new('abcde')
         | 
| 38 | 
            +
                    expect do
         | 
| 39 | 
            +
                      room.get_all_room
         | 
| 40 | 
            +
                    end.to raise_error HipChat::UnknownRoom
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                context 'when response code other type from hipchat api' do
         | 
| 45 | 
            +
                  before do
         | 
| 46 | 
            +
                    stub_request(:get, 'https://api.hipchat.com/v2/room?auth_token=abcde')
         | 
| 47 | 
            +
                      .to_return(status: 400)
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  it 'should raise error HipChat::UnknownResponseCode' do
         | 
| 51 | 
            +
                    room = described_class.new('abcde')
         | 
| 52 | 
            +
                    expect do
         | 
| 53 | 
            +
                      room.get_all_room
         | 
| 54 | 
            +
                    end.to raise_error HipChat::UnknownResponseCode
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         | 
| @@ -1,6 +1,4 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
            describe HipchatSearcher::Searcher do
         | 
| 1 | 
            +
            describe HipchatSearcher::SearchProxy::Grep do
         | 
| 4 2 | 
             
              def searcher(pattern, result, options={})
         | 
| 5 3 | 
             
                described_class.new(pattern, result, options)
         | 
| 6 4 | 
             
              end
         | 
| @@ -22,13 +20,13 @@ describe HipchatSearcher::Searcher do | |
| 22 20 | 
             
                end
         | 
| 23 21 | 
             
              end
         | 
| 24 22 |  | 
| 25 | 
            -
              describe '# | 
| 23 | 
            +
              describe '#around_items' do
         | 
| 26 24 | 
             
                describe 'you speciy :before_context option' do
         | 
| 27 25 | 
             
                  context 'when specify the range is included in the array' do
         | 
| 28 | 
            -
                    subject { searcher(pattern, result, before_context: '3'). | 
| 26 | 
            +
                    subject { searcher(pattern, result, before_context: '3').around_items(3) }
         | 
| 29 27 |  | 
| 30 28 | 
             
                    let(:pattern) { 'fuga' }
         | 
| 31 | 
            -
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6 | 
| 29 | 
            +
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6|.reverse) }
         | 
| 32 30 |  | 
| 33 31 | 
             
                    it 'should return the array of range to include index you specify' do
         | 
| 34 32 | 
             
                      should == %w|1 2 3 4|
         | 
| @@ -36,10 +34,10 @@ describe HipchatSearcher::Searcher do | |
| 36 34 | 
             
                  end
         | 
| 37 35 |  | 
| 38 36 | 
             
                  context 'when specify the range is exluded in the array' do
         | 
| 39 | 
            -
                    subject { searcher(pattern, result, before_context: '3'). | 
| 37 | 
            +
                    subject { searcher(pattern, result, before_context: '3').around_items(1) }
         | 
| 40 38 |  | 
| 41 39 | 
             
                    let(:pattern) { 'fuga' }
         | 
| 42 | 
            -
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6 | 
| 40 | 
            +
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6|.reverse) }
         | 
| 43 41 |  | 
| 44 42 | 
             
                    it 'should return the array includes range until index from first' do
         | 
| 45 43 | 
             
                      should == %w|1 2|
         | 
| @@ -49,21 +47,21 @@ describe HipchatSearcher::Searcher do | |
| 49 47 |  | 
| 50 48 | 
             
                describe 'you specify :after_context option' do
         | 
| 51 49 | 
             
                  context 'when specify the range is included in the array' do
         | 
| 52 | 
            -
                    subject { searcher(pattern, result, after_context: '3'). | 
| 50 | 
            +
                    subject { searcher(pattern, result, after_context: '3').around_items(3) }
         | 
| 53 51 |  | 
| 54 52 | 
             
                    let(:pattern) { 'fuga' }
         | 
| 55 | 
            -
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6 | 
| 53 | 
            +
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6|.reverse) }
         | 
| 56 54 |  | 
| 57 55 | 
             
                    it 'should return the array of range to include index you specify' do
         | 
| 58 | 
            -
                      should == %w| | 
| 56 | 
            +
                      should == %w|4 5 6|
         | 
| 59 57 | 
             
                    end
         | 
| 60 58 | 
             
                  end
         | 
| 61 59 |  | 
| 62 60 | 
             
                  context 'when specify the range is exluded in the array' do
         | 
| 63 | 
            -
                    subject { searcher(pattern, result, after_context: '3'). | 
| 61 | 
            +
                    subject { searcher(pattern, result, after_context: '3').around_items(4) }
         | 
| 64 62 |  | 
| 65 63 | 
             
                    let(:pattern) { 'fuga' }
         | 
| 66 | 
            -
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6 | 
| 64 | 
            +
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6|.reverse) }
         | 
| 67 65 |  | 
| 68 66 | 
             
                    it 'should return the array includes range until the end from index' do
         | 
| 69 67 | 
             
                      should == %w|5 6|
         | 
| @@ -73,10 +71,10 @@ describe HipchatSearcher::Searcher do | |
| 73 71 |  | 
| 74 72 | 
             
                describe 'you specify :context option' do
         | 
| 75 73 | 
             
                  context 'when specify the range is included in the array' do
         | 
| 76 | 
            -
                    subject { searcher(pattern, result, context: '2'). | 
| 74 | 
            +
                    subject { searcher(pattern, result, context: '2').around_items(3) }
         | 
| 77 75 |  | 
| 78 76 | 
             
                    let(:pattern) { 'fuga' }
         | 
| 79 | 
            -
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6 | 
| 77 | 
            +
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6|.reverse) }
         | 
| 80 78 |  | 
| 81 79 | 
             
                    it 'should return the array of range to surround index you specify' do
         | 
| 82 80 | 
             
                      should == %w|2 3 4 5 6|
         | 
| @@ -84,10 +82,10 @@ describe HipchatSearcher::Searcher do | |
| 84 82 | 
             
                  end
         | 
| 85 83 |  | 
| 86 84 | 
             
                  context 'when specify the range is exluded in the array' do
         | 
| 87 | 
            -
                    subject { searcher(pattern, result, context: '5'). | 
| 85 | 
            +
                    subject { searcher(pattern, result, context: '5').around_items(3) }
         | 
| 88 86 |  | 
| 89 87 | 
             
                    let(:pattern) { 'fuga' }
         | 
| 90 | 
            -
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6 | 
| 88 | 
            +
                    let(:result)  { double(:result, items: %w|1 2 3 4 5 6|.reverse) }
         | 
| 91 89 |  | 
| 92 90 | 
             
                    it 'should return the array includes range to surround as much as possible' do
         | 
| 93 91 | 
             
                      should == %w|1 2 3 4 5 6|
         | 
| @@ -97,61 +95,10 @@ describe HipchatSearcher::Searcher do | |
| 97 95 | 
             
              end
         | 
| 98 96 |  | 
| 99 97 | 
             
              describe '#search' do
         | 
| 100 | 
            -
                context 'when matches pattern in messages' do
         | 
| 101 | 
            -
                  subject { searcher(pattern, result).search }
         | 
| 102 | 
            -
             | 
| 103 | 
            -
                  let(:pattern)  { 'yare' }
         | 
| 104 | 
            -
                  let(:result) do
         | 
| 105 | 
            -
                    response = File.read(File.join('spec', 'data', 'item-list.json'))
         | 
| 106 | 
            -
                    HipchatSearcher::Result.new(response).tap do |r|
         | 
| 107 | 
            -
                      r.room = "Joestars"
         | 
| 108 | 
            -
                    end
         | 
| 109 | 
            -
                  end
         | 
| 110 | 
            -
                  let(:search_result) do
         | 
| 111 | 
            -
                    "\e[4;39;49mJoestars\e[0m" + "\n" + \
         | 
| 112 | 
            -
                    "  Date: 2014-05-30T01:38:16.741565+00:00" + "\n" + \
         | 
| 113 | 
            -
                    "  @jotaro: \e[0;31;49myare\e[0m\e[0;31;49myare\e[0m daze" + "\n" + \
         | 
| 114 | 
            -
                    "\n"
         | 
| 115 | 
            -
                  end
         | 
| 116 | 
            -
             | 
| 117 | 
            -
                  it 'should print roomname & search result' do
         | 
| 118 | 
            -
                    expect do
         | 
| 119 | 
            -
                      subject
         | 
| 120 | 
            -
                    end.to output(search_result).to_stdout
         | 
| 121 | 
            -
                  end
         | 
| 122 | 
            -
                end
         | 
| 123 | 
            -
             | 
| 124 | 
            -
                context 'when matches pattern in many messages' do
         | 
| 125 | 
            -
                  subject { searcher(pattern, result).search }
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                  let(:pattern)  { 'ze' }
         | 
| 128 | 
            -
                  let(:result) do
         | 
| 129 | 
            -
                    response = File.read(File.join('spec', 'data', 'item-list.json'))
         | 
| 130 | 
            -
                    HipchatSearcher::Result.new(response).tap do |r|
         | 
| 131 | 
            -
                      r.room = "Joestars"
         | 
| 132 | 
            -
                    end
         | 
| 133 | 
            -
                  end
         | 
| 134 | 
            -
                  let(:search_result) do
         | 
| 135 | 
            -
                    "\e[4;39;49mJoestars\e[0m" + "\n" + \
         | 
| 136 | 
            -
                    "  Date: 2014-05-30T01:38:16.741565+00:00" + "\n" + \
         | 
| 137 | 
            -
                    "  @jotaro: yareyare da\e[0;31;49mze\e[0m" + "\n" \
         | 
| 138 | 
            -
                    "\n" + \
         | 
| 139 | 
            -
                    "  Date: 2014-06-09T11:29:10.209014+00:00" + "\n" + \
         | 
| 140 | 
            -
                    "  @polnareff: a... arinomama ima okotta koto wo hanasu \e[0;31;49mze\e[0m" + "\n" + \
         | 
| 141 | 
            -
                    "\n"
         | 
| 142 | 
            -
                  end
         | 
| 143 | 
            -
             | 
| 144 | 
            -
                  it 'should print roomname & search result' do
         | 
| 145 | 
            -
                    expect do
         | 
| 146 | 
            -
                      subject
         | 
| 147 | 
            -
                    end.to output(search_result).to_stdout
         | 
| 148 | 
            -
                  end
         | 
| 149 | 
            -
                end
         | 
| 150 | 
            -
             | 
| 151 98 | 
             
                context 'when search_option --before_context' do
         | 
| 152 99 | 
             
                  subject { searcher(pattern, result, before_context: '1').search }
         | 
| 153 100 |  | 
| 154 | 
            -
                  let(:pattern) { ' | 
| 101 | 
            +
                  let(:pattern) { 'chirp' }
         | 
| 155 102 | 
             
                  let(:result) do
         | 
| 156 103 | 
             
                    response = File.read(File.join('spec', 'data', 'item-list-with-overlap.json'))
         | 
| 157 104 | 
             
                    HipchatSearcher::Result.new(response).tap do |r|
         | 
| @@ -160,11 +107,11 @@ describe HipchatSearcher::Searcher do | |
| 160 107 | 
             
                  end
         | 
| 161 108 | 
             
                  let(:search_result) do
         | 
| 162 109 | 
             
                    "\e[4;39;49mJoestars\e[0m" + "\n" + \
         | 
| 163 | 
            -
                    "  Date: 2014-06-10T08:36:09.281643+00:00" + "\n" + \
         | 
| 164 | 
            -
                    "  @abdul: chirp chirp chirp" + "\n" + \
         | 
| 165 | 
            -
                    "\n" + \
         | 
| 166 110 | 
             
                    "  Date: 2014-06-11T19:20:47.726182+00:00" + "\n" + \
         | 
| 167 | 
            -
                    "  @lggy:  | 
| 111 | 
            +
                    "  @lggy: inu zuki no kodomo ha migoroshiniha dekine-ze" + "\n" + \
         | 
| 112 | 
            +
                    "\n" + \
         | 
| 113 | 
            +
                    "  Date: 2014-06-10T08:36:09.281643+00:00" + "\n" + \
         | 
| 114 | 
            +
                    "  @abdul: \e[0;31;49mchirp\e[0m \e[0;31;49mchirp\e[0m \e[0;31;49mchirp\e[0m" + "\n" + \
         | 
| 168 115 | 
             
                    "\n"
         | 
| 169 116 | 
             
                  end
         | 
| 170 117 |  | 
| @@ -190,8 +137,8 @@ describe HipchatSearcher::Searcher do | |
| 190 137 | 
             
                    "  Date: 2014-05-30T01:39:02.186319+00:00" + "\n" + \
         | 
| 191 138 | 
             
                    "  @noriaki: \e[0;31;49mrero\e[0m\e[0;31;49mrero\e[0m" + "\n" + \
         | 
| 192 139 | 
             
                    "\n" + \
         | 
| 193 | 
            -
                    "  Date: 2014- | 
| 194 | 
            -
                    "  @ | 
| 140 | 
            +
                    "  Date: 2014-05-30T01:38:16.741565+00:00" + "\n" + \
         | 
| 141 | 
            +
                    "  @jotaro: yareyare daze" + "\n" + \
         | 
| 195 142 | 
             
                    "\n"
         | 
| 196 143 | 
             
                  end
         | 
| 197 144 |  | 
| @@ -203,7 +150,7 @@ describe HipchatSearcher::Searcher do | |
| 203 150 | 
             
                end
         | 
| 204 151 |  | 
| 205 152 | 
             
                context 'when search_option --context' do
         | 
| 206 | 
            -
                  subject { searcher(pattern, result, context: ' | 
| 153 | 
            +
                  subject { searcher(pattern, result, context: '1').search }
         | 
| 207 154 |  | 
| 208 155 | 
             
                  let(:pattern) { 'chirp' }
         | 
| 209 156 | 
             
                  let(:result) do
         | 
| @@ -214,17 +161,14 @@ describe HipchatSearcher::Searcher do | |
| 214 161 | 
             
                  end
         | 
| 215 162 | 
             
                  let(:search_result) do
         | 
| 216 163 | 
             
                    "\e[4;39;49mJoestars\e[0m" + "\n" + \
         | 
| 217 | 
            -
                    "  Date: 2014- | 
| 218 | 
            -
                    "  @ | 
| 219 | 
            -
                    "\n" + \
         | 
| 220 | 
            -
                    "  Date: 2014-06-09T11:29:10.209014+00:00" + "\n" + \
         | 
| 221 | 
            -
                    "  @polnareff: a... arinomama ima okotta koto wo hanasu ze" + "\n" + \
         | 
| 164 | 
            +
                    "  Date: 2014-06-11T19:20:47.726182+00:00" + "\n" + \
         | 
| 165 | 
            +
                    "  @lggy: inu zuki no kodomo ha migoroshiniha dekine-ze" + "\n" + \
         | 
| 222 166 | 
             
                    "\n" + \
         | 
| 223 167 | 
             
                    "  Date: 2014-06-10T08:36:09.281643+00:00" + "\n" + \
         | 
| 224 168 | 
             
                    "  @abdul: \e[0;31;49mchirp\e[0m \e[0;31;49mchirp\e[0m \e[0;31;49mchirp\e[0m" + "\n" + \
         | 
| 225 169 | 
             
                    "\n" + \
         | 
| 226 | 
            -
                    "  Date: 2014-06- | 
| 227 | 
            -
                    "  @ | 
| 170 | 
            +
                    "  Date: 2014-06-09T11:29:10.209014+00:00" + "\n" + \
         | 
| 171 | 
            +
                    "  @polnareff: a... arinomama ima okotta koto wo hanasu ze" + "\n" + \
         | 
| 228 172 | 
             
                    "\n"
         | 
| 229 173 | 
             
                  end
         | 
| 230 174 |  | 
| @@ -247,20 +191,20 @@ describe HipchatSearcher::Searcher do | |
| 247 191 | 
             
                  end
         | 
| 248 192 | 
             
                  let(:search_result) do
         | 
| 249 193 | 
             
                    "\e[4;39;49mJoestars\e[0m" + "\n" + \
         | 
| 250 | 
            -
                    "  Date: 2014- | 
| 251 | 
            -
                    "  @ | 
| 194 | 
            +
                    "  Date: 2014-06-11T19:20:47.726182+00:00" + "\n" + \
         | 
| 195 | 
            +
                    "  @lggy: inu zuki no kodomo ha migoroshiniha dekine-\e[0;31;49mze\e[0m" + "\n" + \
         | 
| 252 196 | 
             
                    "\n" + \
         | 
| 253 | 
            -
                    "  Date: 2014- | 
| 254 | 
            -
                    "  @ | 
| 197 | 
            +
                    "  Date: 2014-06-10T08:36:09.281643+00:00" + "\n" + \
         | 
| 198 | 
            +
                    "  @abdul: chirp chirp chirp" + "\n" + \
         | 
| 255 199 | 
             
                    "\n" + \
         | 
| 256 200 | 
             
                    "  Date: 2014-06-09T11:29:10.209014+00:00" + "\n" + \
         | 
| 257 201 | 
             
                    "  @polnareff: a... arinomama ima okotta koto wo hanasu \e[0;31;49mze\e[0m" + "\n" + \
         | 
| 258 202 | 
             
                    "\n" + \
         | 
| 259 | 
            -
                    "  Date: 2014- | 
| 260 | 
            -
                    "  @ | 
| 203 | 
            +
                    "  Date: 2014-05-30T01:39:02.186319+00:00" + "\n" + \
         | 
| 204 | 
            +
                    "  @noriaki: rerorero" + "\n" + \
         | 
| 261 205 | 
             
                    "\n" + \
         | 
| 262 | 
            -
                    "  Date: 2014- | 
| 263 | 
            -
                    "  @ | 
| 206 | 
            +
                    "  Date: 2014-05-30T01:38:16.741565+00:00" + "\n" + \
         | 
| 207 | 
            +
                    "  @jotaro: yareyare da\e[0;31;49mze\e[0m" + "\n" + \
         | 
| 264 208 | 
             
                    "\n"
         | 
| 265 209 | 
             
                  end
         | 
| 266 210 |  | 
| @@ -271,37 +215,28 @@ describe HipchatSearcher::Searcher do | |
| 271 215 | 
             
                  end
         | 
| 272 216 | 
             
                end
         | 
| 273 217 |  | 
| 274 | 
            -
                context  | 
| 275 | 
            -
                  subject { searcher(pattern, result).search }
         | 
| 218 | 
            +
                context 'when you specify option date and include item date no later than this date' do
         | 
| 219 | 
            +
                  subject { searcher(pattern, result, date: '2014-06-10', before_context: 1).search }
         | 
| 276 220 |  | 
| 277 | 
            -
                  let(:pattern) { ' | 
| 221 | 
            +
                  let(:pattern) { 'ze' }
         | 
| 278 222 | 
             
                  let(:result) do
         | 
| 279 | 
            -
                    response = File.read(File.join('spec', 'data', 'item-list.json'))
         | 
| 280 | 
            -
                    HipchatSearcher::Result.new(response)
         | 
| 281 | 
            -
             | 
| 282 | 
            -
             | 
| 283 | 
            -
                  it { should be_nil }
         | 
| 284 | 
            -
             | 
| 285 | 
            -
                  it 'should no output to stdout' do
         | 
| 286 | 
            -
                    expect do
         | 
| 287 | 
            -
                      subject
         | 
| 288 | 
            -
                    end.to output('').to_stdout
         | 
| 223 | 
            +
                    response = File.read(File.join('spec', 'data', 'item-list-with-overlap.json'))
         | 
| 224 | 
            +
                    HipchatSearcher::Result.new(response).tap do |r|
         | 
| 225 | 
            +
                      r.room = "Joestars"
         | 
| 226 | 
            +
                    end
         | 
| 289 227 | 
             
                  end
         | 
| 290 | 
            -
                end
         | 
| 291 | 
            -
             | 
| 292 | 
            -
                context "when pattern can't convert regexp" do
         | 
| 293 | 
            -
                  subject { searcher(pattern, result).search }
         | 
| 294 228 |  | 
| 295 | 
            -
                  let(: | 
| 296 | 
            -
             | 
| 297 | 
            -
                     | 
| 298 | 
            -
                     | 
| 229 | 
            +
                  let(:search_result) do
         | 
| 230 | 
            +
                    "\e[4;39;49mJoestars\e[0m" + "\n" + \
         | 
| 231 | 
            +
                    "  Date: 2014-06-11T19:20:47.726182+00:00" + "\n" + \
         | 
| 232 | 
            +
                    "  @lggy: inu zuki no kodomo ha migoroshiniha dekine-\e[0;31;49mze\e[0m" + "\n" + \
         | 
| 233 | 
            +
                    "\n"
         | 
| 299 234 | 
             
                  end
         | 
| 300 235 |  | 
| 301 | 
            -
                  it 'should  | 
| 236 | 
            +
                  it 'should print the matched message since option date' do
         | 
| 302 237 | 
             
                    expect do
         | 
| 303 238 | 
             
                      subject
         | 
| 304 | 
            -
                    end.to  | 
| 239 | 
            +
                    end.to output(search_result).to_stdout
         | 
| 305 240 | 
             
                  end
         | 
| 306 241 | 
             
                end
         | 
| 307 242 | 
             
              end
         | 
| @@ -311,7 +246,7 @@ describe HipchatSearcher::Searcher do | |
| 311 246 | 
             
                  hash  = JSON.parse(File.read(path))
         | 
| 312 247 | 
             
                  items = ::Hashie::Mash.new(hash).items
         | 
| 313 248 | 
             
                  items.map do |itm|
         | 
| 314 | 
            -
                    itm.extend(HipchatSearcher:: | 
| 249 | 
            +
                    itm.extend(HipchatSearcher::ItemExtention).tap do |i|
         | 
| 315 250 | 
             
                      i.pattern = Regexp.new(pattern)
         | 
| 316 251 | 
             
                    end
         | 
| 317 252 | 
             
                  end
         |