pidgin2adium 3.3.0 → 4.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -3
  3. data/.rspec +1 -0
  4. data/.simplecov +5 -0
  5. data/.travis.yml +12 -0
  6. data/Gemfile +6 -1
  7. data/LICENSE +17 -17
  8. data/NEWS.md +89 -0
  9. data/README.md +60 -0
  10. data/Rakefile +5 -23
  11. data/bin/pidgin2adium +19 -90
  12. data/lib/pidgin2adium.rb +4 -136
  13. data/lib/pidgin2adium/adium_chat_file_creator.rb +64 -0
  14. data/lib/pidgin2adium/file_finder.rb +23 -0
  15. data/lib/pidgin2adium/runner.rb +23 -0
  16. data/lib/pidgin2adium/version.rb +1 -1
  17. data/pidgin2adium.gemspec +25 -21
  18. data/spec/features/parse_pidgin_log_file_spec.rb +50 -0
  19. data/spec/fixtures/input/input.html +3 -0
  20. data/spec/fixtures/output.xml +5 -0
  21. data/spec/pidgin2adium/adium_chat_file_creator_spec.rb +89 -0
  22. data/spec/pidgin2adium/file_finder_spec.rb +63 -0
  23. data/spec/spec_helper.rb +17 -59
  24. metadata +96 -89
  25. data/.autotest +0 -28
  26. data/ChangeLog +0 -79
  27. data/Manifest.txt +0 -18
  28. data/README.rdoc +0 -122
  29. data/config/website.yml +0 -2
  30. data/ext/balance_tags_c/balance_tags_c.c +0 -198
  31. data/ext/balance_tags_c/extconf.rb +0 -4
  32. data/lib/pidgin2adium/log_converter.rb +0 -71
  33. data/lib/pidgin2adium/log_file.rb +0 -100
  34. data/lib/pidgin2adium/log_parser.rb +0 -2
  35. data/lib/pidgin2adium/message.rb +0 -2
  36. data/lib/pidgin2adium/messages/all.rb +0 -5
  37. data/lib/pidgin2adium/messages/auto_reply_message.rb +0 -11
  38. data/lib/pidgin2adium/messages/event.rb +0 -17
  39. data/lib/pidgin2adium/messages/message.rb +0 -39
  40. data/lib/pidgin2adium/messages/status_message.rb +0 -17
  41. data/lib/pidgin2adium/messages/xml_message.rb +0 -40
  42. data/lib/pidgin2adium/parsers/all.rb +0 -3
  43. data/lib/pidgin2adium/parsers/basic_parser.rb +0 -456
  44. data/lib/pidgin2adium/parsers/html_log_parser.rb +0 -125
  45. data/lib/pidgin2adium/parsers/text_log_parser.rb +0 -39
  46. data/spec/balance_tags_c_extn_spec.rb +0 -47
  47. data/spec/basic_parser_spec.rb +0 -219
  48. data/spec/html_log_parser_spec.rb +0 -150
  49. data/spec/log_converter_spec.rb +0 -48
  50. data/spec/log_file_spec.rb +0 -176
  51. data/spec/logfiles/2006-12-21.223606.txt +0 -3
  52. data/spec/logfiles/2008-01-15.071445-0500PST.htm +0 -5
  53. data/spec/logfiles/2008-01-15.071445-0500PST.html +0 -5
  54. data/spec/pidgin2adium_spec.rb +0 -252
  55. data/spec/spec.opts +0 -1
  56. data/spec/test-output/README.md +0 -1
  57. data/spec/test-output/html_log_output.xml +0 -6
  58. data/spec/test-output/text_log_output.xml +0 -4
  59. data/spec/text_log_parser_spec.rb +0 -42
  60. data/tasks/extconf.rake +0 -8
  61. data/tasks/extconf/balance_tags_c.rake +0 -47
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1a19269fc564ee7b96212824080a049dcc6fe3b8
4
+ data.tar.gz: 5314c9de5efe136193a156a71cd09ce65cccd72b
5
+ SHA512:
6
+ metadata.gz: 60269903641f9776950be83fa2fa99a0cf72c09d5826f30eaf0bc5c94e79678d5e8485d1a1bb450b53e93a1c18d8ff014be0e2863c164b2183f1a96e0f5d6cdd
7
+ data.tar.gz: 3c52742c8416ca06cc4d2695c0e78b3c648e0bc43441bebe82b072e91dfb304e7c520d5fe5cce37c2821ba5bbc99da1300c83c4a4636810a18bc9da6b55437dd
data/.gitignore CHANGED
@@ -17,13 +17,12 @@ tmtags
17
17
  coverage
18
18
  rdoc
19
19
  pkg
20
+ tags
20
21
 
21
22
  ## PROJECT::SPECIFIC
22
23
  .bundle
23
- ext/balance_tags_c/Makefile
24
- ext/balance_tags_c/balance_tags_c.bundle
25
- ext/balance_tags_c/balance_tags_c.o
26
24
  .rvmrc
27
25
  spec/output-dir
28
26
  spec/nonexistent_output_dir
29
27
  Gemfile.lock
28
+ tmp
data/.rspec CHANGED
@@ -1 +1,2 @@
1
1
  --color
2
+ -r spec_helper
data/.simplecov ADDED
@@ -0,0 +1,5 @@
1
+ if ENV["COVERAGE"]
2
+ SimpleCov.start do
3
+ add_filter "/spec/"
4
+ end
5
+ end
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ rvm:
2
+ - 2.1.2
3
+ - 2.1.1
4
+ - 2.0.0
5
+ - 1.9.3
6
+ - 1.9.2
7
+ branches:
8
+ only:
9
+ - master
10
+ notifications:
11
+ email:
12
+ - false
data/Gemfile CHANGED
@@ -1,3 +1,8 @@
1
- source :rubygems
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
+
5
+ gem "pipio", github: "gabebw/pipio"
6
+ # Use FakeFS from GitHub so that this commit is available:
7
+ # https://github.com/defunkt/fakefs/commit/41e2e46446dfacb07135a82e24858b5e06220ec9
8
+ gem "fakefs", github: "defunkt/fakefs", require: false
data/LICENSE CHANGED
@@ -1,20 +1,20 @@
1
- Copyright (c) 2009 Gabe Berke-Williams
1
+ The MIT License (MIT)
2
2
 
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
3
+ Copyright (c) 2013 Gabriel Berke-Williams
10
4
 
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
13
11
 
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/NEWS.md ADDED
@@ -0,0 +1,89 @@
1
+ ### HEAD (unreleased)
2
+
3
+ * Massive refactoring
4
+ * Chat times respect time zones instead of assuming inputs are UTC
5
+ * Remove C extension
6
+ * Test against Travis
7
+
8
+ ### 3.3.0 / 2011-10-16
9
+ * Pidgin2Adium depended on itself for some reason. Now it doesn't.
10
+
11
+ ### 3.2.3 / 2010-11-08
12
+ * Be more liberal in what Pidgin2Adium accepts when parsing the date and
13
+ getting basic time info for the first line. Thanks to Matthew Jakubowski for
14
+ helping me fix this bug.
15
+
16
+ ### 3.2.2 / 2010-11-08
17
+ * Use DateTime#strftime to get dates in xmlschema format. DateTime#xmlschema
18
+ doesn't exist in Ruby 1.8, and Ruby 1.9 has DateTime#iso8601, not
19
+ DateTime#xmlschema. Just use strftime. Thanks to Matthew Jakubowski for
20
+ pointing this bug out.
21
+
22
+ ### 3.2.1 / 2010-11-08
23
+ * Use straight `DateTime.parse` when possible, and only fall back on hacky
24
+ `Date._strptime` when we have to.
25
+
26
+ ### 3.2.0 / 2010-10-12
27
+ * Last release broke 1.8 compatibility due to use of strptime. 1.8 and 1.9
28
+ both work in 3.2.0.
29
+ * Moved Pidgin2Adium::VERSION to its own file
30
+
31
+ ### 3.1.1 / 2010-08-13
32
+ * Moved BasicParser and its subclasses into parsers/ subdir.
33
+ - You can now do `require 'pidgin2adium/parsers/all'`,
34
+ though the old `require 'pidgin2adium/log_parser'` will still work
35
+ * Moved Message and its subclasses into messages/ subdir
36
+ - You can now do `require 'pidgin2adium/messages/all'`,
37
+ though the old `require 'pidgin2adium/message'` will still work
38
+
39
+ ### 3.1.0 / 2010-08-13
40
+ * Compatible with Ruby 1.9!
41
+ - removed dependency on `parsedate` library, which 1.9 doesn't have
42
+ * `log_parser.rb` has been split into separate files (1 per class, more or less)
43
+ - `require pidgin2adium/log_parser` will still pull in all of the split-up
44
+ classes
45
+ * `balance_tags_c` extension really does work now
46
+ * Cleans up more junk from Pidgin logfiles when parsing
47
+ * Bugfixes and more graceful handling of error states
48
+ * Fully tested (except bin/pidgin2adium, which remains tricky)
49
+
50
+ ### 3.0.1 / 2010-08-07
51
+ Bugfix release.
52
+
53
+ * `balance_tags_c.c`: Use `rb_eval_string` instead of `rb_reg_regcomp` to avoid
54
+ segfaults (commit #733ce88b0836256e14f0, fixes #27811)
55
+
56
+ Non-user-facing stuff:
57
+
58
+ * Switched to Jeweler, RSpec, and Bundler
59
+ * Rakefile now doesn't choke if Hanna gem isn't installed
60
+
61
+ ### 3.0.0 / 2010-01-31
62
+ * `lbalance_tags.rb` is now a C extension (`Pidgin2Adium.balance_tags_c`)
63
+ - the pure-ruby mixin `balance_tags` (without the trailing `_c`) is gone
64
+ * Better handling of command-line arguments
65
+ * Format time zones offsets correctly (e.g. "+0500", not "+-0500")
66
+ * Write Yahoo! and Jabber logs to correct directories (#27710)
67
+ * Better matching of regexes against time strings
68
+ * Better documentation
69
+
70
+ ### 2.0.2 / 2009-12-18
71
+ * Much better documentation (more of it, and higher quality too!)
72
+ * Allow user-provided output dir at commandline
73
+ * Cleaner error messages
74
+ * require 'time' for `Time.zone_offset` (fixes bug)
75
+ * Gracefully handle lack of timezone info
76
+ * Gracefully handle nonexistent output dir
77
+ * Gracefully handle parsing errors
78
+ * Print error messages during *and* after batch converting so they're actually seen
79
+
80
+ ### 2.0.1 / 2009-12-06
81
+ * Fix timestamps so they show up in Adium chat log viewer
82
+
83
+ ### 2.0.0 / 2009-11-24
84
+ * Added documentation, available at http://pidgin2adium.rubyforge.org/rdoc/
85
+ * Added public interface for scripting purposes
86
+ * Removed -o and -l options. Now gem automatically outputs to Adium log dir with no intermediate folder.
87
+
88
+ ### 1.0.0 / 2009-09-27
89
+ * Birthday!
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # pidgin2adium [![Build Status](https://secure.travis-ci.org/gabebw/pidgin2adium.png)](http://travis-ci.org/gabebw/pidgin2adium) [![Code Climate](https://codeclimate.com/github/gabebw/pidgin2adium.png)](https://codeclimate.com/github/gabebw/pidgin2adium)
2
+
3
+ Convert [Pidgin](http://pidgin.im/) (formerly gaim) logs to the
4
+ [Adium](http://adium.im/) format. This is a command-line wrapper around the
5
+ [Pipio] log-parsing library.
6
+
7
+ [Pipio]: https://github.com/gabebw/pipio
8
+
9
+ ## Install
10
+
11
+ gem install pidgin2adium
12
+
13
+ ## Quick Start
14
+
15
+ Let's say you have some logs in `~/pidgin-logs`, and your aliases are "Gabe
16
+ B-W", "Gabe", and "Gabe Berke-Williams". Then you should run this:
17
+
18
+ pidgin2adium --in ~/pidgin-logs --aliases "Gabe B-W,Gabe,Gabe Berke-Williams"
19
+
20
+ ## OK, what's with the aliases?
21
+
22
+ Pidgin2adium needs a comma-separated list of your aliases to work. Aliases make
23
+ it so that you show up in chats as (for example) `Me` instead of as
24
+ `best_screen_name_ever_018845`.
25
+
26
+ Pidgin then uses aliases in the log file instead of the actual screen name,
27
+ which makes it impossible to match "Me" to your actual screen name. Therefore
28
+ Pidgin2adium needs to know which aliases belong to you so it can map them to the
29
+ correct screen name.
30
+
31
+ If Pidgin2adium encounters an alias that you did not list, it assumes that it
32
+ belongs to the person to whom you are chatting.
33
+
34
+ You do not need to provide your screenname in the alias list.
35
+
36
+ ## Testing
37
+
38
+ To get a coverage report, run `rake` with the `COVERAGE` environment variable
39
+ set:
40
+
41
+ COVERAGE=1 rake
42
+
43
+ ## THANKS
44
+
45
+ With thanks to Li Ma, whose [blog post](http://li-ma.blogspot.com/2008/10/pidgin-log-file-to-adium-log-converter.html)
46
+ helped tremendously.
47
+
48
+ ## Note on Patches/Pull Requests
49
+
50
+ * Fork the project.
51
+ * Make your feature addition or bug fix.
52
+ * Add tests for it. This is important so I don't break it in a
53
+ future version unintentionally.
54
+ * Commit, do not mess with rakefile, version, or history.
55
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
56
+ * Send me a pull request. Bonus points for topic branches.
57
+
58
+ ## Copyright
59
+
60
+ Copyright (c) 2009-2014 Gabe Berke-Williams. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,31 +1,13 @@
1
1
  require 'bundler'
2
+ require 'bundler/setup'
2
3
  Bundler::GemHelper.install_tasks
3
4
 
4
5
  require 'rspec/core/rake_task'
5
6
 
6
- RSpec::Core::RakeTask.new(:spec) do |spec|
7
- spec.rspec_opts = %w{-Ilib -Ispec}
8
- spec.pattern = 'spec/**/*_spec.rb'
9
- end
10
-
11
- RSpec::Core::RakeTask.new(:rcov) do |spec|
12
- spec.rspec_opts = %w{-Ilib -Ispec}
13
- spec.pattern = 'spec/**/*_spec.rb'
14
- spec.rcov = true
15
- end
16
-
17
- task :spec => "extconf:compile"
18
-
19
- task :default => :spec
20
-
21
- require 'rake/rdoctask'
22
- Rake::RDocTask.new do |rdoc|
23
- version = Pidgin2Adium::VERSION
7
+ RSpec::Core::RakeTask.new(:spec)
24
8
 
25
- rdoc.rdoc_dir = 'rdoc'
26
- rdoc.title = "pidgin2adium #{version}"
27
- rdoc.rdoc_files.include('README*')
28
- rdoc.rdoc_files.include('lib/**/*.rb')
9
+ task :coverage do
10
+ system "COVERAGE=1 rake ; open coverage/index.html"
29
11
  end
30
12
 
31
- Dir['tasks/**/*.rake'].each { |t| load t }
13
+ task default: :spec
data/bin/pidgin2adium CHANGED
@@ -1,109 +1,38 @@
1
- #!/usr/bin/ruby -w
1
+ #!/usr/bin/env ruby
2
2
 
3
- =begin
4
- Author: Gabe Berke-Williams, 2008
5
- Usage:
6
- This is the shell script, which is a wrapper around Pidgin2Adium::LogConverter.
7
- Call it like so:
8
- <tt>pidgin2adium -i ~/in_logs/ -a "me,my_pidgin_alias,other_pidgin_alias"</tt>
9
- For <tt>-a/--aliases</tt>, there is no need to use spaces or capitalization,
10
- since spaces will be stripped out and the aliases will be lowercased anyway.
11
- Aliases doesn't have to include screennames, either, since these are
12
- automatically recognized.
13
- =end
14
-
15
- require 'pidgin2adium/log_converter'
16
- require 'optparse'
17
-
18
- version = <<EOL
19
- Pidgin2Adium, version #{Pidgin2Adium::VERSION}
20
- Written by Gabe Berke-Williams (gbw@rubyforge.org)
21
- EOL
3
+ require "pidgin2adium"
4
+ require "optparse"
22
5
 
23
6
  options = {}
24
7
 
25
- oparser = OptionParser.new do |opts|
26
- opts.banner = "Usage: #{File.basename($0)} [options]"
27
- opts.on('-i', '--in=IN_DIR', String, 'Directory where pidgin logs are stored') do |i|
28
- options[:in] = i
29
- end
30
-
31
- opts.on('-a alias1,alias2', "--aliases alias1,alias2",
32
- "A comma-separated list of your alias(es)",
33
- "so this script knows which person in a chat",
34
- "is you. Whitespace and case do not matter.") do |aliases|
35
- options[:aliases] = aliases
36
- end
37
-
38
- opts.on('-o', '--out OUT_DIR',
39
- 'The top-level directory under which to',
40
- 'store the logs (each in its own folder',
41
- 'by screen name).',
42
- "Defaults to: #{Pidgin2Adium::ADIUM_LOG_DIR}") do |out|
43
- options[:output_dir] = out
44
- end
8
+ parser = OptionParser.new do |parser|
9
+ parser.banner = "Usage: #{File.basename($0)} -i PIDGIN_LOG_DIR"
45
10
 
46
- opts.on('-f', '--force', 'If this is set, then logs in the Adium log',
47
- 'folder that have the same name as converted',
48
- 'logs will be overwritten.') do |f|
49
- options[:force] = f
11
+ parser.on('-i', '--in IN_DIR', 'Directory where pidgin logs are stored') do |in_directory|
12
+ options[:in_directory] = in_directory
50
13
  end
51
14
 
52
- opts.on('-c', '--continue', "Continue converting after hitting unparseable lines. Will print the problem lines and log at the end.") do |c|
53
- options[:force_conversion] = c
15
+ parser.on('-a', '--aliases "gabebw,Gabe B-W"', "Your aliases from Pidgin") do |aliases|
16
+ options[:aliases] = aliases.split(",")
54
17
  end
55
18
 
56
- opts.on("-v", "--version", "Show version information") do
57
- puts version
19
+ parser.on("-v", "--version", "Show version information") do
20
+ puts "Pidgin2Adium, version #{Pidgin2Adium::VERSION}"
58
21
  exit
59
22
  end
60
23
 
61
- opts.on_tail("-h", "--help", "Show this message") do
62
- puts version
63
- puts opts
24
+ parser.on_tail("-h", "--help", "Show this message") do
25
+ puts parser
64
26
  exit
65
27
  end
66
28
  end
67
29
 
68
- begin
69
- oparser.parse!
70
- rescue => bang
71
- if bang.class == OptionParser::MissingArgument
72
- # No argument provided for a switch that requires an argument.
73
- puts '"%s" requires an argument.' % bang.args[0]
74
- exit 1
75
- elsif bang.class == OptionParser::InvalidOption
76
- # Provided a switch that we don't handle.
77
- puts '"%s" is not a valid switch.' % bang.args[0]
78
- elsif bang.class == OptionParser::NeedlessArgument
79
- # Raised when argument provided for a switch that doesn't take an argument.
80
- puts bang.message
81
- end
82
- end
83
-
84
- need_opts = false
85
- required_opts = [[:i, :in], [:a, :aliases]]
86
-
87
- required_opts.each do |short, long|
88
- if options.has_key?(long)
89
- next
90
- else
91
- need_opts = true
92
- puts "Required option -#{short}/--#{long} missing."
93
- end
94
- end
30
+ parser.parse!
95
31
 
96
- if need_opts
97
- puts oparser.to_s
32
+ if options[:in_directory] && options[:aliases]
33
+ runner = Pidgin2Adium::Runner.new(options[:in_directory], option[:aliases])
34
+ runner.run
35
+ else
36
+ STDERR.puts "Please provide -i/--in argument and -a/--aliases. Run with --help for more information"
98
37
  exit 1
99
38
  end
100
-
101
- extra_opts = {:overwrite => options[:force]}
102
-
103
- extra_opts[:output_dir] = options[:output_dir]
104
- extra_opts[:force_conversion] = options[:force_conversion]
105
-
106
- log_converter = Pidgin2Adium::LogConverter.new(options[:in],
107
- options[:aliases],
108
- extra_opts)
109
- log_converter.start
data/lib/pidgin2adium.rb CHANGED
@@ -1,137 +1,5 @@
1
- # Author: Gabe Berke-Williams, 2008
2
- #
3
- # A ruby program to convert Pidgin log files to Adium log files, then place
4
- # them in the Adium log directory.
5
-
6
- require 'fileutils'
7
- require 'time'
1
+ require 'pipio'
8
2
  require 'pidgin2adium/version'
9
- require 'pidgin2adium/parsers/all'
10
-
11
- module Pidgin2Adium
12
- # Returned by LogFile.write_out if the output logfile already exists.
13
- FILE_EXISTS = 42
14
- ADIUM_LOG_DIR = File.expand_path('~/Library/Application Support/Adium 2.0/Users/Default/Logs/') << '/'
15
- # These files/directories show up in Dir.entries()
16
- BAD_DIRS = %w{. .. .DS_Store Thumbs.db .system}
17
- # For displaying after we finish converting
18
- @@oops_messages = []
19
- @@error_messages = []
20
-
21
- def log_msg(str) #:nodoc:
22
- puts str.to_s
23
- end
24
-
25
- def oops(str) #:nodoc:
26
- @@oops_messages << str
27
- warn("Oops: #{str}")
28
- end
29
-
30
- def error(str) #:nodoc:
31
- @@error_messages << str
32
- warn("Error: #{str}")
33
- end
34
-
35
- #######################
36
- #So that we can use log_msg when calling delete_search_indexes() by itself
37
- module_function :log_msg, :oops, :error
38
- #######################
39
-
40
- # Parses the provided log.
41
- # Returns a LogFile instance or false if an error occurred.
42
- def parse(logfile_path, my_aliases, force_conversion)
43
- logfile_path = File.expand_path(logfile_path)
44
- ext = File.extname(logfile_path).sub('.', '').downcase
45
-
46
- if(ext == "html" || ext == "htm")
47
- parser_class = HtmlLogParser
48
- elsif(ext == "txt")
49
- parser_class = TextLogParser
50
- else
51
- error("Doing nothing, logfile is not a text or html file. Path: #{logfile_path}.")
52
- return false
53
- end
54
-
55
- parser = parser_class.new(logfile_path, my_aliases, force_conversion)
56
- return parser.parse()
57
- end
58
-
59
- # Parses the provided log and writes out the log in Adium format.
60
- # Returns:
61
- # * true if it successfully converted and wrote out the log,
62
- # * false if an error occurred, or
63
- # * Pidgin2Adium::FILE_EXISTS if file already exists AND
64
- # opts[:overwrite] = false.
65
- #
66
- # You can add options using the _opts_ hash, which can have the following
67
- # keys, all of which are optional:
68
- # * *overwrite*: If true, then overwrite even if log is found.
69
- # Defaults to false.
70
- # * *output_dir*: The top-level dir to put the logs in.
71
- # Logs under output_dir are still each in their own folders, etc.
72
- # Defaults to Pidgin2Adium::ADIUM_LOG_DIR
73
- def parse_and_generate(logfile_path, my_aliases, opts = {})
74
- opts = {} unless opts.is_a?(Hash)
75
- overwrite = !!opts[:overwrite]
76
- force_conversion = opts[:force_conversion]
77
-
78
- if opts.key?(:output_dir)
79
- output_dir = opts[:output_dir]
80
- else
81
- output_dir = ADIUM_LOG_DIR
82
- end
83
-
84
- unless File.directory?(output_dir)
85
- puts "Output log directory (#{output_dir}) does not exist or is not a directory."
86
- begin
87
- FileUtils.mkdir_p(output_dir)
88
- rescue Errno::EACCES
89
- puts "Permission denied, could not create output directory (#{output_dir})"
90
- return false
91
- end
92
- end
93
-
94
- logfile_obj = parse(logfile_path, my_aliases, force_conversion)
95
- return false if logfile_obj == false
96
- dest_file_path = logfile_obj.write_out(overwrite, output_dir)
97
- if dest_file_path == false
98
- error("Successfully parsed file, but failed to write it out. Path: #{logfile_path}.")
99
- return false
100
- elsif dest_file_path == FILE_EXISTS
101
- log_msg("File already exists.")
102
- return FILE_EXISTS
103
- else
104
- log_msg("Output to: #{dest_file_path}")
105
- return true
106
- end
107
- end
108
-
109
- # Newly-converted logs are viewable in the Adium Chat Transcript
110
- # Viewer, but are not indexed, so a search of the logs doesn't give
111
- # results from the converted logs. To fix this, we delete the cached log
112
- # indexes, which forces Adium to re-index.
113
- #
114
- # Note: This function is run by LogConverter after converting all of its
115
- # files. LogFile.write_out intentionally does _not_ run it in order to
116
- # allow for batch-processing of files. Thus, you will probably want to run
117
- # Pidgin2Adium.delete_search_indexes after running LogFile.write_out in
118
- # your own scripts.
119
- def delete_search_indexes()
120
- log_msg "Deleting log search indexes in order to force re-indexing of imported logs..."
121
- dirty_file = File.expand_path("~/Library/Caches/Adium/Default/DirtyLogs.plist")
122
- log_index_file = File.expand_path("~/Library/Caches/Adium/Default/Logs.index")
123
- [dirty_file, log_index_file].each do |f|
124
- if File.exist?(f)
125
- if File.writable?(f)
126
- File.delete(f)
127
- else
128
- error("File exists but is not writable. Please delete it yourself: #{f}")
129
- end
130
- end
131
- end
132
- log_msg "...done."
133
- log_msg "When you next start the Adium Chat Transcript Viewer, it will re-index the logs, which may take a while."
134
- end
135
-
136
- module_function :parse, :parse_and_generate, :delete_search_indexes
137
- end
3
+ require 'pidgin2adium/file_finder'
4
+ require 'pidgin2adium/runner'
5
+ require 'pidgin2adium/adium_chat_file_creator'