ruboty-twitter_search 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f88bd9756ef6329faba9bf3512d885b66cf4397b
4
- data.tar.gz: a75d64d9f6698a997f69502ece9a7b06b38f1756
3
+ metadata.gz: a101873c2cb41d5d728cf61262f77bf2a5e3d890
4
+ data.tar.gz: c29ce2d0503b71933e1e92edcdc549684afebb8f
5
5
  SHA512:
6
- metadata.gz: 4c60fd7d4eb1435fb19902697d14ad320ac303c32dd39d106df76c73263a7a4554c1f8e91d7f7064f5f69356f05b6135dad2ea0130e64e8558dcc411a255ceeb
7
- data.tar.gz: 776e7c14ca411273fd9c95cb588d77345d32087fc62c376e295a0138307ae85fd3081e4e5fbb5c388748a9af29755580d445fa87af0013837df46b8242d7855e
6
+ metadata.gz: 9725086905c97364564ffda709cb6ef96827771755e5b4e597d45d5efac9c8f46c3e5a403e7fe7803656142730cc1581914354dd244dbe738a010cffc4b43190
7
+ data.tar.gz: 239e4ae74c634f5fa15653e977f69f766cfeb2768a8b3112d867428014e989c7ac79ce6f0b2f26c7da17403cb71f65db809649201a4e752bb3de42fd45aefde3
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,68 @@
1
+ Lint/AssignmentInCondition:
2
+ Enabled: false
3
+
4
+ Lint/EnsureReturn:
5
+ Enabled: false
6
+
7
+ Lint/UnusedBlockArgument:
8
+ Enabled: false
9
+
10
+ Lint/UnusedMethodArgument:
11
+ Enabled: false
12
+
13
+ Metrics/AbcSize:
14
+ Enabled: false
15
+
16
+ Metrics/ClassLength:
17
+ Enabled: false
18
+
19
+ Metrics/CyclomaticComplexity:
20
+ Enabled: false
21
+
22
+ Metrics/LineLength:
23
+ Max: 120
24
+
25
+ Metrics/MethodLength:
26
+ Enabled: false
27
+
28
+ Metrics/PerceivedComplexity:
29
+ Enabled: false
30
+
31
+ Style/Documentation:
32
+ Enabled: false
33
+
34
+ Style/DoubleNegation:
35
+ Enabled: false
36
+
37
+ Style/FormatString:
38
+ Enabled: false
39
+
40
+ Style/GuardClause:
41
+ Enabled: false
42
+
43
+ Style/IfUnlessModifier:
44
+ Enabled: false
45
+
46
+ Style/MultilineBlockChain:
47
+ Enabled: false
48
+
49
+ Style/PercentLiteralDelimiters:
50
+ Enabled: false
51
+
52
+ Style/PredicateName:
53
+ Enabled: false
54
+
55
+ Style/RegexpLiteral:
56
+ MaxSlashes: 0
57
+
58
+ Style/SignalException:
59
+ Enabled: false
60
+
61
+ Style/StringLiterals:
62
+ EnforcedStyle: double_quotes
63
+
64
+ Style/TrailingComma:
65
+ Enabled: false
66
+
67
+ Style/TrivialAccessors:
68
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.1.0
2
+ - Support search filter query (Thx @gong023)
3
+
1
4
  ## 0.0.4
2
5
  - Fix bug on v0.0.3
3
6
 
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
- # Specify your gem's dependencies in ruboty-twitter_search.gemspec
4
3
  gemspec
data/README.md CHANGED
@@ -1,30 +1,21 @@
1
- # Ruboty::TwitterSearch
1
+ # Ruboty::TwitterSearch [![Build Status](https://travis-ci.org/r7kamura/ruboty-twitter_search.svg)](https://travis-ci.org/r7kamura/ruboty-twitter_search)
2
2
  [Ruboty](https://github.com/r7kamura/ruboty-twitter_search) plug-in to search twitter.
3
3
 
4
4
  ## Usage
5
+ Search with given query and show tweet URLs.
6
+ (Note: `since_id` will be stored in ruboty's brain to same query by default)
7
+
5
8
  ```
6
9
  @ruboty search twitter by <query>
7
10
  ```
8
11
 
9
12
  ### Example
10
13
  ```
11
- $ bundle exec ruboty --dotenv
12
- Type `exit` or `quit` to end the session.
13
- > @ruboty search twitter by sushi
14
- https://twitter.com/meshiumaa/status/573806861956214786
15
- https://twitter.com/yijinglai/status/573806872169291777
16
- https://twitter.com/bone_sushi/status/573806877340893184
17
- https://twitter.com/namaakubi_/status/573806888015388672
18
- https://twitter.com/NIGIRE_sushi/status/573806891211452416
19
- https://twitter.com/Rymdensbarn/status/573806901722488832
20
- https://twitter.com/SmaltimoreMD/status/573806917316968448
21
- https://twitter.com/ornat/status/573806982852968448
22
- https://twitter.com/kelZoom/status/573806985805754368
23
- https://twitter.com/DT_Hanmer/status/573807032286973952
24
- > @ruboty search twitter by sushi
25
- https://twitter.com/Sushi_sweetegg/status/573807039224279040
26
- > @ruboty search twitter by sushi
27
- >
14
+ @ruboty search twitter by sushi
15
+ @ruboty search twitter by sushi fav:10
16
+ @ruboty search twitter by sushi retweet:20
17
+ @ruboty search twitter by sushi result_type:popular
18
+ @ruboty search twitter by sushi result_type:mixed
28
19
  ```
29
20
 
30
21
  ## ENV
data/Rakefile CHANGED
@@ -1,2 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ require "rubocop/rake_task"
2
4
 
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ RuboCop::RakeTask.new(:style)
7
+ task default: [:style, :spec]
@@ -1,11 +1,11 @@
1
1
  require "ruboty"
2
2
  require "twitter"
3
- require "yaml"
4
3
 
5
4
  module Ruboty
6
5
  module Handlers
7
6
  class TwitterSearch < Base
8
7
  NAMESPACE = "twitter-search"
8
+ TWEETS_COUNT = 10
9
9
 
10
10
  env :TWITTER_ACCESS_TOKEN, "Twitter access token"
11
11
  env :TWITTER_ACCESS_TOKEN_SECRET, "Twitter access token secret"
@@ -21,7 +21,22 @@ module Ruboty
21
21
 
22
22
  # @return [true] to prevent running missing handlers.
23
23
  def search(message)
24
- statuses = client.search(message[:query], since_id: fetch_since_id_for(message[:query])).take(10)
24
+ query = Query.new(message[:query])
25
+
26
+ statuses = client.search(
27
+ query.query_string,
28
+ result_type: query.result_type,
29
+ since_id: fetch_since_id_for(message[:query]),
30
+ ).take(TWEETS_COUNT)
31
+
32
+ statuses.select! do |status|
33
+ status.retweet_count >= query.minimum_retweet_count
34
+ end
35
+
36
+ statuses.select! do |status|
37
+ status.favorite_count >= query.minimum_favorite_count
38
+ end
39
+
25
40
  if statuses.any?
26
41
  message.reply(StatusesView.new(statuses).to_s)
27
42
  store_since_id(query: message[:query], since_id: statuses.first.id)
@@ -66,6 +81,55 @@ module Ruboty
66
81
  end
67
82
  end
68
83
 
84
+ class Query
85
+ DEFAULT_MINIMUM_FAVORITE_COUNT = 0
86
+ DEFAULT_MINIMUM_RETWEET_COUNT = 0
87
+
88
+ # @param [String] original_query_string
89
+ def initialize(original_query_string)
90
+ @original_query_string = original_query_string
91
+ end
92
+
93
+ # @return [Fixnum]
94
+ def minimum_favorite_count
95
+ if token = tokens.find(&:favorite_count_filter?)
96
+ token.favorite_count
97
+ else
98
+ DEFAULT_MINIMUM_FAVORITE_COUNT
99
+ end
100
+ end
101
+
102
+ # @return [Fixnum]
103
+ def minimum_retweet_count
104
+ if token = tokens.find(&:retweet_count_filter?)
105
+ token.retweet_count
106
+ else
107
+ DEFAULT_MINIMUM_RETWEET_COUNT
108
+ end
109
+ end
110
+
111
+ # @return [String]
112
+ def query_string
113
+ tokens.reject(&:filter?).join(" ")
114
+ end
115
+
116
+ # @return [String, nil]
117
+ def result_type
118
+ if token = tokens.find(&:result_type_filter?)
119
+ token.result_type
120
+ end
121
+ end
122
+
123
+ private
124
+
125
+ # @return [Array<Ruboty::Handlers::TwitterSearch::Token>]
126
+ def tokens
127
+ @tokens ||= @original_query_string.split.map do |token_string|
128
+ Token.new(token_string)
129
+ end
130
+ end
131
+ end
132
+
69
133
  class StatusesView
70
134
  def initialize(statuses)
71
135
  @statuses = statuses
@@ -83,6 +147,53 @@ module Ruboty
83
147
  end
84
148
  end
85
149
  end
150
+
151
+ class Token
152
+ def initialize(token_string)
153
+ @token_string = token_string
154
+ end
155
+
156
+ # @return [Fixnum, nil]
157
+ def favorite_count
158
+ if @token_string.match(/\Afav:(?<count>\d+)\z/)
159
+ Regexp.last_match(:count).to_i
160
+ end
161
+ end
162
+
163
+ def favorite_count_filter?
164
+ !favorite_count.nil?
165
+ end
166
+
167
+ def filter?
168
+ favorite_count_filter? || result_type_filter? || retweet_count_filter?
169
+ end
170
+
171
+ # @return [String, nil]
172
+ def result_type
173
+ if @token_string.match(/\Aresult_type:(?<type>\w+)\z/)
174
+ Regexp.last_match(:type)
175
+ end
176
+ end
177
+
178
+ def result_type_filter?
179
+ !result_type.nil?
180
+ end
181
+
182
+ # @return [Fixnum, nil]
183
+ def retweet_count
184
+ if @token_string.match(/\Aretweet:(?<count>\d+)\z/)
185
+ Regexp.last_match(:count).to_i
186
+ end
187
+ end
188
+
189
+ def retweet_count_filter?
190
+ !retweet_count.nil?
191
+ end
192
+
193
+ def to_s
194
+ @token_string
195
+ end
196
+ end
86
197
  end
87
198
  end
88
199
  end
@@ -1,5 +1,5 @@
1
1
  module Ruboty
2
2
  module TwitterSearch
3
- VERSION = "0.0.4"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -20,4 +20,6 @@ Gem::Specification.new do |spec|
20
20
  spec.add_dependency "twitter"
21
21
  spec.add_development_dependency "bundler", "~> 1.7"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec", "3.2.0"
24
+ spec.add_development_dependency "rubocop", "0.29.1"
23
25
  end
@@ -0,0 +1,165 @@
1
+ RSpec.describe Ruboty::Handlers::TwitterSearch::Query do
2
+ let(:query) do
3
+ described_class.new(original_string)
4
+ end
5
+
6
+ describe "#minimum_favorite_count" do
7
+ subject do
8
+ query.minimum_favorite_count
9
+ end
10
+
11
+ context "with favorite count filter" do
12
+ let(:original_string) do
13
+ "a fav:10"
14
+ end
15
+
16
+ it { is_expected.to eq 10 }
17
+ end
18
+
19
+ context "without favorite count filter" do
20
+ let(:original_string) do
21
+ "a"
22
+ end
23
+
24
+ it { is_expected.to eq 0 }
25
+ end
26
+ end
27
+
28
+ describe "#minimum_retweet_count" do
29
+ subject do
30
+ query.minimum_retweet_count
31
+ end
32
+
33
+ context "with retweet count filter" do
34
+ let(:original_string) do
35
+ "a retweet:10"
36
+ end
37
+
38
+ it { is_expected.to eq 10 }
39
+ end
40
+
41
+ context "without retweet count filter" do
42
+ let(:original_string) do
43
+ "a"
44
+ end
45
+
46
+ it { is_expected.to eq 0 }
47
+ end
48
+ end
49
+
50
+ describe "#query_string" do
51
+ subject do
52
+ query.query_string
53
+ end
54
+
55
+ context "with simple string" do
56
+ let(:original_string) do
57
+ "a"
58
+ end
59
+
60
+ it { is_expected.to eq "a" }
61
+ end
62
+
63
+ context "with empty string" do
64
+ let(:original_string) do
65
+ ""
66
+ end
67
+
68
+ it { is_expected.to eq "" }
69
+ end
70
+
71
+ context "with space-separated string" do
72
+ let(:original_string) do
73
+ "a b"
74
+ end
75
+
76
+ it { is_expected.to eq "a b" }
77
+ end
78
+
79
+ context "with spaces-separated string" do
80
+ let(:original_string) do
81
+ "a b"
82
+ end
83
+
84
+ it { is_expected.to eq "a b" }
85
+ end
86
+
87
+ context "with tab-separated string" do
88
+ let(:original_string) do
89
+ "a\tb"
90
+ end
91
+
92
+ it { is_expected.to eq "a b" }
93
+ end
94
+
95
+ context "with favorite count filter" do
96
+ let(:original_string) do
97
+ "a fav:10"
98
+ end
99
+
100
+ it { is_expected.to eq "a" }
101
+ end
102
+
103
+ context "with invalid favorite count filter" do
104
+ let(:original_string) do
105
+ "a fav:b"
106
+ end
107
+
108
+ it { is_expected.to eq "a fav:b" }
109
+ end
110
+
111
+ context "with retweet count filter" do
112
+ let(:original_string) do
113
+ "a retweet:10"
114
+ end
115
+
116
+ it { is_expected.to eq "a" }
117
+ end
118
+
119
+ context "with invalid retweet count filter" do
120
+ let(:original_string) do
121
+ "a retweet:b"
122
+ end
123
+
124
+ it { is_expected.to eq "a retweet:b" }
125
+ end
126
+
127
+ context "with result type filter" do
128
+ let(:original_string) do
129
+ "a result_type:popular"
130
+ end
131
+
132
+ it { is_expected.to eq "a" }
133
+ end
134
+
135
+ context "with invalid retweet count filter" do
136
+ let(:original_string) do
137
+ "a result_type:b-c"
138
+ end
139
+
140
+ it { is_expected.to eq "a result_type:b-c" }
141
+ end
142
+ end
143
+
144
+ describe "#result_type" do
145
+ subject do
146
+ query.result_type
147
+ end
148
+
149
+ context "with result type filter" do
150
+ let(:original_string) do
151
+ "a result_type:popular"
152
+ end
153
+
154
+ it { is_expected.to eq "popular" }
155
+ end
156
+
157
+ context "without result type filter" do
158
+ let(:original_string) do
159
+ "a"
160
+ end
161
+
162
+ it { is_expected.to be_nil }
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,16 @@
1
+ require "ruboty/twitter_search"
2
+
3
+ RSpec.configure do |config|
4
+ config.expect_with :rspec do |expectations|
5
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
6
+ end
7
+
8
+ config.mock_with :rspec do |mocks|
9
+ mocks.verify_partial_doubles = true
10
+ end
11
+
12
+ config.disable_monkey_patching!
13
+ config.filter_run :focus
14
+ config.run_all_when_everything_filtered = true
15
+ config.warnings = true
16
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruboty-twitter_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-06 00:00:00.000000000 Z
11
+ date: 2015-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruboty
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 3.2.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 3.2.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.29.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.29.1
69
97
  description:
70
98
  email:
71
99
  - r7kamura@gmail.com
@@ -74,6 +102,9 @@ extensions: []
74
102
  extra_rdoc_files: []
75
103
  files:
76
104
  - ".gitignore"
105
+ - ".rspec"
106
+ - ".rubocop.yml"
107
+ - ".travis.yml"
77
108
  - CHANGELOG.md
78
109
  - Gemfile
79
110
  - LICENSE.txt
@@ -83,6 +114,8 @@ files:
83
114
  - lib/ruboty/twitter_search.rb
84
115
  - lib/ruboty/twitter_search/version.rb
85
116
  - ruboty-twitter_search.gemspec
117
+ - spec/ruboty/handlers/twitter_search/query_spec.rb
118
+ - spec/spec_helper.rb
86
119
  homepage: https://github.com/r7kamura/ruboty-twitter_search
87
120
  licenses:
88
121
  - MIT
@@ -107,5 +140,7 @@ rubygems_version: 2.4.5
107
140
  signing_key:
108
141
  specification_version: 4
109
142
  summary: Ruboty plug-in to search twitter.
110
- test_files: []
143
+ test_files:
144
+ - spec/ruboty/handlers/twitter_search/query_spec.rb
145
+ - spec/spec_helper.rb
111
146
  has_rdoc: