sup 0.19.0

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.
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