sup 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +12 -0
  4. data/CONTRIBUTORS +84 -0
  5. data/Gemfile +3 -0
  6. data/HACKING +42 -0
  7. data/History.txt +361 -0
  8. data/LICENSE +280 -0
  9. data/README.md +70 -0
  10. data/Rakefile +12 -0
  11. data/ReleaseNotes +231 -0
  12. data/bin/sup +434 -0
  13. data/bin/sup-add +118 -0
  14. data/bin/sup-config +243 -0
  15. data/bin/sup-dump +43 -0
  16. data/bin/sup-import-dump +101 -0
  17. data/bin/sup-psych-ify-config-files +21 -0
  18. data/bin/sup-recover-sources +87 -0
  19. data/bin/sup-sync +210 -0
  20. data/bin/sup-sync-back-maildir +127 -0
  21. data/bin/sup-tweak-labels +140 -0
  22. data/contrib/colorpicker.rb +100 -0
  23. data/contrib/completion/_sup.zsh +114 -0
  24. data/devel/console.sh +3 -0
  25. data/devel/count-loc.sh +3 -0
  26. data/devel/load-index.rb +9 -0
  27. data/devel/profile.rb +12 -0
  28. data/devel/start-console.rb +5 -0
  29. data/doc/FAQ.txt +119 -0
  30. data/doc/Hooks.txt +79 -0
  31. data/doc/Philosophy.txt +69 -0
  32. data/lib/sup.rb +467 -0
  33. data/lib/sup/account.rb +90 -0
  34. data/lib/sup/buffer.rb +768 -0
  35. data/lib/sup/colormap.rb +239 -0
  36. data/lib/sup/contact.rb +67 -0
  37. data/lib/sup/crypto.rb +461 -0
  38. data/lib/sup/draft.rb +119 -0
  39. data/lib/sup/hook.rb +159 -0
  40. data/lib/sup/horizontal_selector.rb +59 -0
  41. data/lib/sup/idle.rb +42 -0
  42. data/lib/sup/index.rb +882 -0
  43. data/lib/sup/interactive_lock.rb +89 -0
  44. data/lib/sup/keymap.rb +140 -0
  45. data/lib/sup/label.rb +87 -0
  46. data/lib/sup/logger.rb +77 -0
  47. data/lib/sup/logger/singleton.rb +10 -0
  48. data/lib/sup/maildir.rb +257 -0
  49. data/lib/sup/mbox.rb +187 -0
  50. data/lib/sup/message.rb +803 -0
  51. data/lib/sup/message_chunks.rb +328 -0
  52. data/lib/sup/mode.rb +140 -0
  53. data/lib/sup/modes/buffer_list_mode.rb +50 -0
  54. data/lib/sup/modes/completion_mode.rb +55 -0
  55. data/lib/sup/modes/compose_mode.rb +38 -0
  56. data/lib/sup/modes/console_mode.rb +125 -0
  57. data/lib/sup/modes/contact_list_mode.rb +148 -0
  58. data/lib/sup/modes/edit_message_async_mode.rb +110 -0
  59. data/lib/sup/modes/edit_message_mode.rb +728 -0
  60. data/lib/sup/modes/file_browser_mode.rb +109 -0
  61. data/lib/sup/modes/forward_mode.rb +82 -0
  62. data/lib/sup/modes/help_mode.rb +19 -0
  63. data/lib/sup/modes/inbox_mode.rb +85 -0
  64. data/lib/sup/modes/label_list_mode.rb +138 -0
  65. data/lib/sup/modes/label_search_results_mode.rb +38 -0
  66. data/lib/sup/modes/line_cursor_mode.rb +203 -0
  67. data/lib/sup/modes/log_mode.rb +57 -0
  68. data/lib/sup/modes/person_search_results_mode.rb +12 -0
  69. data/lib/sup/modes/poll_mode.rb +19 -0
  70. data/lib/sup/modes/reply_mode.rb +228 -0
  71. data/lib/sup/modes/resume_mode.rb +52 -0
  72. data/lib/sup/modes/scroll_mode.rb +252 -0
  73. data/lib/sup/modes/search_list_mode.rb +204 -0
  74. data/lib/sup/modes/search_results_mode.rb +59 -0
  75. data/lib/sup/modes/text_mode.rb +76 -0
  76. data/lib/sup/modes/thread_index_mode.rb +1033 -0
  77. data/lib/sup/modes/thread_view_mode.rb +941 -0
  78. data/lib/sup/person.rb +134 -0
  79. data/lib/sup/poll.rb +272 -0
  80. data/lib/sup/rfc2047.rb +56 -0
  81. data/lib/sup/search.rb +110 -0
  82. data/lib/sup/sent.rb +58 -0
  83. data/lib/sup/service/label_service.rb +45 -0
  84. data/lib/sup/source.rb +244 -0
  85. data/lib/sup/tagger.rb +50 -0
  86. data/lib/sup/textfield.rb +253 -0
  87. data/lib/sup/thread.rb +452 -0
  88. data/lib/sup/time.rb +93 -0
  89. data/lib/sup/undo.rb +38 -0
  90. data/lib/sup/update.rb +30 -0
  91. data/lib/sup/util.rb +747 -0
  92. data/lib/sup/util/ncurses.rb +274 -0
  93. data/lib/sup/util/path.rb +9 -0
  94. data/lib/sup/util/query.rb +17 -0
  95. data/lib/sup/util/uri.rb +15 -0
  96. data/lib/sup/version.rb +3 -0
  97. data/sup.gemspec +53 -0
  98. data/test/dummy_source.rb +61 -0
  99. data/test/gnupg_test_home/gpg.conf +1 -0
  100. data/test/gnupg_test_home/pubring.gpg +0 -0
  101. data/test/gnupg_test_home/receiver_pubring.gpg +0 -0
  102. data/test/gnupg_test_home/receiver_secring.gpg +0 -0
  103. data/test/gnupg_test_home/receiver_trustdb.gpg +0 -0
  104. data/test/gnupg_test_home/secring.gpg +0 -0
  105. data/test/gnupg_test_home/sup-test-2@foo.bar.asc +20 -0
  106. data/test/gnupg_test_home/trustdb.gpg +0 -0
  107. data/test/integration/test_label_service.rb +18 -0
  108. data/test/messages/bad-content-transfer-encoding-1.eml +8 -0
  109. data/test/messages/binary-content-transfer-encoding-2.eml +21 -0
  110. data/test/messages/missing-line.eml +9 -0
  111. data/test/test_crypto.rb +109 -0
  112. data/test/test_header_parsing.rb +168 -0
  113. data/test/test_helper.rb +7 -0
  114. data/test/test_message.rb +532 -0
  115. data/test/test_messages_dir.rb +147 -0
  116. data/test/test_yaml_migration.rb +85 -0
  117. data/test/test_yaml_regressions.rb +17 -0
  118. data/test/unit/service/test_label_service.rb +19 -0
  119. data/test/unit/test_horizontal_selector.rb +40 -0
  120. data/test/unit/util/test_query.rb +46 -0
  121. data/test/unit/util/test_string.rb +57 -0
  122. data/test/unit/util/test_uri.rb +19 -0
  123. metadata +423 -0
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'test_helper'
4
+ require 'sup'
5
+ require 'stringio'
6
+
7
+ require 'dummy_source'
8
+
9
+ # override File.exists? to make it work with StringIO for testing.
10
+ # FIXME: do aliasing to avoid breaking this when sup moves from
11
+ # File.exists? to File.exist?
12
+
13
+ class File
14
+
15
+ def File.exists? file
16
+ # puts "fake File::exists?"
17
+
18
+ if file.is_a?(StringIO)
19
+ return false
20
+ end
21
+ # use the different function
22
+ File.exist?(file)
23
+ end
24
+
25
+ end
26
+
27
+ module Redwood
28
+
29
+ class TestMessagesDir < ::Minitest::Unit::TestCase
30
+
31
+ def setup
32
+ @path = Dir.mktmpdir
33
+ Redwood::HookManager.init File.join(@path, 'hooks')
34
+ end
35
+
36
+ def teardown
37
+ Redwood::HookManager.deinstantiate!
38
+ FileUtils.rm_r @path
39
+ end
40
+
41
+ def test_binary_content_transfer_encoding
42
+ message = ''
43
+ File.open 'test/messages/binary-content-transfer-encoding-2.eml' do |f|
44
+ message = f.read
45
+ end
46
+
47
+ source = DummySource.new("sup-test://test_messages")
48
+ source.messages = [ message ]
49
+ source_info = 0
50
+
51
+ sup_message = Message.build_from_source(source, source_info)
52
+ sup_message.load_from_source!
53
+
54
+ from = sup_message.from
55
+ # "from" is just a simple person item
56
+
57
+ assert_equal("foo@example.org", from.email)
58
+ #assert_equal("Fake Sender", from.name)
59
+
60
+ subj = sup_message.subj
61
+ assert_equal("Important", subj)
62
+
63
+ chunks = sup_message.load_from_source!
64
+ indexable_chunks = sup_message.indexable_chunks
65
+
66
+ # there should be only one chunk
67
+ #assert_equal(1, chunks.length)
68
+
69
+ lines = chunks[0].lines
70
+
71
+ # lines should contain an error message
72
+ assert (lines.join.include? "An error occurred while loading this message."), "This message should not load successfully"
73
+ end
74
+
75
+ def test_bad_content_transfer_encoding
76
+ message = ''
77
+ File.open 'test/messages/bad-content-transfer-encoding-1.eml' do |f|
78
+ message = f.read
79
+ end
80
+
81
+ source = DummySource.new("sup-test://test_messages")
82
+ source.messages = [ message ]
83
+ source_info = 0
84
+
85
+ sup_message = Message.build_from_source(source, source_info)
86
+ sup_message.load_from_source!
87
+
88
+ from = sup_message.from
89
+ # "from" is just a simple person item
90
+
91
+ assert_equal("foo@example.org", from.email)
92
+ #assert_equal("Fake Sender", from.name)
93
+
94
+ subj = sup_message.subj
95
+ assert_equal("Content-Transfer-Encoding:-bug in sup", subj)
96
+
97
+ chunks = sup_message.load_from_source!
98
+ indexable_chunks = sup_message.indexable_chunks
99
+
100
+ # there should be only one chunk
101
+ #assert_equal(1, chunks.length)
102
+
103
+ lines = chunks[0].lines
104
+
105
+ # lines should contain an error message
106
+ assert (lines.join.include? "An error occurred while loading this message."), "This message should not load successfully"
107
+ end
108
+
109
+ def test_missing_line
110
+ message = ''
111
+ File.open 'test/messages/missing-line.eml' do |f|
112
+ message = f.read
113
+ end
114
+
115
+ source = DummySource.new("sup-test://test_messages")
116
+ source.messages = [ message ]
117
+ source_info = 0
118
+
119
+ sup_message = Message.build_from_source(source, source_info)
120
+ sup_message.load_from_source!
121
+
122
+ from = sup_message.from
123
+ # "from" is just a simple person item
124
+
125
+ assert_equal("foo@aol.com", from.email)
126
+ #assert_equal("Fake Sender", from.name)
127
+
128
+ subj = sup_message.subj
129
+ assert_equal("Encoding bug", subj)
130
+
131
+ chunks = sup_message.load_from_source!
132
+ indexable_chunks = sup_message.indexable_chunks
133
+
134
+ # there should be only one chunk
135
+ #assert_equal(1, chunks.length)
136
+
137
+ lines = chunks[0].lines
138
+
139
+ badline = lines[0]
140
+ assert (badline.display_length > 0), "The length of this line should greater than 0: #{badline}"
141
+
142
+ end
143
+ end
144
+
145
+ end
146
+
147
+ # vim:noai:ts=2:sw=2:
@@ -0,0 +1,85 @@
1
+ require "test_helper"
2
+
3
+ require "sup"
4
+ require "psych"
5
+
6
+ if RUBY_VERSION < "2.1"
7
+ describe "Sup's YAML util" do
8
+ describe "Module#yaml_properties" do
9
+ def build_class_with_name name, &b
10
+ Class.new do
11
+ meta_cls = class << self; self; end
12
+ meta_cls.send(:define_method, :name) { name }
13
+ class_exec(&b) unless b.nil?
14
+ end
15
+ end
16
+
17
+ after do
18
+ Psych.load_tags = {}
19
+ Psych.dump_tags = {}
20
+ end
21
+
22
+ it "defines YAML tag for class" do
23
+ cls = build_class_with_name 'Cls' do
24
+ yaml_properties
25
+ end
26
+
27
+ expected_yaml_tag = "!supmua.org,2006-10-01/Cls"
28
+
29
+ Psych.load_tags[expected_yaml_tag].must_equal cls
30
+ Psych.dump_tags[cls].must_equal expected_yaml_tag
31
+
32
+ end
33
+
34
+ it "Loads legacy YAML format as well" do
35
+ cls = build_class_with_name 'Cls' do
36
+ yaml_properties :id
37
+ attr_accessor :id
38
+ def initialize id
39
+ @id = id
40
+ end
41
+ end
42
+
43
+ Psych.load_tags["!masanjin.net,2006-10-01/Cls"].must_equal cls
44
+
45
+ yaml = <<EOF
46
+ --- !masanjin.net,2006-10-01/Cls
47
+ id: ID
48
+ EOF
49
+ loaded = YAML.load(yaml)
50
+
51
+ loaded.id.must_equal 'ID'
52
+ loaded.must_be_kind_of cls
53
+ end
54
+
55
+ it "Dumps & loads w/ state re-initialized" do
56
+ cls = build_class_with_name 'Cls' do
57
+ yaml_properties :id
58
+ attr_accessor :id
59
+ attr_reader :flag
60
+
61
+ def initialize id
62
+ @id = id
63
+ @flag = true
64
+ end
65
+ end
66
+
67
+ instance = cls.new 'ID'
68
+
69
+ dumped = YAML.dump(instance)
70
+ loaded = YAML.load(dumped)
71
+
72
+ dumped.must_equal <<-EOF
73
+ --- !supmua.org,2006-10-01/Cls
74
+ id: ID
75
+ EOF
76
+
77
+ loaded.id.must_equal 'ID'
78
+ assert loaded.flag
79
+ end
80
+ end
81
+ end
82
+
83
+ else
84
+ puts "Some YAML tests are skipped on Ruby 2.1.0 and newer."
85
+ end
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ # Requiring 'yaml' before 'sup' in 1.9.x would get Psych loaded first
4
+ # and becoming the default yamler.
5
+ require 'yaml'
6
+ require 'sup'
7
+
8
+ module Redwood
9
+ class TestYamlRegressions < ::Minitest::Unit::TestCase
10
+ def test_yamling_hash
11
+ hsh = {:foo => 42}
12
+ reloaded = YAML.load(hsh.to_yaml)
13
+
14
+ assert_equal reloaded, hsh
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ require "test_helper"
2
+
3
+ require "sup/service/label_service"
4
+
5
+ describe Redwood::LabelService do
6
+ describe "#add_labels" do
7
+ it "add labels to all messages matching the query" do
8
+ q = 'is:starred'
9
+ label = 'superstarred'
10
+ message = mock!.add_label(label).subject
11
+ index = mock!.find_messages(q){ [message] }.subject
12
+ mock(index).update_message_state(message)
13
+ mock(index).save_index
14
+
15
+ service = Redwood::LabelService.new(index)
16
+ service.add_labels q, label
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,40 @@
1
+ require "test_helper"
2
+
3
+ require "sup/horizontal_selector"
4
+
5
+ describe Redwood::HorizontalSelector do
6
+ let(:values) { %w[foo@example.com bar@example.com] }
7
+ let(:strange_value) { "strange@example.com" }
8
+
9
+ before do
10
+ @selector = Redwood::HorizontalSelector.new(
11
+ 'Acc:', values, [])
12
+ end
13
+
14
+ it "init w/ the first value selected" do
15
+ first_value = values.first
16
+ @selector.val.must_equal first_value
17
+ end
18
+
19
+ it "stores value for selection" do
20
+ second_value = values[1]
21
+ @selector.set_to second_value
22
+ @selector.val.must_equal second_value
23
+ end
24
+
25
+ describe "for unknown value" do
26
+ it "cannot select unknown value" do
27
+ @selector.wont_be :can_set_to?, strange_value
28
+ end
29
+
30
+ it "refuses selecting unknown value" do
31
+ old_value = @selector.val
32
+
33
+ assert_raises Redwood::HorizontalSelector::UnknownValue do
34
+ @selector.set_to strange_value
35
+ end
36
+
37
+ @selector.val.must_equal old_value
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+
3
+ require "test_helper"
4
+
5
+ require "sup/util/query"
6
+ require "xapian"
7
+
8
+ describe Redwood::Util::Query do
9
+ describe ".describe" do
10
+ it "returns a UTF-8 description of query" do
11
+ query = Xapian::Query.new "テスト"
12
+ life = "生活: "
13
+
14
+ assert_raises Encoding::CompatibilityError do
15
+ _ = life + query.description
16
+ end
17
+
18
+ desc = Redwood::Util::Query.describe(query)
19
+ _ = (life + desc) # No exception thrown
20
+ end
21
+
22
+ it "returns a valid UTF-8 description of bad input" do
23
+ msg = "asdfa \xc3\x28 åasdf"
24
+ query = Xapian::Query.new msg
25
+ life = 'hæi'
26
+
27
+ # this is now possibly UTF-8 string with possibly invalid chars
28
+ assert_raises Redwood::Util::Query::QueryDescriptionError do
29
+ desc = Redwood::Util::Query.describe (query)
30
+ end
31
+
32
+ assert_raises Encoding::CompatibilityError do
33
+ _ = life + query.description
34
+ end
35
+ end
36
+
37
+ it "returns a valid UTF-8 fallback description of bad input" do
38
+ msg = "asdfa \xc3\x28 åasdf"
39
+ query = Xapian::Query.new msg
40
+
41
+ desc = Redwood::Util::Query.describe(query, "invalid query")
42
+
43
+ assert_equal("invalid query", desc)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+
3
+ require "test_helper"
4
+
5
+ require "sup/util"
6
+
7
+ describe "Sup's String extension" do
8
+ describe "#display_length" do
9
+ let :data do
10
+ [
11
+ ['some words', 10,],
12
+ ['中文', 4,],
13
+ ['ä', 1,],
14
+ ]
15
+ end
16
+
17
+ it "calculates display length of a string" do
18
+ data.each do |(str, length)|
19
+ str.display_length.must_equal length
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "#slice_by_display_length(len)" do
25
+ let :data do
26
+ [
27
+ ['some words', 6, 'some w'],
28
+ ['中文', 2, '中'],
29
+ ['älpha', 3, 'älp'],
30
+ ]
31
+ end
32
+
33
+ it "slices string by display length" do
34
+ data.each do |(str, length, sliced)|
35
+ str.slice_by_display_length(length).must_equal sliced
36
+ end
37
+ end
38
+ end
39
+
40
+ describe "#wrap" do
41
+ let :data do
42
+ [
43
+ ['some words', 6, ['some', 'words']],
44
+ ['some words', 80, ['some words']],
45
+ ['中文', 2, ['中', '文']],
46
+ ['中文', 5, ['中文']],
47
+ ['älpha', 3, ['älp', 'ha']],
48
+ ]
49
+ end
50
+
51
+ it "wraps string by display length" do
52
+ data.each do |(str, length, wrapped)|
53
+ str.wrap(length).must_equal wrapped
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,19 @@
1
+ require "test_helper.rb"
2
+
3
+ require "sup/util/uri"
4
+
5
+ describe Redwood::Util::Uri do
6
+ describe ".build" do
7
+ it "builds uri from hash" do
8
+ components = {:path => "/var/mail/foo", :scheme => "mbox"}
9
+ uri = Redwood::Util::Uri.build(components)
10
+ uri.to_s.must_equal "mbox:/var/mail/foo"
11
+ end
12
+
13
+ it "expands ~ in path" do
14
+ components = {:path => "~/foo", :scheme => "maildir"}
15
+ uri = Redwood::Util::Uri.build(components)
16
+ uri.to_s.must_equal "maildir:#{ENV["HOME"]}/foo"
17
+ end
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,423 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sup
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.19.0
5
+ platform: ruby
6
+ authors:
7
+ - William Morgan
8
+ - Gaute Hope
9
+ - Hamish Downer
10
+ - Matthieu Rakotojaona
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2014-07-05 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: xapian-ruby
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: 1.2.15
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 1.2.15
30
+ - !ruby/object:Gem::Dependency
31
+ name: ncursesw
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - "~>"
35
+ - !ruby/object:Gem::Version
36
+ version: 1.4.0
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: 1.4.0
44
+ - !ruby/object:Gem::Dependency
45
+ name: rmail-sup
46
+ requirement: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: 1.0.1
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: 1.0.1
58
+ - !ruby/object:Gem::Dependency
59
+ name: highline
60
+ requirement: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ - !ruby/object:Gem::Dependency
73
+ name: trollop
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '1.12'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '1.12'
86
+ - !ruby/object:Gem::Dependency
87
+ name: lockfile
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ type: :runtime
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ - !ruby/object:Gem::Dependency
101
+ name: mime-types
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '1.0'
107
+ type: :runtime
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '1.0'
114
+ - !ruby/object:Gem::Dependency
115
+ name: locale
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '2.0'
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '2.0'
128
+ - !ruby/object:Gem::Dependency
129
+ name: chronic
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: 0.9.1
135
+ type: :runtime
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: 0.9.1
142
+ - !ruby/object:Gem::Dependency
143
+ name: unicode
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: 0.4.4
149
+ type: :runtime
150
+ prerelease: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: 0.4.4
156
+ - !ruby/object:Gem::Dependency
157
+ name: bundler
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '1.3'
163
+ type: :development
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: '1.3'
170
+ - !ruby/object:Gem::Dependency
171
+ name: rake
172
+ requirement: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ type: :development
178
+ prerelease: false
179
+ version_requirements: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ - !ruby/object:Gem::Dependency
185
+ name: minitest
186
+ requirement: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - "~>"
189
+ - !ruby/object:Gem::Version
190
+ version: '4.7'
191
+ type: :development
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - "~>"
196
+ - !ruby/object:Gem::Version
197
+ version: '4.7'
198
+ - !ruby/object:Gem::Dependency
199
+ name: rr
200
+ requirement: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - "~>"
203
+ - !ruby/object:Gem::Version
204
+ version: 1.0.5
205
+ type: :development
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - "~>"
210
+ - !ruby/object:Gem::Version
211
+ version: 1.0.5
212
+ - !ruby/object:Gem::Dependency
213
+ name: gpgme
214
+ requirement: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: 2.0.2
219
+ type: :development
220
+ prerelease: false
221
+ version_requirements: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: 2.0.2
226
+ description: |2
227
+ Sup is a console-based email client for people with a lot of email.
228
+
229
+ * GMail-like thread-centered archiving, tagging and muting
230
+ * Handling mail from multiple mbox and Maildir sources
231
+ * Blazing fast full-text search with a rich query language
232
+ * Multiple accounts - pick the right one when sending mail
233
+ * Ruby-programmable hooks
234
+ * Automatically tracking recent contacts
235
+ email: supmua@googlegroups.com
236
+ executables:
237
+ - sup
238
+ - sup-add
239
+ - sup-config
240
+ - sup-dump
241
+ - sup-import-dump
242
+ - sup-psych-ify-config-files
243
+ - sup-recover-sources
244
+ - sup-sync
245
+ - sup-sync-back-maildir
246
+ - sup-tweak-labels
247
+ extensions: []
248
+ extra_rdoc_files: []
249
+ files:
250
+ - ".gitignore"
251
+ - ".travis.yml"
252
+ - CONTRIBUTORS
253
+ - Gemfile
254
+ - HACKING
255
+ - History.txt
256
+ - LICENSE
257
+ - README.md
258
+ - Rakefile
259
+ - ReleaseNotes
260
+ - bin/sup
261
+ - bin/sup-add
262
+ - bin/sup-config
263
+ - bin/sup-dump
264
+ - bin/sup-import-dump
265
+ - bin/sup-psych-ify-config-files
266
+ - bin/sup-recover-sources
267
+ - bin/sup-sync
268
+ - bin/sup-sync-back-maildir
269
+ - bin/sup-tweak-labels
270
+ - contrib/colorpicker.rb
271
+ - contrib/completion/_sup.zsh
272
+ - devel/console.sh
273
+ - devel/count-loc.sh
274
+ - devel/load-index.rb
275
+ - devel/profile.rb
276
+ - devel/start-console.rb
277
+ - doc/FAQ.txt
278
+ - doc/Hooks.txt
279
+ - doc/Philosophy.txt
280
+ - lib/sup.rb
281
+ - lib/sup/account.rb
282
+ - lib/sup/buffer.rb
283
+ - lib/sup/colormap.rb
284
+ - lib/sup/contact.rb
285
+ - lib/sup/crypto.rb
286
+ - lib/sup/draft.rb
287
+ - lib/sup/hook.rb
288
+ - lib/sup/horizontal_selector.rb
289
+ - lib/sup/idle.rb
290
+ - lib/sup/index.rb
291
+ - lib/sup/interactive_lock.rb
292
+ - lib/sup/keymap.rb
293
+ - lib/sup/label.rb
294
+ - lib/sup/logger.rb
295
+ - lib/sup/logger/singleton.rb
296
+ - lib/sup/maildir.rb
297
+ - lib/sup/mbox.rb
298
+ - lib/sup/message.rb
299
+ - lib/sup/message_chunks.rb
300
+ - lib/sup/mode.rb
301
+ - lib/sup/modes/buffer_list_mode.rb
302
+ - lib/sup/modes/completion_mode.rb
303
+ - lib/sup/modes/compose_mode.rb
304
+ - lib/sup/modes/console_mode.rb
305
+ - lib/sup/modes/contact_list_mode.rb
306
+ - lib/sup/modes/edit_message_async_mode.rb
307
+ - lib/sup/modes/edit_message_mode.rb
308
+ - lib/sup/modes/file_browser_mode.rb
309
+ - lib/sup/modes/forward_mode.rb
310
+ - lib/sup/modes/help_mode.rb
311
+ - lib/sup/modes/inbox_mode.rb
312
+ - lib/sup/modes/label_list_mode.rb
313
+ - lib/sup/modes/label_search_results_mode.rb
314
+ - lib/sup/modes/line_cursor_mode.rb
315
+ - lib/sup/modes/log_mode.rb
316
+ - lib/sup/modes/person_search_results_mode.rb
317
+ - lib/sup/modes/poll_mode.rb
318
+ - lib/sup/modes/reply_mode.rb
319
+ - lib/sup/modes/resume_mode.rb
320
+ - lib/sup/modes/scroll_mode.rb
321
+ - lib/sup/modes/search_list_mode.rb
322
+ - lib/sup/modes/search_results_mode.rb
323
+ - lib/sup/modes/text_mode.rb
324
+ - lib/sup/modes/thread_index_mode.rb
325
+ - lib/sup/modes/thread_view_mode.rb
326
+ - lib/sup/person.rb
327
+ - lib/sup/poll.rb
328
+ - lib/sup/rfc2047.rb
329
+ - lib/sup/search.rb
330
+ - lib/sup/sent.rb
331
+ - lib/sup/service/label_service.rb
332
+ - lib/sup/source.rb
333
+ - lib/sup/tagger.rb
334
+ - lib/sup/textfield.rb
335
+ - lib/sup/thread.rb
336
+ - lib/sup/time.rb
337
+ - lib/sup/undo.rb
338
+ - lib/sup/update.rb
339
+ - lib/sup/util.rb
340
+ - lib/sup/util/ncurses.rb
341
+ - lib/sup/util/path.rb
342
+ - lib/sup/util/query.rb
343
+ - lib/sup/util/uri.rb
344
+ - lib/sup/version.rb
345
+ - sup.gemspec
346
+ - test/dummy_source.rb
347
+ - test/gnupg_test_home/gpg.conf
348
+ - test/gnupg_test_home/pubring.gpg
349
+ - test/gnupg_test_home/receiver_pubring.gpg
350
+ - test/gnupg_test_home/receiver_secring.gpg
351
+ - test/gnupg_test_home/receiver_trustdb.gpg
352
+ - test/gnupg_test_home/secring.gpg
353
+ - test/gnupg_test_home/sup-test-2@foo.bar.asc
354
+ - test/gnupg_test_home/trustdb.gpg
355
+ - test/integration/test_label_service.rb
356
+ - test/messages/bad-content-transfer-encoding-1.eml
357
+ - test/messages/binary-content-transfer-encoding-2.eml
358
+ - test/messages/missing-line.eml
359
+ - test/test_crypto.rb
360
+ - test/test_header_parsing.rb
361
+ - test/test_helper.rb
362
+ - test/test_message.rb
363
+ - test/test_messages_dir.rb
364
+ - test/test_yaml_migration.rb
365
+ - test/test_yaml_regressions.rb
366
+ - test/unit/service/test_label_service.rb
367
+ - test/unit/test_horizontal_selector.rb
368
+ - test/unit/util/test_query.rb
369
+ - test/unit/util/test_string.rb
370
+ - test/unit/util/test_uri.rb
371
+ homepage: http://supmua.org
372
+ licenses:
373
+ - GPL-2
374
+ metadata: {}
375
+ post_install_message: |
376
+ SUP: please note that our old mailing lists have been shut down,
377
+ re-subscribe to supmua@googlegroups.com to discuss and follow
378
+ updates on sup (send email to: supmua+subscribe@googlegroups.com).
379
+ rdoc_options: []
380
+ require_paths:
381
+ - lib
382
+ required_ruby_version: !ruby/object:Gem::Requirement
383
+ requirements:
384
+ - - ">="
385
+ - !ruby/object:Gem::Version
386
+ version: 1.9.3
387
+ required_rubygems_version: !ruby/object:Gem::Requirement
388
+ requirements:
389
+ - - ">="
390
+ - !ruby/object:Gem::Version
391
+ version: '0'
392
+ requirements: []
393
+ rubyforge_project:
394
+ rubygems_version: 2.2.2
395
+ signing_key:
396
+ specification_version: 4
397
+ summary: A console-based email client with the best features of GMail, mutt and Emacs
398
+ test_files:
399
+ - test/dummy_source.rb
400
+ - test/gnupg_test_home/gpg.conf
401
+ - test/gnupg_test_home/pubring.gpg
402
+ - test/gnupg_test_home/receiver_pubring.gpg
403
+ - test/gnupg_test_home/receiver_secring.gpg
404
+ - test/gnupg_test_home/receiver_trustdb.gpg
405
+ - test/gnupg_test_home/secring.gpg
406
+ - test/gnupg_test_home/sup-test-2@foo.bar.asc
407
+ - test/gnupg_test_home/trustdb.gpg
408
+ - test/integration/test_label_service.rb
409
+ - test/messages/bad-content-transfer-encoding-1.eml
410
+ - test/messages/binary-content-transfer-encoding-2.eml
411
+ - test/messages/missing-line.eml
412
+ - test/test_crypto.rb
413
+ - test/test_header_parsing.rb
414
+ - test/test_helper.rb
415
+ - test/test_message.rb
416
+ - test/test_messages_dir.rb
417
+ - test/test_yaml_migration.rb
418
+ - test/test_yaml_regressions.rb
419
+ - test/unit/service/test_label_service.rb
420
+ - test/unit/test_horizontal_selector.rb
421
+ - test/unit/util/test_query.rb
422
+ - test/unit/util/test_string.rb
423
+ - test/unit/util/test_uri.rb