ruby_pocket 0.1.3 → 0.1.4

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
- SHA1:
3
- metadata.gz: 5cff6dc912a4415ac6379839f53445800b7fc270
4
- data.tar.gz: 7c9f1f462323ca7ac5281162db4eb792b45ed58f
2
+ SHA256:
3
+ metadata.gz: ccbd18e12939796077e43f683fc57f051786e02bfb97777bbc7f50503d93ace6
4
+ data.tar.gz: 13e6cf6b40c5eef23bb87ebdbaa1a6ab0df9acdd7a28ff0b869592ce66b33087
5
5
  SHA512:
6
- metadata.gz: bb2471ae6b709be547ea7ba5f4d47d187804651fe6ef4e49b46b94f446afd16208010bb7cb627e3a81bfb13b35a12dbdb92b9810eb895210585bb0cf56bc993e
7
- data.tar.gz: f646e87f9cfb213f7b6f2b6447f5a7524f09a4846df91e35bf7dcbe28be885084c2002587dcbe5b5686eef2c3247e6f4a6f7949565c714e4024406f2303ce9dd
6
+ metadata.gz: 39c7436ba67003e448748e1bc5f6de032735655f15b5b7b86f64463717abffa91ed8164335fece74823b4d1cb9ee00119278c2ed67afd6839b010bce815a5cb7
7
+ data.tar.gz: bbc58885e77da66edbead67b568bc090dbe39dd631e4ff2b4c42062ab2ad650ea5ea78cb7cdc92e7a9b69e282e949e531e363cb2878a4174c4132da471835818
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![Test Coverage](https://codeclimate.com/github/thiagoa/ruby_pocket/badges/coverage.svg)](https://codeclimate.com/github/thiagoa/ruby_pocket/coverage)
6
6
  [![Travis CI](https://travis-ci.org/thiagoa/ruby_pocket.svg)](https://travis-ci.org/thiagoa/ruby_pocket)
7
7
 
8
- *A warm place to store your precious development references.*
8
+ *A warm place to store your development references.*
9
9
 
10
10
  Although it has *pocket* in its name, **Ruby Pocket** is not a **Pocket** nor a
11
11
  **Readability** clone. It is a tool designed to store useful all-around
@@ -117,6 +117,18 @@ $ pocket -l -t command-line
117
117
  +----+------------------------------------------------------------------+--------------------+
118
118
  ```
119
119
 
120
+ Filter favorites by partial tag matching:
121
+
122
+ ```sh
123
+ $ pocket -l -t /line/
124
+
125
+ +----+------------------------------------------------------------------+--------------------+
126
+ | ID | Name | Tags |
127
+ +----+------------------------------------------------------------------+--------------------+
128
+ | 2 | The Art of Command Line | command-line |
129
+ +----+------------------------------------------------------------------+--------------------+
130
+ ```
131
+
120
132
  Open a favorite in your default browser. Use the ID of the favorite:
121
133
 
122
134
  ```sh
@@ -138,7 +150,6 @@ Favorite 'The Art of Command Line' deleted
138
150
  - Edit favorites.
139
151
  - List available tags.
140
152
  - Interactive command mode.
141
- - Search favorites with partial tag matching.
142
153
  - Search favorites by name or by content, with regex support.
143
154
  - Group favorites by tag, and other useful view modes.
144
155
  - Link database to another folder, such as **Dropbox**. That action shall be
data/Rakefile CHANGED
@@ -9,8 +9,6 @@ def run_tests(test_files)
9
9
  require 'minitest'
10
10
 
11
11
  test_files.each { |file | require file.expand_path }
12
-
13
- Minitest.run
14
12
  end
15
13
 
16
14
  desc 'Run unit tests'
data/bin/pocket CHANGED
@@ -16,7 +16,7 @@ options = Cli::Options.new
16
16
 
17
17
  option_parser = OptionParser.new do |opts|
18
18
  opts.banner = <<-HEADER
19
- Ruby Pocket - A warm place to store your precious development references
19
+ Ruby Pocket - A warm place to store your development references
20
20
 
21
21
  Usage: #{File.basename($PROGRAM_NAME)} [action] [options]
22
22
  HEADER
data/config/database.rb CHANGED
@@ -6,7 +6,6 @@ db_path = if RubyPocket.environment.production?
6
6
 
7
7
  DB = Sequel.connect("sqlite://#{File.join(*db_path)}")
8
8
 
9
- Sequel::Model :validation_helpers
10
9
  Sequel.extension :migration
11
10
 
12
11
  Pathname(__dir__).join('../db/migrations').tap do |migrations_path|
data/db/pocket_test.db CHANGED
Binary file
@@ -3,6 +3,7 @@ require 'ruby_pocket/tag'
3
3
  module RubyPocket
4
4
  class Favorite < Sequel::Model
5
5
  plugin :validation_helpers
6
+ plugin :whitelist_security
6
7
 
7
8
  many_to_many :tags
8
9
 
@@ -7,9 +7,9 @@ module RubyPocket
7
7
  class FavoriteCreator
8
8
  extend Forwardable
9
9
 
10
- attr_accessor :web_page
10
+ attr_writer :web_page
11
11
 
12
- delegate :name => :favorite
12
+ delegate name: :favorite
13
13
 
14
14
  def initialize(params)
15
15
  @params = params
@@ -1,8 +1,10 @@
1
1
  require 'ruby_pocket/favorite'
2
+ require 'ruby_pocket/tags_query_helper'
2
3
 
3
4
  module RubyPocket
4
5
  class FavoriteQuery
5
6
  extend Forwardable
7
+ include TagsQueryHelper
6
8
 
7
9
  def self.where(options)
8
10
  new.where(options)
@@ -16,7 +18,7 @@ module RubyPocket
16
18
 
17
19
  def where(options)
18
20
  if options[:tag_names]
19
- tags = Tag.find_all(options[:tag_names])
21
+ tags = find_all_tags(options[:tag_names])
20
22
  @scope = where_tags(tags)
21
23
  end
22
24
 
@@ -27,7 +29,7 @@ module RubyPocket
27
29
 
28
30
  def where_tags(tags)
29
31
  tags.reduce(@scope) do |scope, tag|
30
- scope.where(tags: tag)
32
+ scope.where(tag)
31
33
  end
32
34
  end
33
35
  end
@@ -2,14 +2,6 @@ module RubyPocket
2
2
  class Tag < Sequel::Model
3
3
  plugin :validation_helpers
4
4
 
5
- def self.find_all(names)
6
- names.map do |name|
7
- find(name: name).tap do |tag|
8
- fail ArgumentError, "Tag #{name} not found" unless tag
9
- end
10
- end
11
- end
12
-
13
5
  def name=(name)
14
6
  super parameterize_name(name)
15
7
  end
@@ -0,0 +1,32 @@
1
+ require 'ruby_pocket/tag'
2
+
3
+ module RubyPocket
4
+ module TagsQueryHelper
5
+ private
6
+
7
+ def find_all_tags(names)
8
+ names.map { |name| find_tag_match(name) }
9
+ end
10
+
11
+ def find_tag_match(name)
12
+ if name.start_with?(?/) && name.end_with?(?/)
13
+ find_partial_tag_match(name)
14
+ else
15
+ find_exact_tag_match(name)
16
+ end
17
+ end
18
+
19
+ def find_exact_tag_match(name)
20
+ found_tag = Tag.find(name: name).tap do |tag|
21
+ fail ArgumentError, "Tag #{name} not found" unless tag
22
+ end
23
+
24
+ { tags: found_tag }
25
+ end
26
+
27
+ def find_partial_tag_match(name)
28
+ tags = Tag.where(Sequel.like(:name, name.gsub(?/, ?%))).all
29
+ Sequel.or(tags: tags)
30
+ end
31
+ end
32
+ end
@@ -1,3 +1,3 @@
1
1
  module RubyPocket
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.4'
3
3
  end
@@ -94,5 +94,82 @@ module RubyPocket
94
94
 
95
95
  assert_match %r(not found), error.message
96
96
  end
97
+
98
+ def test_finds_favorites_by_partial_tag_matching
99
+ rubinius = create_favorite(
100
+ url: 'http://rubini.us',
101
+ tag_names: %w(rubinius)
102
+ )
103
+ ruby_tapas = create_favorite(
104
+ url: 'http://www.rubytapas.com',
105
+ tag_names: %w(ruby screencasts)
106
+ )
107
+ create_favorite(
108
+ url: 'http://railscasts.com',
109
+ tag_names: %w(screencasts)
110
+ )
111
+
112
+ favorites = FavoriteQuery
113
+ .new
114
+ .where(tag_names: %w[/rub/])
115
+ .all
116
+
117
+ assert_equal [rubinius, ruby_tapas], favorites
118
+ end
119
+
120
+ def test_finds_everything_when_using_empty_partial_match_string
121
+ railscasts = create_favorite(
122
+ url: 'http://railscasts.com',
123
+ tag_names: %w(/railscasts/)
124
+ )
125
+
126
+ favorites = FavoriteQuery
127
+ .new
128
+ .where(tag_names: %w[//])
129
+ .all
130
+
131
+ assert_equal [railscasts], favorites
132
+ end
133
+
134
+ def test_does_not_fail_when_cant_find_tags_by_partial_matching
135
+ favorites = FavoriteQuery
136
+ .new
137
+ .where(tag_names: %w[/rub/])
138
+ .all
139
+
140
+ assert_empty favorites
141
+ end
142
+
143
+ def test_has_results_when_combining_partial_with_exact_tag_matching
144
+ create_favorite(
145
+ url: 'http://existingfavorite.com',
146
+ tag_names: %w(rubinius)
147
+ )
148
+ ruby_tapas = create_favorite(
149
+ url: 'http://www.rubytapas.com',
150
+ tag_names: %w(ruby screencasts)
151
+ )
152
+
153
+ favorites = FavoriteQuery
154
+ .new
155
+ .where(tag_names: %w[screencasts /rub/])
156
+ .all
157
+
158
+ assert_equal [ruby_tapas], favorites
159
+ end
160
+
161
+ def test_does_not_have_results_when_combining_partial_with_exact_tag_matching
162
+ create_favorite(
163
+ url: 'http://existingfavorite.com',
164
+ tag_names: %w(existing)
165
+ )
166
+
167
+ favorites = FavoriteQuery
168
+ .new
169
+ .where(tag_names: %w[existing /rub/])
170
+ .all
171
+
172
+ assert_empty favorites
173
+ end
97
174
  end
98
175
  end
@@ -2,10 +2,10 @@ require 'support/default_test_case'
2
2
 
3
3
  class DatabaseTestCase < DefaultTestCase
4
4
  def setup
5
- DatabaseCleaner.start
5
+ DatabaseCleaner[:sequel].start
6
6
  end
7
7
 
8
8
  def teardown
9
- DatabaseCleaner.clean
9
+ DatabaseCleaner[:sequel].clean
10
10
  end
11
11
  end
data/test/test_helper.rb CHANGED
@@ -1,19 +1,21 @@
1
1
  $LOAD_PATH << __dir__
2
2
 
3
- if ENV['CODECLIMATE_REPO_TOKEN']
4
- require 'codeclimate-test-reporter'
5
- CodeClimate::TestReporter.start
6
- end
3
+ require 'simplecov'
4
+
5
+ SimpleCov.start
7
6
 
8
7
  require 'ruby_pocket'
9
- RubyPocket.environment = 'TEST'
10
8
 
11
- require 'database_cleaner'
9
+ RubyPocket.environment = 'TEST'
12
10
 
13
11
  require_relative '../config/config'
14
12
 
13
+ require 'database_cleaner'
14
+ require 'minitest/autorun'
15
+ require 'database_cleaner/sequel'
16
+
15
17
  require_relative 'support/default_test_case'
16
18
  require_relative 'support/database_test_case'
17
19
  require_relative 'support/feature_test_case'
18
20
 
19
- DatabaseCleaner.strategy = :truncation
21
+ DatabaseCleaner[:sequel].strategy = :truncation
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_pocket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thiago A. Silva
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-19 00:00:00.000000000 Z
11
+ date: 2021-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3
@@ -16,200 +16,240 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: '1.4'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.3.10
22
+ version: 1.4.2
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '1.3'
29
+ version: '1.4'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 1.3.10
32
+ version: 1.4.2
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: sequel
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '4.26'
39
+ version: '5.45'
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 4.26.0
42
+ version: 5.45.0
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: '4.26'
49
+ version: '5.45'
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: 4.26.0
52
+ version: 5.45.0
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: mechanize
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: '2.7'
59
+ version: '2.8'
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: 2.7.3
62
+ version: 2.8.1
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '2.7'
69
+ version: '2.8'
70
70
  - - ">="
71
71
  - !ruby/object:Gem::Version
72
- version: 2.7.3
72
+ version: 2.8.1
73
73
  - !ruby/object:Gem::Dependency
74
74
  name: terminal-table
75
75
  requirement: !ruby/object:Gem::Requirement
76
76
  requirements:
77
77
  - - "~>"
78
78
  - !ruby/object:Gem::Version
79
- version: '1.5'
79
+ version: '3.0'
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 1.5.2
82
+ version: 3.0.1
83
83
  type: :runtime
84
84
  prerelease: false
85
85
  version_requirements: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.5'
89
+ version: '3.0'
90
90
  - - ">="
91
91
  - !ruby/object:Gem::Version
92
- version: 1.5.2
92
+ version: 3.0.1
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: rake
95
95
  requirement: !ruby/object:Gem::Requirement
96
96
  requirements:
97
97
  - - "~>"
98
98
  - !ruby/object:Gem::Version
99
- version: '10.4'
99
+ version: '13.0'
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
- version: 10.4.2
102
+ version: 13.0.3
103
103
  type: :development
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: '10.4'
109
+ version: '13.0'
110
110
  - - ">="
111
111
  - !ruby/object:Gem::Version
112
- version: 10.4.2
112
+ version: 13.0.3
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: minitest
115
115
  requirement: !ruby/object:Gem::Requirement
116
116
  requirements:
117
117
  - - "~>"
118
118
  - !ruby/object:Gem::Version
119
- version: '5.8'
119
+ version: '5.14'
120
120
  - - ">="
121
121
  - !ruby/object:Gem::Version
122
- version: 5.8.0
122
+ version: 5.14.4
123
123
  type: :development
124
124
  prerelease: false
125
125
  version_requirements: !ruby/object:Gem::Requirement
126
126
  requirements:
127
127
  - - "~>"
128
128
  - !ruby/object:Gem::Version
129
- version: '5.8'
129
+ version: '5.14'
130
130
  - - ">="
131
131
  - !ruby/object:Gem::Version
132
- version: 5.8.0
132
+ version: 5.14.4
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: testrbl
135
135
  requirement: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: '0.6'
139
+ version: '0.9'
140
140
  - - ">="
141
141
  - !ruby/object:Gem::Version
142
- version: 0.6.0
142
+ version: 0.9.0
143
143
  type: :development
144
144
  prerelease: false
145
145
  version_requirements: !ruby/object:Gem::Requirement
146
146
  requirements:
147
147
  - - "~>"
148
148
  - !ruby/object:Gem::Version
149
- version: '0.6'
149
+ version: '0.9'
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
- version: 0.6.0
152
+ version: 0.9.0
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: database_cleaner
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: '1.5'
159
+ version: '2.0'
160
160
  - - ">="
161
161
  - !ruby/object:Gem::Version
162
- version: 1.5.0
162
+ version: 2.0.1
163
163
  type: :development
164
164
  prerelease: false
165
165
  version_requirements: !ruby/object:Gem::Requirement
166
166
  requirements:
167
167
  - - "~>"
168
168
  - !ruby/object:Gem::Version
169
- version: '1.5'
169
+ version: '2.0'
170
170
  - - ">="
171
171
  - !ruby/object:Gem::Version
172
- version: 1.5.0
172
+ version: 2.0.1
173
+ - !ruby/object:Gem::Dependency
174
+ name: database_cleaner-sequel
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '2.0'
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: 2.0.0
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: '2.0'
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: 2.0.0
173
193
  - !ruby/object:Gem::Dependency
174
194
  name: webmock
175
195
  requirement: !ruby/object:Gem::Requirement
176
196
  requirements:
177
197
  - - "~>"
178
198
  - !ruby/object:Gem::Version
179
- version: '1.21'
199
+ version: '3.13'
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: 3.13.0
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: '3.13'
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: 3.13.0
213
+ - !ruby/object:Gem::Dependency
214
+ name: simplecov
215
+ requirement: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - "~>"
218
+ - !ruby/object:Gem::Version
219
+ version: '0.21'
180
220
  - - ">="
181
221
  - !ruby/object:Gem::Version
182
- version: 1.21.0
222
+ version: 0.21.2
183
223
  type: :development
184
224
  prerelease: false
185
225
  version_requirements: !ruby/object:Gem::Requirement
186
226
  requirements:
187
227
  - - "~>"
188
228
  - !ruby/object:Gem::Version
189
- version: '1.21'
229
+ version: '0.21'
190
230
  - - ">="
191
231
  - !ruby/object:Gem::Version
192
- version: 1.21.0
232
+ version: 0.21.2
193
233
  - !ruby/object:Gem::Dependency
194
- name: codeclimate-test-reporter
234
+ name: pry
195
235
  requirement: !ruby/object:Gem::Requirement
196
236
  requirements:
197
237
  - - "~>"
198
238
  - !ruby/object:Gem::Version
199
- version: '0.4'
239
+ version: '0.14'
200
240
  - - ">="
201
241
  - !ruby/object:Gem::Version
202
- version: 0.4.8
242
+ version: 0.14.1
203
243
  type: :development
204
244
  prerelease: false
205
245
  version_requirements: !ruby/object:Gem::Requirement
206
246
  requirements:
207
247
  - - "~>"
208
248
  - !ruby/object:Gem::Version
209
- version: '0.4'
249
+ version: '0.14'
210
250
  - - ">="
211
251
  - !ruby/object:Gem::Version
212
- version: 0.4.8
252
+ version: 0.14.1
213
253
  description: A command line client to store and manage development favorites
214
254
  email:
215
255
  - thiagoaraujos@gmail.com
@@ -227,7 +267,6 @@ files:
227
267
  - db/migrations/001_create_tags.rb
228
268
  - db/migrations/002_create_favorites.rb
229
269
  - db/migrations/003_create_favorites_tags.rb
230
- - db/pocket_development.db
231
270
  - db/pocket_test.db
232
271
  - lib/ruby_pocket.rb
233
272
  - lib/ruby_pocket/all.rb
@@ -242,6 +281,7 @@ files:
242
281
  - lib/ruby_pocket/favorite_creator.rb
243
282
  - lib/ruby_pocket/favorite_query.rb
244
283
  - lib/ruby_pocket/tag.rb
284
+ - lib/ruby_pocket/tags_query_helper.rb
245
285
  - lib/ruby_pocket/version.rb
246
286
  - lib/ruby_pocket/web_page.rb
247
287
  - test/ruby_pocket/cli/options_test.rb
@@ -266,7 +306,7 @@ homepage: http://github.com/thiagoa/ruby_pocket
266
306
  licenses:
267
307
  - MIT
268
308
  metadata: {}
269
- post_install_message:
309
+ post_install_message:
270
310
  rdoc_options: []
271
311
  require_paths:
272
312
  - lib
@@ -281,11 +321,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
281
321
  - !ruby/object:Gem::Version
282
322
  version: '0'
283
323
  requirements: []
284
- rubyforge_project:
285
- rubygems_version: 2.4.5.1
286
- signing_key:
324
+ rubygems_version: 3.2.15
325
+ signing_key:
287
326
  specification_version: 4
288
- summary: A warm place to store precious development references
327
+ summary: A warm place to store your development references
289
328
  test_files:
290
329
  - test/ruby_pocket/cli/options_test.rb
291
330
  - test/ruby_pocket/favorite_creator_test.rb
Binary file