fundler 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -2
- data/lib/fundler/bookmarks_reader.rb +90 -0
- data/lib/fundler/find_and_clean.rb +0 -62
- data/lib/fundler/fundler_utils.rb +22 -0
- data/lib/fundler/version.rb +1 -1
- data/lib/fundler.rb +5 -1
- metadata +3 -4
- data/spec/fundler_spec.rb~ +0 -70
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfbaef5181cc209495603196eb1bb6970cf630b8
|
4
|
+
data.tar.gz: 15497ddc1d211b92cdffc27ea2c710c943c32db3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: daf98e3b3b63085f0b322eed6fbc1ea3ef5aacfa8c09cc654d2849fb8ef1f63958fc01337b729964e5cd379b481e9f2014931d000171632b3e2b8d21aab1e97e
|
7
|
+
data.tar.gz: 76d0b5f55c5b51a6347ed61aeacff401727de1903550c3ac4f2780b3048ed944d02861ae61b9f82f4b6225d59142e5548ce1af8750e9a7a3336d861df137559d
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ TODO: Write a gem description
|
|
6
6
|
|
7
7
|
Add this line to your application's Gemfile:
|
8
8
|
|
9
|
-
gem '
|
9
|
+
gem 'fundler'
|
10
10
|
|
11
11
|
And then execute:
|
12
12
|
|
@@ -14,12 +14,21 @@ And then execute:
|
|
14
14
|
|
15
15
|
Or install it yourself as:
|
16
16
|
|
17
|
-
$ gem install
|
17
|
+
$ gem install fundler
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
21
|
TODO: Write usage instructions here
|
22
22
|
|
23
|
+
```
|
24
|
+
|
25
|
+
$ fundler -h
|
26
|
+
$ fundler -c
|
27
|
+
$ fundler -b
|
28
|
+
|
29
|
+
|
30
|
+
```
|
31
|
+
|
23
32
|
## Contributing
|
24
33
|
|
25
34
|
1. Fork it
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module BookmarksReader
|
4
|
+
|
5
|
+
=begin rdoc
|
6
|
+
|
7
|
+
== Schema
|
8
|
+
http://people.mozilla.org/~dietrich/places-erd.png
|
9
|
+
|
10
|
+
== References
|
11
|
+
http://stackoverflow.com/questions/464516/firefox-bookmarks-sqlite-structure
|
12
|
+
https://developer.mozilla.org/en-US/docs/Places
|
13
|
+
https://developer.mozilla.org/en-US/docs/Retrieving_part_of_the_bookmarks_tree
|
14
|
+
https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsINavBookmarksService
|
15
|
+
http://davidkoepi.wordpress.com/2010/11/27/firefoxforensics/
|
16
|
+
|
17
|
+
== Queries
|
18
|
+
sqlite> select moz_places.url, moz_bookmarks.title from moz_places,moz_bookmarks where moz_places.id = moz_bookmarks.fk and moz_bookmarks.title != '';
|
19
|
+
sqlite> select keyword,url from moz_keywords left join moz_bookmarks on (moz_keywords.id = keyword_id) left join moz_places on (fk = moz_places.id);
|
20
|
+
sqlite> select moz_places.url, datetime((moz_historyvisits.visit_date/1000000), ‘unixepoch’, ‘localtime’), moz_historyvisits.visit_type from moz_places, moz_historyvisits where moz_historyvisits.place_id = moz_places.id order by moz_historyvisits.visit_date desc;
|
21
|
+
=end
|
22
|
+
|
23
|
+
MOZILLA_FIREFOX_CONF_DIR = File.expand_path('~') + '/.mozilla/firefox/'
|
24
|
+
# BOOKMARKS_QUERY = %q{select moz_places.url, moz_bookmarks.title from moz_places, moz_bookmarks where moz_places.id = moz_bookmarks.fk and moz_bookmarks.title != '';}
|
25
|
+
BOOKMARKS_QUERY = <<-SQL
|
26
|
+
SELECT DISTINCT
|
27
|
+
moz_places.url AS url,
|
28
|
+
moz_bookmarks.title AS title,
|
29
|
+
moz_items_annos.content AS description
|
30
|
+
|
31
|
+
FROM
|
32
|
+
moz_places,
|
33
|
+
moz_bookmarks,
|
34
|
+
moz_items_annos,
|
35
|
+
moz_anno_attributes
|
36
|
+
|
37
|
+
WHERE
|
38
|
+
moz_anno_attributes.name = 'bookmarkProperties/description'
|
39
|
+
AND moz_items_annos.anno_attribute_id = moz_anno_attributes.id
|
40
|
+
AND moz_items_annos.item_id = moz_bookmarks.id
|
41
|
+
AND moz_places.id = moz_bookmarks.fk
|
42
|
+
AND moz_places.id IN (
|
43
|
+
SELECT DISTINCT fk FROM moz_bookmarks
|
44
|
+
WHERE parent IN (
|
45
|
+
SELECT moz_bookmarks.id
|
46
|
+
FROM moz_bookmarks, moz_bookmarks_roots
|
47
|
+
WHERE moz_bookmarks_roots.root_name = 'tags'
|
48
|
+
AND moz_bookmarks.parent = moz_bookmarks_roots.folder_id
|
49
|
+
)
|
50
|
+
)
|
51
|
+
|
52
|
+
ORDER BY UPPER(moz_bookmarks.title) ASC
|
53
|
+
SQL
|
54
|
+
|
55
|
+
# +drop_bookmarks+ browse the home directory of the current user,
|
56
|
+
# locate the +places.sqlite+ db_file generated by Firefox and
|
57
|
+
# retrieve all the bookmarks stored.
|
58
|
+
def drop_bookmarks(format = :plain)
|
59
|
+
require 'sqlite3'
|
60
|
+
db = SQLite3::Database.new(locate_places)
|
61
|
+
db.execute(BOOKMARKS_QUERY) do |row|
|
62
|
+
case format
|
63
|
+
when :plain
|
64
|
+
puts row
|
65
|
+
puts '---'
|
66
|
+
when :html
|
67
|
+
puts "TODO"
|
68
|
+
when :markdown
|
69
|
+
puts "TODO"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def locate_places
|
75
|
+
begin
|
76
|
+
dot_firefox = Dir.open(MOZILLA_FIREFOX_CONF_DIR)
|
77
|
+
profile_dir = dot_firefox.select {|dir| dir =~ /.*default/}
|
78
|
+
db_file = MOZILLA_FIREFOX_CONF_DIR + profile_dir.join + '/places.sqlite'
|
79
|
+
rescue Errno::ENOENT
|
80
|
+
puts "no db_bookmarks found"
|
81
|
+
exit 1
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def dump_places
|
86
|
+
FileUtils.cp(locate_places, pwd)
|
87
|
+
end
|
88
|
+
|
89
|
+
end # BookmarksReader
|
90
|
+
|
@@ -52,68 +52,6 @@ module FindAndClean
|
|
52
52
|
end
|
53
53
|
puts out
|
54
54
|
end
|
55
|
-
|
56
|
-
=begin rdoc
|
57
|
-
|
58
|
-
== Schema
|
59
|
-
http://people.mozilla.org/~dietrich/places-erd.png
|
60
|
-
|
61
|
-
== References
|
62
|
-
http://stackoverflow.com/questions/464516/firefox-bookmarks-sqlite-structure
|
63
|
-
https://developer.mozilla.org/en-US/docs/Places
|
64
|
-
https://developer.mozilla.org/en-US/docs/Retrieving_part_of_the_bookmarks_tree
|
65
|
-
https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsINavBookmarksService
|
66
|
-
http://davidkoepi.wordpress.com/2010/11/27/firefoxforensics/
|
67
|
-
|
68
|
-
== Queries
|
69
|
-
sqlite> select moz_places.url, moz_bookmarks.title from moz_places,moz_bookmarks where moz_places.id = moz_bookmarks.fk and moz_bookmarks.title != '';
|
70
|
-
sqlite> select keyword,url from moz_keywords left join moz_bookmarks on (moz_keywords.id = keyword_id) left join moz_places on (fk = moz_places.id);
|
71
|
-
sqlite> select moz_places.url, datetime((moz_historyvisits.visit_date/1000000), ‘unixepoch’, ‘localtime’), moz_historyvisits.visit_type from moz_places, moz_historyvisits where moz_historyvisits.place_id = moz_places.id order by moz_historyvisits.visit_date desc;
|
72
|
-
=end
|
73
|
-
|
74
|
-
MOZILLA_FIREFOX_CONF_DIR = File.expand_path('~') + '/.mozilla/firefox/'
|
75
|
-
# BOOKMARKS_QUERY = %q{select moz_places.url, moz_bookmarks.title from moz_places, moz_bookmarks where moz_places.id = moz_bookmarks.fk and moz_bookmarks.title != '';}
|
76
|
-
BOOKMARKS_QUERY = <<-SQL
|
77
|
-
SELECT DISTINCT
|
78
|
-
moz_places.url AS url,
|
79
|
-
moz_bookmarks.title AS title,
|
80
|
-
moz_items_annos.content AS description
|
81
|
-
|
82
|
-
FROM
|
83
|
-
moz_places,
|
84
|
-
moz_bookmarks,
|
85
|
-
moz_items_annos,
|
86
|
-
moz_anno_attributes
|
87
|
-
|
88
|
-
WHERE
|
89
|
-
moz_anno_attributes.name = 'bookmarkProperties/description'
|
90
|
-
AND moz_items_annos.anno_attribute_id = moz_anno_attributes.id
|
91
|
-
AND moz_items_annos.item_id = moz_bookmarks.id
|
92
|
-
AND moz_places.id = moz_bookmarks.fk
|
93
|
-
AND moz_places.id IN (
|
94
|
-
SELECT DISTINCT fk FROM moz_bookmarks
|
95
|
-
WHERE parent IN (
|
96
|
-
SELECT moz_bookmarks.id
|
97
|
-
FROM moz_bookmarks, moz_bookmarks_roots
|
98
|
-
WHERE moz_bookmarks_roots.root_name = 'tags'
|
99
|
-
AND moz_bookmarks.parent = moz_bookmarks_roots.folder_id
|
100
|
-
)
|
101
|
-
)
|
102
|
-
|
103
|
-
ORDER BY UPPER(moz_bookmarks.title) ASC
|
104
|
-
SQL
|
105
|
-
def drop_bookmarks
|
106
|
-
dot_firefox = Dir.open(MOZILLA_FIREFOX_CONF_DIR)
|
107
|
-
profile_dir = dot_firefox.select {|dir| dir =~ /.*default/}
|
108
|
-
db_file = MOZILLA_FIREFOX_CONF_DIR + profile_dir.join + '/places.sqlite'
|
109
|
-
require 'sqlite3'
|
110
|
-
db = SQLite3::Database.new(db_file)
|
111
|
-
db.execute(BOOKMARKS_QUERY) do |row|
|
112
|
-
puts row
|
113
|
-
puts '---'
|
114
|
-
end
|
115
|
-
FileUtils.cp(db_file, pwd)
|
116
|
-
end
|
117
55
|
|
118
56
|
end #FindAndClean
|
119
57
|
|
@@ -3,6 +3,28 @@
|
|
3
3
|
require 'fileutils'
|
4
4
|
require 'rspec'
|
5
5
|
|
6
|
+
class String
|
7
|
+
|
8
|
+
def squish
|
9
|
+
dup.squish!
|
10
|
+
end
|
11
|
+
|
12
|
+
def squish!
|
13
|
+
strip!
|
14
|
+
gsub!(/\s+/, ' ')
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
module FundlerUtils
|
21
|
+
|
22
|
+
def self.included(base)
|
23
|
+
# ...
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
6
28
|
module ExitCodeMatchers
|
7
29
|
RSpec::Matchers.define :exit_with_code do |code|
|
8
30
|
actual = nil
|
data/lib/fundler/version.rb
CHANGED
data/lib/fundler.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
require 'fundler/find_and_clean'
|
2
|
-
require '
|
2
|
+
require 'fundler/bookmarks_reader'
|
3
|
+
require 'fundler/fundler_utils'
|
4
|
+
require 'fundler/version'
|
3
5
|
|
4
6
|
class Fundler
|
5
7
|
include FindAndClean
|
8
|
+
include BookmarksReader
|
9
|
+
include FundlerUtils
|
6
10
|
def clean
|
7
11
|
clean_all_filenames
|
8
12
|
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.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zeroed
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -54,12 +54,12 @@ files:
|
|
54
54
|
- bin/fundler
|
55
55
|
- fundler.gemspec
|
56
56
|
- lib/fundler.rb
|
57
|
+
- lib/fundler/bookmarks_reader.rb
|
57
58
|
- lib/fundler/find_and_clean.rb
|
58
59
|
- lib/fundler/fundler_utils.rb
|
59
60
|
- lib/fundler/version.rb
|
60
61
|
- places.sqlite
|
61
62
|
- spec/fundler_spec.rb
|
62
|
-
- spec/fundler_spec.rb~
|
63
63
|
homepage: https://github.com/zeroed/fundler
|
64
64
|
licenses:
|
65
65
|
- GPL3
|
@@ -86,5 +86,4 @@ specification_version: 4
|
|
86
86
|
summary: find rename utility
|
87
87
|
test_files:
|
88
88
|
- spec/fundler_spec.rb
|
89
|
-
- spec/fundler_spec.rb~
|
90
89
|
has_rdoc:
|
data/spec/fundler_spec.rb~
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
-
|
4
|
-
require 'fundler'
|
5
|
-
require 'fundler/findler_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
|
18
|
-
|
19
|
-
class TestFundler
|
20
|
-
describe Fundler do
|
21
|
-
let(:finder) { Fundler.new }
|
22
|
-
before(:each) do
|
23
|
-
FileUtils::mkdir 'test'
|
24
|
-
File.open('test/example', 'w') do |f|
|
25
|
-
f.puts '#!/usr/bin/env ruby'
|
26
|
-
f.puts '# encoding: utf-8'
|
27
|
-
f.puts 'x = 0'
|
28
|
-
f.puts 'puts x'
|
29
|
-
end
|
30
|
-
File.open('test/example_rb.rb', 'w') do |f|
|
31
|
-
f.puts 'x = :foo'
|
32
|
-
f.puts 'puts x'
|
33
|
-
end
|
34
|
-
File.open('test/list.txt', 'w') do |f|
|
35
|
-
f.puts 'grocery list'
|
36
|
-
f.puts '- chunky bacon'
|
37
|
-
end
|
38
|
-
File.open('test/SpAcE cAmEl.txt', 'w') do |f|
|
39
|
-
f.puts 'foo!'
|
40
|
-
end
|
41
|
-
end
|
42
|
-
after(:each) do
|
43
|
-
FileUtils::rm_rf 'test'
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'finds all files' do
|
47
|
-
FileUtils::cd './test' do
|
48
|
-
expect(finder.all_files()).to eq(['example', 'example_rb.rb', 'list.txt', 'SpAcE cAmEl.txt'].sort)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
it 'finds a file with no .rb extension but has a shebang line' do
|
52
|
-
FileUtils::cd './test' do
|
53
|
-
expect(finder.ruby_files()).to eq(['example', 'example_rb.rb'])
|
54
|
-
end
|
55
|
-
end
|
56
|
-
it 'clean all filenames' do
|
57
|
-
FileUtils::cd './test' do
|
58
|
-
expect(finder.clean_all_filenames()).to eq(4)
|
59
|
-
expect(finder.all_files()).to eq(['example', 'example_rb.rb', 'list.txt', 'space_camel.txt'].sort)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
it 'show the pwd (last dir in this spec)' do
|
63
|
-
FileUtils::cd './test' do
|
64
|
-
expect(finder.get_pwd.split('/').last).to eq('test')
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end # describe
|
69
|
-
|
70
|
-
end #TestFundler
|