fundler 0.2.5 → 0.2.6
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/lib/fundler/bookmarks_reader.rb +144 -37
- data/lib/fundler/version.rb +1 -1
- data/spec/fundler_bookmarks_spec.rb +22 -28
- data/spec/fundler_spec.rb +48 -62
- data/spec/fundler_spec_helper.rb +20 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9e5cc9979b9b7356a8341a8bd13674dece28c55
|
4
|
+
data.tar.gz: 0251f3debe730d261e4f47dcf035e3f2f8be4129
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9f874b856944b3f6d20a16a0d91abc0e49cfec0363f941b5e4cf135c96f9dbb16acde8e693ce403e45c9e05fb2c96544f22d0983b493207e151b1f2d69c5b79
|
7
|
+
data.tar.gz: cbbf396c02cc8b21d71ebd26914dcc63e5c6805e60fe3c021a22663428ad478508081efbcda8ebdaca549a6e41d579fb772eaee0ab143b63094bc28a18f9c2d2
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
module BookmarksReader
|
2
|
+
require 'sqlite3'
|
4
3
|
|
5
4
|
=begin rdoc
|
6
5
|
|
@@ -31,51 +30,134 @@ where moz_historyvisits.place_id = moz_places.id
|
|
31
30
|
order by moz_historyvisits.visit_date desc;
|
32
31
|
=end
|
33
32
|
|
33
|
+
module BookmarksReader
|
34
|
+
|
35
|
+
attr_reader :db
|
36
|
+
|
34
37
|
MOZILLA_FIREFOX_CONF_DIR = File.expand_path('~') + '/.mozilla/firefox/'
|
35
|
-
|
38
|
+
|
39
|
+
# all bookmarks
|
36
40
|
BOOKMARKS_QUERY = <<-SQL
|
37
|
-
SELECT DISTINCT
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
AND moz_bookmarks.parent = moz_bookmarks_roots.folder_id
|
41
|
+
SELECT DISTINCT
|
42
|
+
moz_places.url AS url,
|
43
|
+
moz_bookmarks.title AS title,
|
44
|
+
moz_items_annos.content AS description
|
45
|
+
FROM
|
46
|
+
moz_places,
|
47
|
+
moz_bookmarks,
|
48
|
+
moz_items_annos,
|
49
|
+
moz_anno_attributes
|
50
|
+
WHERE
|
51
|
+
moz_anno_attributes.name = 'bookmarkProperties/description' AND
|
52
|
+
moz_items_annos.anno_attribute_id = moz_anno_attributes.id AND
|
53
|
+
moz_items_annos.item_id = moz_bookmarks.id AND
|
54
|
+
moz_places.id = moz_bookmarks.fk AND
|
55
|
+
moz_places.id IN (
|
56
|
+
SELECT DISTINCT fk
|
57
|
+
FROM moz_bookmarks
|
58
|
+
WHERE parent IN (
|
59
|
+
SELECT moz_bookmarks.id
|
60
|
+
FROM moz_bookmarks, moz_bookmarks_roots
|
61
|
+
WHERE moz_bookmarks_roots.root_name = 'tags'
|
62
|
+
AND moz_bookmarks.parent = moz_bookmarks_roots.folder_id
|
63
|
+
)
|
61
64
|
)
|
62
|
-
|
63
|
-
|
64
|
-
ORDER BY UPPER(moz_bookmarks.title) ASC
|
65
|
+
ORDER BY UPPER(moz_bookmarks.title) ASC
|
65
66
|
SQL
|
66
67
|
|
68
|
+
# tag.id|tag.title
|
69
|
+
QUERY_FOR_TAGS = <<-SQL
|
70
|
+
SELECT id, title FROM moz_bookmarks WHERE parent = 4;
|
71
|
+
SQL
|
72
|
+
|
73
|
+
# all bookmarks with the "given" tag.id
|
74
|
+
QUERY_BY_TAG = <<-SQL
|
75
|
+
SELECT moz_places.id, moz_places.url, moz_places.title, moz_bookmarks.parent
|
76
|
+
FROM moz_places
|
77
|
+
LEFT OUTER JOIN moz_bookmarks
|
78
|
+
ON moz_places.id = moz_bookmarks.fk
|
79
|
+
WHERE moz_bookmarks.parent = @tag_id;
|
80
|
+
SQL
|
81
|
+
|
82
|
+
# bookmark.id|bookmark.fk|bookmark.title
|
83
|
+
# ...
|
84
|
+
#=> 1933|1387|SQLite Home Page
|
85
|
+
# ...
|
86
|
+
QUERY_FOR_SIMPLE_BOOKMARKS = <<-SQL
|
87
|
+
SELECT id,fk,title FROM moz_bookmarks WHERE parent = 2;
|
88
|
+
SQL
|
89
|
+
|
90
|
+
# select the link between bookmars and tags
|
91
|
+
# fk_id = 1387
|
92
|
+
#=> 1934|1387|1144
|
93
|
+
QUERY_FOR_LINK = <<-SQL
|
94
|
+
SELECT id,fk,parent FROM moz_bookmarks WHERE title is null AND fk = @fk_id;
|
95
|
+
SQL
|
96
|
+
|
97
|
+
# tag.id|tag.title
|
98
|
+
# parent = 1144
|
99
|
+
#=> 1144|coding
|
100
|
+
QUERY_FOR_TAG_BY_ID = <<-SQL
|
101
|
+
SELECT id, title FROM moz_bookmarks WHERE parent = 4 AND id = @parent;
|
102
|
+
SQL
|
103
|
+
|
104
|
+
def find_bookmarks_by_tag(tag_id)
|
105
|
+
query = QUERY_BY_TAG
|
106
|
+
query.gsub(/@tag_id/,tag_id)
|
107
|
+
db.execute(query) do |row|
|
108
|
+
(result ||= []) << row
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def get_tags
|
113
|
+
tags = {}
|
114
|
+
db.execute(QUERY_FOR_TAGS).each do |row|
|
115
|
+
tag = row.split('|')
|
116
|
+
tags[tag[0]] = tag[1]
|
117
|
+
end
|
118
|
+
tags
|
119
|
+
end
|
120
|
+
|
121
|
+
def get_tag_by_id(id)
|
122
|
+
query = QUERY_FOR_TAG_BY_ID
|
123
|
+
query.gsub(/@tag_id/,id)
|
124
|
+
db.get_first_row(query)
|
125
|
+
end
|
126
|
+
|
127
|
+
def get_bookmarks_with_tags
|
128
|
+
bookmarks = []
|
129
|
+
result = {}
|
130
|
+
db.execute(QUERY_FOR_SIMPLE_BOOKMARKS) do |bookmark|
|
131
|
+
bookmarks << bookmark
|
132
|
+
end
|
133
|
+
bookmarks.each do |bookmark|
|
134
|
+
bookmark_id, bookmark_fk, bookmark_title = bookmark
|
135
|
+
if bookmark_fk
|
136
|
+
link_query = QUERY_FOR_LINK.sub(/@fk_id/, bookmark_fk.to_s)
|
137
|
+
links = db.execute(link_query)
|
138
|
+
links.each do |link|
|
139
|
+
link_id, link_fk, link_parent = link
|
140
|
+
tag_query = QUERY_FOR_TAG_BY_ID.gsub(/@parent/, link_parent.to_s)
|
141
|
+
db.execute(tag_query) do |tag|
|
142
|
+
tag_id, tag_title = tag
|
143
|
+
result[bookmark_id] = "[#{tag_title}] #{bookmark_title}"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
result
|
149
|
+
end
|
150
|
+
|
67
151
|
# +drop_bookmarks+ browse the home directory of the current user,
|
68
152
|
# locate the +places.sqlite+ db_file generated by Firefox and
|
69
153
|
# retrieve all the bookmarks stored.
|
70
|
-
def drop_bookmarks(format = :
|
71
|
-
require 'sqlite3'
|
154
|
+
def drop_bookmarks(format = :txt)
|
72
155
|
output = []
|
73
|
-
if
|
74
|
-
db = SQLite3::Database.new(locate_places)
|
156
|
+
if db
|
75
157
|
rows = db.execute(BOOKMARKS_QUERY)
|
76
158
|
rows.each_with_index do |row, index|
|
77
159
|
case format
|
78
|
-
when :
|
160
|
+
when :txt
|
79
161
|
output << "#{index}: #{row.join(' | ')}"
|
80
162
|
output << '---'
|
81
163
|
when :html
|
@@ -84,10 +166,12 @@ ORDER BY UPPER(moz_bookmarks.title) ASC
|
|
84
166
|
puts "TODO"
|
85
167
|
when :json
|
86
168
|
puts "TODO"
|
169
|
+
else
|
170
|
+
# exit 1
|
87
171
|
end
|
88
172
|
end
|
89
173
|
end
|
90
|
-
File.open(
|
174
|
+
File.open("./bookmarks_dump.#{format.to_s}", 'w') do |file|
|
91
175
|
file.puts output
|
92
176
|
end
|
93
177
|
end
|
@@ -104,9 +188,32 @@ ORDER BY UPPER(moz_bookmarks.title) ASC
|
|
104
188
|
end
|
105
189
|
end
|
106
190
|
|
191
|
+
def db
|
192
|
+
@db ||= SQLite3::Database.new(locate_places) if locate_places
|
193
|
+
end
|
194
|
+
|
107
195
|
def dump_places
|
108
196
|
FileUtils.cp(locate_places, pwd)
|
109
197
|
end
|
110
|
-
|
198
|
+
|
111
199
|
end # BookmarksReader
|
112
200
|
|
201
|
+
__END__
|
202
|
+
|
203
|
+
select id,fk,title,parent from moz_bookmarks;
|
204
|
+
...
|
205
|
+
1983|2509|The Places database | MDN|2
|
206
|
+
1984|2509||1144
|
207
|
+
1933|1387|SQLite Home Page|2
|
208
|
+
1934|1387||1144
|
209
|
+
...
|
210
|
+
|
211
|
+
select id,fk,title from moz_bookmarks where parent = 2;
|
212
|
+
=> 1933|1387|SQLite Home Page
|
213
|
+
|
214
|
+
select id,fk,parent from moz_bookmarks where title is null and fk = 1387;
|
215
|
+
1934|1387|1144
|
216
|
+
|
217
|
+
select title from moz_bookmarks where parent = 4 AND id = 1144;
|
218
|
+
=> coding
|
219
|
+
|
data/lib/fundler/version.rb
CHANGED
@@ -1,34 +1,28 @@
|
|
1
|
-
require '
|
2
|
-
require 'fundler/fundler_utils'
|
3
|
-
|
4
|
-
RSpec.configure do |config|
|
5
|
-
config.filter_run_excluding ruby: ->(v) { !RUBY_VERSION.start_with?(v.to_s) }
|
6
|
-
config.color_enabled = true
|
7
|
-
config.formatter = 'documentation'
|
8
|
-
# https://github.com/rspec/rspec-expectations
|
9
|
-
config.expect_with :rspec do |c|
|
10
|
-
c.syntax = :expect # disables `should`
|
11
|
-
end
|
12
|
-
|
13
|
-
config.include(ExitCodeMatchers)
|
14
|
-
end
|
1
|
+
require 'fundler_spec_helper'
|
15
2
|
|
16
3
|
class TestBookmarksFundler
|
17
4
|
describe Fundler do
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
5
|
+
context 'bookmarks functions' do
|
6
|
+
let(:fundler) { Fundler.new }
|
7
|
+
before(:each) do
|
8
|
+
FileUtils::mkdir 'test'
|
9
|
+
end
|
22
10
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
11
|
+
after(:each) do
|
12
|
+
FileUtils::rm_rf 'test'
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'finds bookmarks file' do
|
16
|
+
FileUtils::cd './test' do
|
17
|
+
fundler.drop_bookmarks_file(:txt)
|
18
|
+
expect(fundler.all_files).to include('bookmarks_dump.txt')
|
19
|
+
end
|
31
20
|
end
|
32
|
-
|
33
|
-
|
21
|
+
|
22
|
+
it 'get_bookmarks_with_tags' do
|
23
|
+
expect { fundler.get_bookmarks_with_tags }.to_not raise_error
|
24
|
+
end
|
25
|
+
|
26
|
+
end # context
|
27
|
+
end # describe
|
34
28
|
end # TestBookmarksFundler
|
data/spec/fundler_spec.rb
CHANGED
@@ -1,70 +1,56 @@
|
|
1
|
-
|
2
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
-
|
4
|
-
require 'fundler'
|
5
|
-
require 'fundler/fundler_utils'
|
6
|
-
|
7
|
-
RSpec.configure do |config|
|
8
|
-
config.filter_run_excluding ruby: ->(v) { !RUBY_VERSION.start_with?(v.to_s) }
|
9
|
-
config.color_enabled = true
|
10
|
-
config.formatter = 'documentation'
|
11
|
-
# https://github.com/rspec/rspec-expectations
|
12
|
-
config.expect_with :rspec do |c|
|
13
|
-
c.syntax = :expect # disables `should`
|
14
|
-
end
|
15
|
-
|
16
|
-
config.include(ExitCodeMatchers)
|
17
|
-
end
|
1
|
+
require 'fundler_spec_helper'
|
18
2
|
|
19
3
|
class TestFundler
|
20
4
|
describe Fundler do
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
5
|
+
context 'file utils' do
|
6
|
+
let(:finder) { Fundler.new }
|
7
|
+
before(:each) do
|
8
|
+
FileUtils::mkdir 'test'
|
9
|
+
File.open('test/example', 'w') do |f|
|
10
|
+
f.puts '#!/usr/bin/env ruby'
|
11
|
+
f.puts '# encoding: utf-8'
|
12
|
+
f.puts 'x = 0'
|
13
|
+
f.puts 'puts x'
|
14
|
+
end
|
15
|
+
File.open('test/example_rb.rb', 'w') do |f|
|
16
|
+
f.puts 'x = :foo'
|
17
|
+
f.puts 'puts x'
|
18
|
+
end
|
19
|
+
File.open('test/list.txt', 'w') do |f|
|
20
|
+
f.puts 'grocery list'
|
21
|
+
f.puts '- chunky bacon'
|
22
|
+
end
|
23
|
+
File.open('test/SpAcE cAmEl.txt', 'w') do |f|
|
24
|
+
f.puts 'foo!'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
after(:each) do
|
28
|
+
FileUtils::rm_rf 'test'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'finds all files' do
|
32
|
+
FileUtils::cd './test' do
|
33
|
+
expect(finder.all_files()).to eq(['example', 'example_rb.rb', 'list.txt', 'SpAcE cAmEl.txt'].sort)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
it 'finds a file with no .rb extension but has a shebang line' do
|
37
|
+
FileUtils::cd './test' do
|
38
|
+
expect(finder.ruby_files()).to eq(['example', 'example_rb.rb'])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
it 'clean all filenames' do
|
42
|
+
FileUtils::cd './test' do
|
43
|
+
expect(finder.clean_all_filenames()).to eq(4)
|
44
|
+
expect(finder.all_files()).to eq(['example', 'example_rb.rb', 'list.txt', 'space_camel.txt'].sort)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
it 'show the pwd (last dir in this spec)' do
|
48
|
+
FileUtils::cd './test' do
|
49
|
+
expect(finder.get_pwd.split('/').last).to eq('test')
|
50
|
+
end
|
65
51
|
end
|
66
|
-
end
|
67
52
|
|
53
|
+
end # context
|
68
54
|
end # describe
|
69
55
|
|
70
56
|
end #TestFundler
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# fundler_spec_helper.rb
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
4
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
5
|
+
|
6
|
+
require 'fundler'
|
7
|
+
require 'fundler/fundler_utils'
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.filter_run_excluding ruby: ->(v) { !RUBY_VERSION.start_with?(v.to_s) }
|
11
|
+
config.color_enabled = true
|
12
|
+
config.formatter = 'documentation'
|
13
|
+
|
14
|
+
# https://github.com/rspec/rspec-expectations
|
15
|
+
config.expect_with :rspec do |c|
|
16
|
+
c.syntax = :expect # disables `should`
|
17
|
+
end
|
18
|
+
|
19
|
+
config.include(ExitCodeMatchers)
|
20
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fundler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zeroed
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sqlite3
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- lib/fundler/version.rb
|
89
89
|
- spec/fundler_bookmarks_spec.rb
|
90
90
|
- spec/fundler_spec.rb
|
91
|
+
- spec/fundler_spec_helper.rb
|
91
92
|
homepage: https://github.com/zeroed/fundler
|
92
93
|
licenses:
|
93
94
|
- GPL3
|
@@ -115,4 +116,5 @@ summary: find rename utility
|
|
115
116
|
test_files:
|
116
117
|
- spec/fundler_bookmarks_spec.rb
|
117
118
|
- spec/fundler_spec.rb
|
119
|
+
- spec/fundler_spec_helper.rb
|
118
120
|
has_rdoc:
|