runoff 1.0.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +29 -15
- data/README.md +9 -3
- data/bin/runoff +26 -53
- data/lib/runoff/adapters/adapter.rb +31 -0
- data/lib/runoff/adapters/json_adapter.rb +88 -0
- data/lib/runoff/adapters/txt_adapter.rb +69 -0
- data/lib/runoff/chat.rb +38 -0
- data/lib/runoff/commandline/all.rb +53 -0
- data/lib/runoff/commandline/command.rb +34 -0
- data/lib/runoff/commandline/none.rb +45 -0
- data/lib/runoff/commandline/some.rb +84 -0
- data/lib/runoff/file_writer.rb +37 -58
- data/lib/runoff/location.rb +23 -20
- data/lib/runoff/version.rb +1 -1
- data/lib/runoff.rb +12 -4
- data/runoff.gemspec +0 -1
- data/test/command_all_test.rb +90 -0
- data/test/command_some_test.rb +49 -0
- data/test/data/custom_location/test_main.db +0 -0
- data/test/data/test_main.db +0 -0
- data/test/location_test.rb +78 -0
- metadata +21 -25
- data/lib/runoff/commands/all.rb +0 -22
- data/lib/runoff/commands/command.rb +0 -19
- data/lib/runoff/commands/some.rb +0 -38
- data/lib/runoff/skype_data_format.rb +0 -128
- data/test/skype_data_format_test.rb +0 -58
- data/test/test_db.sqlite +0 -0
data/lib/runoff/file_writer.rb
CHANGED
@@ -2,83 +2,62 @@ require 'zip'
|
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
4
|
module Runoff
|
5
|
+
# Public: Writes data received from the database to text files.
|
5
6
|
class FileWriter
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
@
|
7
|
+
# Public: Initializes a FileWriter object.
|
8
|
+
#
|
9
|
+
# options - A Hash with commandline options.
|
10
|
+
def initialize(options)
|
11
|
+
@export_path = Location.get_export_path options
|
12
|
+
@adapter = Object.const_get("Runoff::Adapters::#{options[:adapter]}").new
|
13
|
+
@current_file_name = nil
|
14
|
+
@buffer = []
|
11
15
|
end
|
12
16
|
|
13
|
-
# Public:
|
17
|
+
# Public: Writes a single row of data to a text file.
|
18
|
+
#
|
19
|
+
# messages - An Array of data received from the database.
|
14
20
|
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
|
18
|
-
|
21
|
+
# Examples
|
22
|
+
#
|
23
|
+
# write [{ chatname: "#first_user/$second_user;d3d86c6b0e3b8320" ... }, ...]
|
24
|
+
def write(messages)
|
25
|
+
messages.each_with_index do |m, i|
|
26
|
+
file_name = @adapter.get_file_name m[Runoff::COLUMNS[1]]
|
19
27
|
|
20
|
-
|
21
|
-
dataset = @db_handler[schema[:table]]
|
22
|
-
dataset = dataset.select(*schema[:columns])
|
28
|
+
dump unless @current_file_name.nil? || @current_file_name == file_name
|
23
29
|
|
24
|
-
|
25
|
-
write data_format.build_entry(row)
|
26
|
-
end
|
30
|
+
@current_file_name = file_name
|
27
31
|
|
28
|
-
|
32
|
+
@buffer << @adapter.build_entry(m)
|
33
|
+
dump if i == (messages.count - 1)
|
34
|
+
end
|
29
35
|
end
|
30
36
|
|
31
|
-
# Public:
|
32
|
-
|
33
|
-
|
34
|
-
# export_path - a string that points to the directory where exported files must be saved.
|
35
|
-
def export_database_partially(data_format, export_path, create_archive, &block)
|
36
|
-
@export_path = export_path
|
37
|
-
|
38
|
-
schema = data_format.get_schema
|
39
|
-
dataset = @db_handler[schema[:table]]
|
40
|
-
indices = block.call self, dataset
|
41
|
-
clean_indices = indices.split(',').map { |e| e.strip }
|
42
|
-
|
43
|
-
clean_indices.each do |i|
|
44
|
-
chatname = @selected_entries[i.to_i]
|
45
|
-
approximation = data_format.denormalize chatname
|
46
|
-
dataset = @db_handler[schema[:table]]
|
47
|
-
dataset = dataset.where(Sequel.like(:chatname, "#{approximation}%"))
|
37
|
+
# Public: Saves all the exported files in a Zip archive.
|
38
|
+
def archive
|
39
|
+
archive_name = "#{@export_path}_#{Time.now.to_i}.zip"
|
48
40
|
|
49
|
-
|
41
|
+
Zip::File.open archive_name, Zip::File::CREATE do |archive|
|
42
|
+
Dir[File.join(@export_path, '**', '**')].each do |file|
|
43
|
+
archive.add File.basename(file), file
|
44
|
+
end
|
50
45
|
end
|
51
46
|
|
52
|
-
|
47
|
+
FileUtils.rm_rf @export_path # Delete the folder.
|
53
48
|
end
|
54
49
|
|
55
50
|
private
|
56
51
|
|
57
|
-
# Internal:
|
58
|
-
|
59
|
-
|
60
|
-
#
|
61
|
-
# Examples
|
62
|
-
#
|
63
|
-
# write { filename: "test.txt", content: "test content" }
|
64
|
-
def write(entry)
|
65
|
-
path = "#@export_path/#{entry[:filename]}"
|
66
|
-
|
67
|
-
File.open(path, "a+") { |file| file.write entry[:content] }
|
68
|
-
end
|
52
|
+
# Internal: Dumps the content buffer to a file.
|
53
|
+
def dump
|
54
|
+
content = @adapter.format_file_content @buffer
|
69
55
|
|
70
|
-
|
71
|
-
|
72
|
-
zip_file_name = "#@export_path-#{Time.now.strftime "%Y%m%d%H%S%S"}.zip"
|
73
|
-
|
74
|
-
Zip::File.open(zip_file_name, Zip::File::CREATE) do |zf|
|
75
|
-
Dir[File.join(@export_path, '**', '**')].each do |f|
|
76
|
-
zf.add(f.sub("#@export_path/", ''), f)
|
77
|
-
end
|
56
|
+
File.open("#{@export_path}/#@current_file_name", "w") do |file|
|
57
|
+
file.puts content
|
78
58
|
end
|
79
59
|
|
80
|
-
|
81
|
-
FileUtils.rm_r @export_path
|
60
|
+
@buffer.clear
|
82
61
|
end
|
83
62
|
end
|
84
63
|
end
|
data/lib/runoff/location.rb
CHANGED
@@ -5,13 +5,14 @@ module Runoff
|
|
5
5
|
#
|
6
6
|
# Examples
|
7
7
|
#
|
8
|
-
# Location
|
8
|
+
# Location.default_skype_data_location skype_username
|
9
9
|
# # => /home/user/.Skype/skype_username/main.db
|
10
10
|
class Location
|
11
|
-
# Public: Gets a path to the Skype
|
11
|
+
# Public: Gets a path to the Skype main.db file.
|
12
12
|
#
|
13
|
-
#
|
14
|
-
#
|
13
|
+
# args - An Array of commandline arguments, which might contain a String
|
14
|
+
# with the Skype username.
|
15
|
+
# options - A hash containing commandline options passed to the command.
|
15
16
|
# If the username is empty, then the hash must contain :from key.
|
16
17
|
#
|
17
18
|
# Examples
|
@@ -20,14 +21,16 @@ module Runoff
|
|
20
21
|
# # => Path to the default Skype database location depending on the operating system.
|
21
22
|
#
|
22
23
|
# get_database_path('', { from: '~/Desktop/main.db' })
|
23
|
-
# # => '
|
24
|
+
# # => '/Users/username/Desktop/main.db'
|
24
25
|
#
|
25
26
|
# Returns a String
|
26
|
-
def self.get_database_path(
|
27
|
-
if options.from
|
28
|
-
options
|
27
|
+
def self.get_database_path(args, options)
|
28
|
+
if options.key?(:from)
|
29
|
+
options[:from]
|
30
|
+
elsif args.count > 0
|
31
|
+
self.default_skype_data_location args[0]
|
29
32
|
else
|
30
|
-
|
33
|
+
raise ArgumentError, 'No username or database file path provided.'
|
31
34
|
end
|
32
35
|
end
|
33
36
|
|
@@ -40,12 +43,16 @@ module Runoff
|
|
40
43
|
#
|
41
44
|
# On Linux:
|
42
45
|
# default_skype_data_location skype_username
|
43
|
-
# # => /home/user/.Skype/skype_username/
|
46
|
+
# # => /home/user/.Skype/skype_username/main.db
|
44
47
|
#
|
45
48
|
# On Windows:
|
46
49
|
# default_skype_data_location skype_username
|
47
50
|
# # => /Users/user/AppData/Roaming/Skype/skype_username/main.db
|
48
51
|
#
|
52
|
+
# On Mac OS:
|
53
|
+
# default_skype_data_location skype_username
|
54
|
+
# # => /Users/user/Library/Application\ Support/Skype/skype_username/main.db
|
55
|
+
#
|
49
56
|
# Returns a String that contains the path to the Skype database file.
|
50
57
|
def self.default_skype_data_location(skype_username)
|
51
58
|
case RbConfig::CONFIG['host_os']
|
@@ -64,25 +71,21 @@ module Runoff
|
|
64
71
|
|
65
72
|
# Public: Composes a path where the exported files must be saved.
|
66
73
|
#
|
67
|
-
# options -
|
74
|
+
# options - A Hash with command line options passed to the runoff executable.
|
68
75
|
#
|
69
76
|
# Returns a string with a directory path.
|
70
77
|
def self.get_export_path(options)
|
71
|
-
path = options
|
78
|
+
path = options[:destination] || "#{ENV['HOME']}"
|
72
79
|
path = "#{path}/skype_chat_history"
|
73
80
|
|
74
|
-
unless File.exist?(path)
|
75
|
-
FileUtils::mkdir_p path
|
76
|
-
end
|
81
|
+
FileUtils::mkdir_p path unless File.exist?(path)
|
77
82
|
|
78
83
|
path
|
79
84
|
end
|
80
85
|
|
81
|
-
|
82
|
-
|
83
|
-
# Internal: Replaces backslashes with forward slashes and removes drive letter.
|
86
|
+
# Public: Replaces backslashes with forward slashes and removes drive letter.
|
84
87
|
#
|
85
|
-
# path - String containing a directory path.
|
88
|
+
# path - A String containing a directory path.
|
86
89
|
#
|
87
90
|
# Examples
|
88
91
|
#
|
@@ -95,7 +98,7 @@ module Runoff
|
|
95
98
|
path.gsub(/^[a-zA-Z]:/, '')
|
96
99
|
end
|
97
100
|
|
98
|
-
#
|
101
|
+
# Public: Composes the default Skype database location for the Windows 8 operating system.
|
99
102
|
#
|
100
103
|
# skype_username - A String that contains a username of the Skype account,
|
101
104
|
# which database we want to access.
|
data/lib/runoff/version.rb
CHANGED
data/lib/runoff.rb
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
require 'runoff/version'
|
2
2
|
require 'runoff/location'
|
3
|
-
require 'runoff/
|
3
|
+
require 'runoff/adapters/adapter'
|
4
|
+
require 'runoff/adapters/txt_adapter'
|
5
|
+
require 'runoff/adapters/json_adapter'
|
4
6
|
require 'runoff/file_writer'
|
5
|
-
require 'runoff/
|
6
|
-
|
7
|
-
|
7
|
+
require 'runoff/chat'
|
8
|
+
|
9
|
+
module Runoff
|
10
|
+
# Public: A String containing the name of the table, where all the chat messages are stored.
|
11
|
+
TABLE = :Messages
|
12
|
+
|
13
|
+
# Public: An Array with all the important column names.
|
14
|
+
COLUMNS = [ :convo_id, :chatname, :timestamp, :from_dispname, :body_xml ]
|
15
|
+
end
|
data/runoff.gemspec
CHANGED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'runoff/commandline/all'
|
3
|
+
require 'colorize'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
class CommandAllTest < MiniTest::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@current_directory = File.expand_path(File.dirname(__FILE__))
|
9
|
+
|
10
|
+
@default_output_dir = "#@current_directory/data"
|
11
|
+
@test_database_location = "#@current_directory/data/test_main.db"
|
12
|
+
@expected_message = 'Exporting...'.colorize(:green) + "\n" + 'Finished.'.colorize(:green) + "\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
Dir["#@default_output_dir/*"].each do |f|
|
17
|
+
if File.extname(f) == '.zip'
|
18
|
+
File.delete f
|
19
|
+
elsif File.directory?(f) && f !~ /custom_location/
|
20
|
+
FileUtils.rm_rf f
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_it_raises_a_ArgumentError_if_called_with_an_empty_list_of_arguments
|
26
|
+
command = Runoff::Commandline::All.new( archive: true, adapter: 'TxtAdapter' )
|
27
|
+
|
28
|
+
assert_raises ArgumentError do
|
29
|
+
assert_output 'Exporting...' do
|
30
|
+
command.execute []
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_it_exports_all_chat_history_as_a_zip_archive_and_saves_it_in_the_default_location
|
36
|
+
command = Runoff::Commandline::All.new( archive: true, adapter: 'TxtAdapter' )
|
37
|
+
ENV['HOME'] = @default_output_dir
|
38
|
+
|
39
|
+
Runoff::Location.stub :default_skype_data_location, @test_database_location do
|
40
|
+
assert_output @expected_message do
|
41
|
+
command.execute ['white_mike']
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
assert_equal 1, Dir["#@default_output_dir/*.zip"].count
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_it_exports_all_chat_history_as_a_folder_in_the_default_location_if_a_no_archive_option_is_set
|
49
|
+
command = Runoff::Commandline::All.new( archive: false, adapter: 'TxtAdapter' )
|
50
|
+
ENV['HOME'] = @default_output_dir
|
51
|
+
|
52
|
+
Runoff::Location.stub :default_skype_data_location, @test_database_location do
|
53
|
+
assert_output @expected_message do
|
54
|
+
command.execute ['white_mike']
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
assert_equal 1, Dir["#@default_output_dir/skype_chat_history"].count;
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_it_exports_all_chat_history_as_a_zip_archive_from_a_custom_location_and_saves_it_in_the_default_location
|
62
|
+
test_custom_database_location = "#@current_directory/data/custom_location/test_main.db"
|
63
|
+
|
64
|
+
command = Runoff::Commandline::All.new( archive: true, adapter: 'TxtAdapter', from: test_custom_database_location )
|
65
|
+
ENV['HOME'] = @default_output_dir
|
66
|
+
|
67
|
+
Runoff::Location.stub :default_skype_data_location, @test_database_location do
|
68
|
+
assert_output @expected_message do
|
69
|
+
command.execute ['white_mike']
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
assert_equal 1, Dir["#@default_output_dir/*.zip"].count
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_it_exports_all_chat_history_as_a_zip_archive_and_saves_it_in_a_custom_location
|
77
|
+
custom_output_location = "#@current_directory/data/custom_output_location"
|
78
|
+
|
79
|
+
command = Runoff::Commandline::All.new( archive: true, adapter: 'TxtAdapter', destination: custom_output_location )
|
80
|
+
ENV['HOME'] = @default_output_dir
|
81
|
+
|
82
|
+
Runoff::Location.stub :default_skype_data_location, @test_database_location do
|
83
|
+
assert_output @expected_message do
|
84
|
+
command.execute ['white_mike']
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
assert_equal 1, Dir["#@default_output_dir/custom_output_location/*.zip"].count
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'runoff/commandline/some'
|
3
|
+
require 'colorize'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
class CommandSomeTest < MiniTest::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@current_directory = File.expand_path(File.dirname(__FILE__))
|
9
|
+
|
10
|
+
@default_output_dir = "#@current_directory/data"
|
11
|
+
@test_database_location = "#@current_directory/data/test_main.db"
|
12
|
+
@expected_message = 'Exporting...'.colorize(:green) + "\n" + 'Finished.'.colorize(:green) + "\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
Dir["#@default_output_dir/*"].each do |f|
|
17
|
+
if File.extname(f) == '.zip'
|
18
|
+
File.delete f
|
19
|
+
elsif File.directory?(f) && f !~ /custom_location/
|
20
|
+
FileUtils.rm_rf f
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_it_raises_a_ArgumentError_if_called_with_an_empty_list_of_arguments
|
26
|
+
command = Runoff::Commandline::Some.new( archive: true, adapter: 'TxtAdapter' )
|
27
|
+
|
28
|
+
assert_raises ArgumentError do
|
29
|
+
assert_output 'Exporting...' do
|
30
|
+
command.execute []
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_it_exports_specified_chat_history_as_a_zip_archive_and_saves_it_in_the_default_location
|
36
|
+
command = Runoff::Commandline::Some.new( archive: true, adapter: 'TxtAdapter' )
|
37
|
+
ENV['HOME'] = @default_output_dir
|
38
|
+
|
39
|
+
Runoff::Location.stub :default_skype_data_location, @test_database_location do
|
40
|
+
assert_output @expected_message do
|
41
|
+
command.stub :prompt_for_chatnames, [1] do
|
42
|
+
command.execute ['white_mike']
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
assert_equal 1, Dir["#@default_output_dir/*.zip"].count
|
48
|
+
end
|
49
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'runoff'
|
3
|
+
|
4
|
+
describe Runoff::Location do
|
5
|
+
it 'must return the default Skype database location on Windows 8.1' do
|
6
|
+
skype_username = 'skype_username'
|
7
|
+
path = "/AppData/Local/Packages/Microsoft.SkypeApp_124nb4j3654/LocalState/#{skype_username}/main.db"
|
8
|
+
|
9
|
+
Dir.stub :[], ['/AppData/Local/Packages/Microsoft.SkypeApp_124nb4j3654'] do
|
10
|
+
Runoff::Location.get_default_skype_data_location_on_windows_8(skype_username)
|
11
|
+
.must_equal(path)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must convert a path string from Windows style to Unix style' do
|
16
|
+
original_path = 'C:\Users\Neo\main.db'
|
17
|
+
expected_path = '/Users/Neo/main.db'
|
18
|
+
|
19
|
+
Runoff::Location.format_windows_path(original_path).must_equal(expected_path)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'must build a path for a directory, where the files are supposed to be saved, if the destination option is specified' do
|
23
|
+
path = '/Users/Neo/backups'
|
24
|
+
options = { destination: path }
|
25
|
+
|
26
|
+
File.stub :exist?, true do
|
27
|
+
Runoff::Location.get_export_path(options).must_equal("#{path}/skype_chat_history")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'must build a path for a directory, where the files are supposed to be saved, if the destination option is not specified' do
|
32
|
+
options = { destination: nil }
|
33
|
+
ENV['HOME'] = '/Users/Neo'
|
34
|
+
|
35
|
+
File.stub :exist?, true do
|
36
|
+
Runoff::Location.get_export_path(options).must_equal("#{ENV['HOME']}/skype_chat_history")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'must return the default Skype database location for Windows Desktop app' do
|
41
|
+
RbConfig::CONFIG['host_os'] = 'mingw'
|
42
|
+
ENV['APPDATA'] = 'C:\Users\Neo\AppData\Roaming'
|
43
|
+
|
44
|
+
skype_username = 'skype_username'
|
45
|
+
expected_path = "/Users/Neo/AppData/Roaming/Skype/#{skype_username}/main.db"
|
46
|
+
|
47
|
+
File.stub :exist?, true do
|
48
|
+
Runoff::Location.default_skype_data_location(skype_username).must_equal(expected_path)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'must return the default Skype database location on Linux' do
|
53
|
+
RbConfig::CONFIG['host_os'] = 'linux'
|
54
|
+
ENV['HOME'] = '/home/Neo'
|
55
|
+
|
56
|
+
skype_username = 'skype_username'
|
57
|
+
expected_path = "#{ENV['HOME']}/.Skype/#{skype_username}/main.db"
|
58
|
+
|
59
|
+
Runoff::Location.default_skype_data_location(skype_username).must_equal(expected_path)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'must return the default Skype database location on Mac OS' do
|
63
|
+
RbConfig::CONFIG['host_os'] = 'darvin'
|
64
|
+
ENV['HOME'] = '/Users/Neo'
|
65
|
+
|
66
|
+
skype_username = 'skype_username'
|
67
|
+
expected_path = "#{ENV['HOME']}/Library/Application Support/Skype/#{skype_username}/main.db"
|
68
|
+
|
69
|
+
Runoff::Location.default_skype_data_location(skype_username).must_equal(expected_path)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'must return the path that are specified in the from option' do
|
73
|
+
path = '/Users/Neo/Desktop/main.db'
|
74
|
+
options = { from: path }
|
75
|
+
|
76
|
+
Runoff::Location.get_database_path('Neo', options).must_equal(path)
|
77
|
+
end
|
78
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runoff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aigars Dzerviniks
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: commander
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: sequel
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -96,16 +82,23 @@ files:
|
|
96
82
|
- Rakefile
|
97
83
|
- bin/runoff
|
98
84
|
- lib/runoff.rb
|
99
|
-
- lib/runoff/
|
100
|
-
- lib/runoff/
|
101
|
-
- lib/runoff/
|
85
|
+
- lib/runoff/adapters/adapter.rb
|
86
|
+
- lib/runoff/adapters/json_adapter.rb
|
87
|
+
- lib/runoff/adapters/txt_adapter.rb
|
88
|
+
- lib/runoff/chat.rb
|
89
|
+
- lib/runoff/commandline/all.rb
|
90
|
+
- lib/runoff/commandline/command.rb
|
91
|
+
- lib/runoff/commandline/none.rb
|
92
|
+
- lib/runoff/commandline/some.rb
|
102
93
|
- lib/runoff/file_writer.rb
|
103
94
|
- lib/runoff/location.rb
|
104
|
-
- lib/runoff/skype_data_format.rb
|
105
95
|
- lib/runoff/version.rb
|
106
96
|
- runoff.gemspec
|
107
|
-
- test/
|
108
|
-
- test/
|
97
|
+
- test/command_all_test.rb
|
98
|
+
- test/command_some_test.rb
|
99
|
+
- test/data/custom_location/test_main.db
|
100
|
+
- test/data/test_main.db
|
101
|
+
- test/location_test.rb
|
109
102
|
homepage: https://github.com/aigarsdz/runoff
|
110
103
|
licenses:
|
111
104
|
- MIT
|
@@ -126,10 +119,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
119
|
version: '0'
|
127
120
|
requirements: []
|
128
121
|
rubyforge_project:
|
129
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.2.2
|
130
123
|
signing_key:
|
131
124
|
specification_version: 4
|
132
125
|
summary: Tool to export Skype chat history from the SQLite database to text files
|
133
126
|
test_files:
|
134
|
-
- test/
|
135
|
-
- test/
|
127
|
+
- test/command_all_test.rb
|
128
|
+
- test/command_some_test.rb
|
129
|
+
- test/data/custom_location/test_main.db
|
130
|
+
- test/data/test_main.db
|
131
|
+
- test/location_test.rb
|
data/lib/runoff/commands/all.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'sequel'
|
2
|
-
|
3
|
-
module Runoff
|
4
|
-
# Commands that can be executed by the application.
|
5
|
-
module Commands
|
6
|
-
class All < Command
|
7
|
-
# Public: Exports all Skyoe chat history.
|
8
|
-
#
|
9
|
-
# args - an array containing skype username
|
10
|
-
# options - a hash containing user provided options
|
11
|
-
#
|
12
|
-
# Examples
|
13
|
-
#
|
14
|
-
# All.process ['username'], { from: '~/main.db' }
|
15
|
-
def self.process(args, options = {})
|
16
|
-
file_writer, export_path = self.get_file_writer_components args, options
|
17
|
-
|
18
|
-
file_writer.export_database Runoff::SkypeDataFormat.new, export_path, options.archive
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Runoff
|
2
|
-
# Commands that can be executed by the application.
|
3
|
-
module Commands
|
4
|
-
# The base class for every runoff command.
|
5
|
-
class Command
|
6
|
-
def self.get_file_writer_components(args, options)
|
7
|
-
if args.empty? && !options.from
|
8
|
-
raise ArgumentError.new 'Error: You must specify the Skype username or a --from option'
|
9
|
-
end
|
10
|
-
|
11
|
-
main_db_path = Runoff::Location.get_database_path args[0], options
|
12
|
-
export_path = Runoff::Location.get_export_path options
|
13
|
-
db_handler = Sequel.sqlite main_db_path
|
14
|
-
|
15
|
-
return Runoff::FileWriter.new(db_handler), export_path
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/lib/runoff/commands/some.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'sequel'
|
2
|
-
require 'set'
|
3
|
-
|
4
|
-
module Runoff
|
5
|
-
# Commands that can be executed by the application.
|
6
|
-
module Commands
|
7
|
-
class Some < Command
|
8
|
-
# Public: Exports a specified part of Skyoe chat history.
|
9
|
-
#
|
10
|
-
# args - an array containing skype username
|
11
|
-
# options - a hash containing user provided options
|
12
|
-
#
|
13
|
-
# Examples
|
14
|
-
#
|
15
|
-
# Some.process ['username'], { from: '~/main.db' }
|
16
|
-
def self.process(args, options = {})
|
17
|
-
file_writer, export_path = self.get_file_writer_components args, options
|
18
|
-
format = Runoff::SkypeDataFormat.new
|
19
|
-
|
20
|
-
file_writer.export_database_partially format, export_path, options.archive do |w, d|
|
21
|
-
chatname_dataset = d.select(:chatname)
|
22
|
-
chatnames = Set.new # Set is necessary to filter out duplicate chatnames.
|
23
|
-
|
24
|
-
chatname_dataset.each { |row| chatnames.add format.normalize(row[:chatname]) }
|
25
|
-
|
26
|
-
# In order to use indices we need an array.
|
27
|
-
w.selected_entries = chatnames.to_a
|
28
|
-
|
29
|
-
w.selected_entries.each_with_index { |e, i| puts "[#{i}] #{e}" }
|
30
|
-
|
31
|
-
puts # Ensure a blank line.
|
32
|
-
# Return the user response back to the FileWriter class.
|
33
|
-
next ask("Specify which chats to export separating each number with a comma:")
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|