ruby_pocket 0.1.3 → 0.1.4

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 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