stickyflag 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/.gitignore +7 -0
  2. data/.rspec +4 -0
  3. data/.simplecov +9 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE.md +7 -0
  7. data/README.md +49 -0
  8. data/Rakefile +19 -0
  9. data/TODO.md +3 -0
  10. data/bin/stickyflag +6 -0
  11. data/features/clear.feature +14 -0
  12. data/features/clear_quietly.feature +23 -0
  13. data/features/configuration.feature +14 -0
  14. data/features/get.feature +14 -0
  15. data/features/get_quietly.feature +23 -0
  16. data/features/set.feature +14 -0
  17. data/features/set_quietly.feature +22 -0
  18. data/features/step_definitions/configuration_steps.rb +31 -0
  19. data/features/step_definitions/database_steps.rb +41 -0
  20. data/features/step_definitions/pending_steps.rb +5 -0
  21. data/features/step_definitions/tag_steps.rb +62 -0
  22. data/features/support/cukegem.rb +82 -0
  23. data/features/support/env.rb +37 -0
  24. data/features/tags.feature +18 -0
  25. data/features/unset.feature +14 -0
  26. data/features/unset_quietly.feature +23 -0
  27. data/lib/stickyflag/configuration.rb +66 -0
  28. data/lib/stickyflag/database.rb +162 -0
  29. data/lib/stickyflag/external_cmds.rb +64 -0
  30. data/lib/stickyflag/patches/tempfile_encoding.rb +22 -0
  31. data/lib/stickyflag/patches/tmpnam.rb +38 -0
  32. data/lib/stickyflag/paths.rb +47 -0
  33. data/lib/stickyflag/tag_factory.rb +108 -0
  34. data/lib/stickyflag/tags/c.rb +25 -0
  35. data/lib/stickyflag/tags/mmd.rb +168 -0
  36. data/lib/stickyflag/tags/pdf.rb +119 -0
  37. data/lib/stickyflag/tags/png.rb +61 -0
  38. data/lib/stickyflag/tags/source_code.rb +99 -0
  39. data/lib/stickyflag/tags/tex.rb +25 -0
  40. data/lib/stickyflag/version.rb +12 -0
  41. data/lib/stickyflag.rb +253 -0
  42. data/spec/spec_helper.rb +22 -0
  43. data/spec/stickyflag/configuration_spec.rb +132 -0
  44. data/spec/stickyflag/database_spec.rb +331 -0
  45. data/spec/stickyflag/external_cmds_spec.rb +175 -0
  46. data/spec/stickyflag/patches/tempfile_encoding_spec.rb +26 -0
  47. data/spec/stickyflag/patches/tmpnam_spec.rb +35 -0
  48. data/spec/stickyflag/paths_spec.rb +29 -0
  49. data/spec/stickyflag/tag_factory_spec.rb +185 -0
  50. data/spec/stickyflag/tags/c_spec.rb +14 -0
  51. data/spec/stickyflag/tags/mmd_spec.rb +40 -0
  52. data/spec/stickyflag/tags/pdf_spec.rb +39 -0
  53. data/spec/stickyflag/tags/png_spec.rb +6 -0
  54. data/spec/stickyflag/tags/tex_spec.rb +6 -0
  55. data/spec/stickyflag_spec.rb +482 -0
  56. data/spec/support/examples/c_all_comments.c +3 -0
  57. data/spec/support/examples/c_no_tags.c +5 -0
  58. data/spec/support/examples/c_with_tag.c +6 -0
  59. data/spec/support/examples/mmd_all_meta.mmd +6 -0
  60. data/spec/support/examples/mmd_crazy_keys.mmd +8 -0
  61. data/spec/support/examples/mmd_crazy_tags.mmd +9 -0
  62. data/spec/support/examples/mmd_no_tags.mmd +1 -0
  63. data/spec/support/examples/mmd_with_tag.mmd +3 -0
  64. data/spec/support/examples/pdf_no_tags.pdf +0 -0
  65. data/spec/support/examples/pdf_with_tag.pdf +0 -0
  66. data/spec/support/examples/png_no_tags.png +0 -0
  67. data/spec/support/examples/png_with_tag.png +0 -0
  68. data/spec/support/examples/tex_no_tags.tex +10 -0
  69. data/spec/support/examples/tex_with_tag.tex +11 -0
  70. data/spec/support/examples/untaggable.txt +0 -0
  71. data/spec/support/examples.rb +32 -0
  72. data/spec/support/run_with_args.rb +36 -0
  73. data/spec/support/silence_stream.rb +12 -0
  74. data/spec/support/tag_handler_behavior.rb +125 -0
  75. data/stickyflag.gemspec +48 -0
  76. metadata +399 -0
@@ -0,0 +1,132 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'stickyflag/paths'
3
+ require 'stickyflag/configuration'
4
+
5
+ class ConfigTester < Thor
6
+ include StickyFlag::Paths
7
+ include StickyFlag::Configuration
8
+ end
9
+
10
+ describe 'StickyFlag::Configuration' do
11
+ describe '#initialize' do
12
+ it 'loads default configuration values' do
13
+ @obj = ConfigTester.new
14
+ @obj.stub(:load_config!) { }
15
+ @obj.stub(:save_config!) { }
16
+
17
+ StickyFlag::Configuration::DEFAULT_CONFIG.keys.each do |k|
18
+ @obj.get_config(k).should eq(StickyFlag::Configuration::DEFAULT_CONFIG[k])
19
+ end
20
+ end
21
+ end
22
+
23
+ describe '.get_config' do
24
+ before(:each) do
25
+ @obj = ConfigTester.new
26
+
27
+ @obj.stub(:load_config!) { }
28
+ @obj.stub(:save_config!) { }
29
+ end
30
+
31
+ context 'with good keys' do
32
+ it 'reads default values' do
33
+ @obj.get_config(:have_pdftk).should eq(false)
34
+ end
35
+
36
+ it 'reads updated values' do
37
+ @obj.set_config :have_pdftk, true
38
+ @obj.get_config(:have_pdftk).should eq(true)
39
+ end
40
+ end
41
+
42
+ context 'with bad keys' do
43
+ it 'raises an error on get' do
44
+ expect { @obj.get_config(:bad_key) }.to raise_error
45
+ end
46
+
47
+ it 'raises an error on set' do
48
+ expect { @obj.set_config(:bad_key, 'test') }.to raise_error
49
+ end
50
+ end
51
+ end
52
+
53
+ describe '.reset_config!' do
54
+ before(:each) do
55
+ @obj = ConfigTester.new
56
+
57
+ @obj.stub(:load_config!) { }
58
+ @obj.stub(:save_config!) { }
59
+
60
+ @obj.set_config :have_pdftk, true
61
+ end
62
+
63
+ it 'resets changed values to defaults' do
64
+ @obj.reset_config!
65
+ @obj.get_config(:have_pdftk).should eq(false)
66
+ end
67
+ end
68
+
69
+ describe '.dump_config' do
70
+ before(:each) do
71
+ @obj = ConfigTester.new
72
+
73
+ @obj.stub(:load_config!) { }
74
+ @obj.stub(:save_config!) { }
75
+
76
+ @obj.set_config :pdftk_path, 'wut'
77
+ end
78
+
79
+ it 'prints out the set configuration values' do
80
+ @obj.stub(:say) {}
81
+ @obj.should_receive(:say).with(/pdftk_path: 'wut'/)
82
+ @obj.dump_config
83
+ end
84
+ end
85
+
86
+ describe '.load_config!' do
87
+ before(:each) do
88
+ @obj = ConfigTester.new
89
+
90
+ @obj.stub(:save_config!) { }
91
+
92
+ @config_file = File.join(File.dirname(__FILE__), 'config.yml')
93
+ @obj.stub(:config_path) { @config_file }
94
+ end
95
+
96
+ it 'should load from the requested YAML file' do
97
+ config = {
98
+ :have_pdftk => true,
99
+ :pdftk_path => 'wut'
100
+ }
101
+ File.open(@config_file, 'w:UTF-8') do |f|
102
+ YAML.dump(config, f)
103
+ end
104
+
105
+ @obj.load_config!
106
+ @obj.get_config(:pdftk_path).should eq('wut')
107
+
108
+ File.delete(@config_file)
109
+ end
110
+ end
111
+
112
+ describe '.save_config!' do
113
+ before(:each) do
114
+ @obj = ConfigTester.new
115
+
116
+ @obj.stub(:load_config!) { }
117
+
118
+ @config_file = File.join(File.dirname(__FILE__), 'config.yml')
119
+ @obj.stub(:config_path) { @config_file }
120
+ end
121
+
122
+ it 'should save to the requested YAML file' do
123
+ @obj.set_config :pdftk_path, 'wut'
124
+ @obj.save_config!
125
+
126
+ config = YAML::load(File.open(@config_file, 'r:UTF-8'))
127
+ config[:pdftk_path].should eq('wut')
128
+
129
+ File.delete(@config_file)
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,331 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'stickyflag/paths'
3
+ require 'stickyflag/configuration'
4
+ require 'stickyflag/external_cmds'
5
+ require 'stickyflag/tag_factory'
6
+ require 'stickyflag/database'
7
+
8
+ class DatabaseTester < Thor
9
+ include StickyFlag::Paths
10
+ include StickyFlag::Configuration
11
+ include StickyFlag::ExternalCmds
12
+ include StickyFlag::TagFactory
13
+ include StickyFlag::Database
14
+ end
15
+
16
+ describe 'StickyFlag::Database' do
17
+ before(:each) do
18
+ @obj = DatabaseTester.new
19
+
20
+ @obj.stub(:load_config!) { }
21
+ @obj.stub(:save_config!) { }
22
+ @obj.stub(:database_path) { ":memory:" }
23
+
24
+ @obj.find_external_cmds
25
+ @obj.load_database
26
+
27
+ # Save this out for (lots of) later use
28
+ @database = @obj.instance_variable_get(:@database)
29
+ end
30
+
31
+ after(:each) do
32
+ # We've disabled automatic cleanup, so make sure we do this
33
+ @database.disconnect
34
+ end
35
+
36
+ describe '.load_database' do
37
+ it 'sets the member variable' do
38
+ @database.should be
39
+ end
40
+ end
41
+
42
+ describe '.update_database_from_files' do
43
+ context 'without a specific directory' do
44
+ before(:each) do
45
+ @obj.update_database_from_files
46
+ end
47
+
48
+ it 'has some files in the database' do
49
+ @database[:tagged_files].should_not be_empty
50
+ end
51
+
52
+ it 'has found the test and asdf tags' do
53
+ @obj.tag_list.should include('asdf')
54
+ @obj.tag_list.should include('test')
55
+ end
56
+
57
+ it 'has found a sample markdown file' do
58
+ path = example_path 'mmd_crazy_keys.mmd'
59
+ @obj.files_for_tags(['test']).map { |f| File.expand_path(f) }.should include(path)
60
+ end
61
+ end
62
+
63
+ context 'with an empty directory' do
64
+ before(:each) do
65
+ @dir = File.tmpnam('.dir')
66
+ Dir.mkdir(@dir)
67
+
68
+ @obj.update_database_from_files(@dir)
69
+ end
70
+
71
+ after(:each) do
72
+ Dir.rmdir(@dir)
73
+ end
74
+
75
+ it 'has no files in the database' do
76
+ @database[:tagged_files].should be_empty
77
+ end
78
+ end
79
+
80
+ context 'with some bad files in the directory' do
81
+ before(:each) do
82
+ @dir = File.tmpnam('.dir')
83
+ Dir.mkdir(@dir)
84
+
85
+ file = File.new(File.join(@dir, 'bad.pdf'), 'w:UTF-8')
86
+ file.puts('test bad')
87
+ file.close
88
+ end
89
+
90
+ after(:each) do
91
+ File.unlink(File.join(@dir, 'bad.pdf'))
92
+ Dir.rmdir(@dir)
93
+ end
94
+
95
+ it 'does not throw an exception' do
96
+ expect { @obj.update_database_from_files(@dir) }.to_not raise_error
97
+ end
98
+
99
+ it 'prints a warning' do
100
+ @obj.should_receive(:say_status).with(:warning, kind_of(String), kind_of(Symbol))
101
+ @obj.update_database_from_files(@dir)
102
+ end
103
+ end
104
+
105
+ context 'with a full directory' do
106
+ before(:each) do
107
+ @obj.update_database_from_files(example_root)
108
+ end
109
+
110
+ it 'has some files in the database' do
111
+ @database[:tagged_files].should_not be_empty
112
+ end
113
+
114
+ it 'has found the test and asdf tags' do
115
+ @obj.tag_list.should include('asdf')
116
+ @obj.tag_list.should include('test')
117
+ end
118
+
119
+ it 'has found a sample markdown file' do
120
+ path = example_path 'mmd_crazy_keys.mmd'
121
+ @obj.files_for_tags(['test']).map { |f| File.expand_path(f) }.should include(path)
122
+ end
123
+ end
124
+ end
125
+
126
+ describe '.set_database_tag' do
127
+ context 'with an already extant tag' do
128
+ before(:each) do
129
+ @obj.update_database_from_files example_root
130
+ @path = example_path 'mmd_with_tag.mmd'
131
+ @obj.set_database_tag(@path, 'asdf')
132
+ end
133
+
134
+ it "adds the record for the tagged file" do
135
+ file_id = @database[:file_list].where(:file_name => @path).get(:id)
136
+ file_id.should_not be_nil
137
+
138
+ tag_id = @database[:tag_list].where(:tag_name => 'asdf').get(:id)
139
+ tag_id.should_not be_nil
140
+
141
+ ds = @database[:tagged_files].where(:file => file_id).and(:tag => tag_id)
142
+ ds.should_not be_empty
143
+ ds.count.should eq(1)
144
+ end
145
+
146
+ it "doesn't duplicate the entry for the tag" do
147
+ ds = @database[:tag_list].where(:tag_name => 'asdf')
148
+ ds.count.should eq(1)
149
+ end
150
+ end
151
+
152
+ context 'with a new tag' do
153
+ before(:each) do
154
+ @obj.update_database_from_files example_root
155
+ @path = example_path 'mmd_with_tag.mmd'
156
+ @obj.set_database_tag(@path, 'zuzzax')
157
+ end
158
+
159
+ it "adds a new record for the new tag" do
160
+ ds = @database[:tag_list].where(:tag_name => 'zuzzax')
161
+ ds.should_not be_empty
162
+ ds.count.should eq(1)
163
+ end
164
+
165
+ it "adds the record for the tagged file" do
166
+ file_id = @database[:file_list].where(:file_name => @path).get(:id)
167
+ file_id.should_not be_nil
168
+
169
+ tag_id = @database[:tag_list].where(:tag_name => 'zuzzax').get(:id)
170
+ tag_id.should_not be_nil
171
+
172
+ ds = @database[:tagged_files].where(:file => file_id).and(:tag => tag_id)
173
+ ds.should_not be_empty
174
+ ds.count.should eq(1)
175
+ end
176
+ end
177
+ end
178
+
179
+ describe '.unset_database_tag' do
180
+ context 'with a multiply-present tag' do
181
+ before(:each) do
182
+ @obj.update_database_from_files example_root
183
+ @path = example_path 'mmd_with_tag.mmd'
184
+ end
185
+
186
+ it 'removes the record for the tagged file' do
187
+ @obj.unset_database_tag(@path, 'test')
188
+
189
+ file_id = @database[:file_list].where(:file_name => @path).get(:id)
190
+ file_id.should_not be_nil
191
+
192
+ tag_id = @database[:tag_list].where(:tag_name => 'test').get(:id)
193
+ tag_id.should_not be_nil
194
+
195
+ ds = @database[:tagged_files].where(:file => file_id).and(:tag => tag_id)
196
+ ds.should be_empty
197
+ end
198
+ end
199
+
200
+ context 'with a singly-present tag' do
201
+ before(:each) do
202
+ @obj.update_database_from_files example_root
203
+ @path = example_path 'mmd_crazy_tags.mmd'
204
+ end
205
+
206
+ it 'removes the record for the tagged file' do
207
+ file_id = @database[:file_list].where(:file_name => @path).get(:id)
208
+ file_id.should_not be_nil
209
+
210
+ tag_id = @database[:tag_list].where(:tag_name => 'qwer').get(:id)
211
+ tag_id.should_not be_nil
212
+
213
+ @obj.unset_database_tag(@path, 'qwer')
214
+
215
+ ds = @database[:tagged_files].where(:file => file_id).and(:tag => tag_id)
216
+ ds.should be_empty
217
+ end
218
+
219
+ it 'removes the record of the tag' do
220
+ @obj.unset_database_tag(@path, 'qwer')
221
+ ds = @database[:tag_list].where(:tag_name => 'qwer')
222
+ ds.should be_empty
223
+ end
224
+ end
225
+ end
226
+
227
+ describe '.clear_database_tags' do
228
+ before(:each) do
229
+ @obj.update_database_from_files example_root
230
+ @path = example_path 'mmd_crazy_tags.mmd'
231
+ @obj.clear_database_tags(@path)
232
+ end
233
+
234
+ it 'removes all tag records for the file' do
235
+ file_id = @database[:file_list].where(:file_name => @path).get(:id)
236
+ file_id.should_not be_nil
237
+
238
+ ds = @database[:tagged_files].where(:file => file_id)
239
+ ds.should be_empty
240
+ end
241
+
242
+ it 'removes the tag after clearing single-instance tags' do
243
+ ds = @database[:tag_list].where(:tag_name => 'qwer')
244
+ ds.should be_empty
245
+ end
246
+ end
247
+
248
+ describe '.files_for_tags' do
249
+ before(:each) do
250
+ @obj.update_database_from_files example_root
251
+ end
252
+
253
+ context 'with good, single tags' do
254
+ it 'includes one of the markdown files' do
255
+ path = example_path 'mmd_crazy_keys.mmd'
256
+ @obj.files_for_tags([ 'test' ]).should include(path)
257
+ end
258
+
259
+ it 'does not include files that lack a tag' do
260
+ path = example_path 'mmd_with_tag.mmd'
261
+ @obj.files_for_tags([ 'asdf' ]).should_not include(path)
262
+ end
263
+
264
+ it 'does not include untaggable files' do
265
+ path = example_path 'untaggable.txt'
266
+ @obj.files_for_tags([ 'test' ]).should_not include(path)
267
+ end
268
+ end
269
+
270
+ context 'with multiple tags' do
271
+ it 'combines with boolean AND' do
272
+ path1 = example_path 'mmd_crazy_tags.mmd'
273
+ path2 = example_path 'mmd_with_tag.mmd'
274
+
275
+ files = @obj.files_for_tags([ 'sdfg', 'asdf', 'qwer' ])
276
+ files.should include(path1)
277
+ files.should_not include(path2)
278
+ end
279
+
280
+ it 'prints a warning if no files have all those tags' do
281
+ @obj.should_receive(:say_status).with(:warning, kind_of(String), kind_of(Symbol))
282
+ @obj.files_for_tags([ 'asdf', 'test' ])
283
+ end
284
+
285
+ it 'returns an empty array if no files have all those tags' do
286
+ @obj.files_for_tags([ 'asdf', 'test' ]).should be_empty
287
+ end
288
+ end
289
+
290
+ context 'with missing tags' do
291
+ it "doesn't throw" do
292
+ expect { @obj.files_for_tags([ 'zuzzax' ]) }.to_not raise_error
293
+ end
294
+
295
+ it 'prints a warning' do
296
+ @obj.should_receive(:say_status).with(:warning, kind_of(String), kind_of(Symbol))
297
+ @obj.files_for_tags([ 'zuzzax' ])
298
+ end
299
+
300
+ it 'returns an empty array' do
301
+ @obj.files_for_tags([ 'zuzzax', 'test' ]).should be_empty
302
+ end
303
+ end
304
+ end
305
+
306
+ describe '.tag_list' do
307
+ context 'prior to loading anything into the database' do
308
+ it 'is empty' do
309
+ @obj.tag_list.should be_empty
310
+ end
311
+ end
312
+
313
+ context 'after loading files into the database' do
314
+ before(:each) do
315
+ @obj.update_database_from_files example_root
316
+ end
317
+
318
+ it 'includes multiply-present tags' do
319
+ @obj.tag_list.should include('test')
320
+ end
321
+
322
+ it 'includes singly-present tags' do
323
+ @obj.tag_list.should include('qwer')
324
+ end
325
+
326
+ it 'does not include absent tags' do
327
+ @obj.tag_list.should_not include('zuzzax')
328
+ end
329
+ end
330
+ end
331
+ end
@@ -0,0 +1,175 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'tmpdir'
3
+ require 'thor'
4
+ require 'stickyflag/paths'
5
+ require 'stickyflag/configuration'
6
+ require 'stickyflag/external_cmds'
7
+
8
+ class ExternalCmdsTester < Thor
9
+ include StickyFlag::Paths
10
+ include StickyFlag::Configuration
11
+ include StickyFlag::ExternalCmds
12
+ end
13
+
14
+ describe 'StickyFlag::ExternalCmds' do
15
+ # We want to handle the path manually here
16
+ def add_to_path(file_name)
17
+ ENV['PATH'] = Dir.tmpdir
18
+
19
+ path = File.join(Dir.tmpdir, file_name)
20
+ File.open(path, 'w:UTF-8') { |f| f.write('test') }
21
+ File.chmod(0755, path)
22
+
23
+ @files_to_delete << path
24
+ end
25
+
26
+ before(:each) do
27
+ @files_to_delete = []
28
+ @old_path = ENV['PATH']
29
+ ENV['PATH'] = ''
30
+ end
31
+
32
+ after(:each) do
33
+ ENV['PATH'] = @old_path
34
+ @files_to_delete.each { |f| File.delete f }
35
+ end
36
+
37
+ describe '.find_external_cmds' do
38
+ describe 'with no configuration set, no pdftk' do
39
+ before(:each) do
40
+ @obj = ExternalCmdsTester.new
41
+ @obj.stub(:load_config!) { }
42
+ @obj.stub(:save_config!) { }
43
+
44
+ @obj.set_config :pdftk_path, ''
45
+ @obj.set_config :have_pdftk, false
46
+ end
47
+
48
+ it 'sets have_pdftk to false' do
49
+ @obj.find_external_cmds
50
+ @obj.get_config(:have_pdftk).should eq(false)
51
+ end
52
+
53
+ it 'outputs a warning message' do
54
+ @obj.should_receive(:say_status).with(:warning, kind_of(String), kind_of(Symbol))
55
+ @obj.find_external_cmds
56
+ end
57
+ end
58
+
59
+ describe 'with no configuration set, with pdftk' do
60
+ before(:each) do
61
+ @obj = ExternalCmdsTester.new
62
+ @obj.stub(:load_config!) { }
63
+ @obj.stub(:save_config!) { }
64
+
65
+ @obj.set_config :pdftk_path, ''
66
+ @obj.set_config :have_pdftk, false
67
+
68
+ add_to_path('pdftk')
69
+ end
70
+
71
+ it 'sets have_pdftk to true' do
72
+ @obj.find_external_cmds
73
+ @obj.get_config(:have_pdftk).should eq(true)
74
+ end
75
+
76
+ it 'sets the right pdftk path' do
77
+ @obj.find_external_cmds
78
+
79
+ path = File.expand_path(File.join(Dir.tmpdir, 'pdftk'))
80
+ @obj.get_config(:pdftk_path).should eq(path)
81
+ end
82
+
83
+ it 'should not print any messages' do
84
+ @obj.should_not_receive(:say)
85
+ @obj.should_not_receive(:say_status)
86
+ @obj.find_external_cmds
87
+ end
88
+ end
89
+
90
+ describe 'with configuration set, non-executable pdftk' do
91
+ before(:each) do
92
+ @obj = ExternalCmdsTester.new
93
+ @obj.stub(:load_config!) { }
94
+ @obj.stub(:save_config!) { }
95
+
96
+ @obj.set_config :pdftk_path, __FILE__
97
+ @obj.set_config :have_pdftk, true
98
+ end
99
+
100
+ it 'resets have_pdftk to false' do
101
+ @obj.find_external_cmds
102
+ @obj.get_config(:have_pdftk).should be(false)
103
+ end
104
+
105
+ it 'unsets the pdftk path' do
106
+ @obj.find_external_cmds
107
+ @obj.get_config(:pdftk_path).should eq('')
108
+ end
109
+
110
+ it 'prints out an error message' do
111
+ @obj.stub(:say_status) {}
112
+ @obj.should_receive(:say_status).with(:error, kind_of(String), kind_of(Symbol))
113
+ @obj.find_external_cmds
114
+ end
115
+ end
116
+
117
+ describe 'with configuration set, non-existent pdftk' do
118
+ before(:each) do
119
+ @obj = ExternalCmdsTester.new
120
+ @obj.stub(:load_config!) { }
121
+ @obj.stub(:save_config!) { }
122
+
123
+ @obj.set_config :pdftk_path, '/nope/wut'
124
+ @obj.set_config :have_pdftk, true
125
+ end
126
+
127
+ it 'resets have_pdftk to false' do
128
+ @obj.find_external_cmds
129
+ @obj.get_config(:have_pdftk).should be(false)
130
+ end
131
+
132
+ it 'unsets the pdftk path' do
133
+ @obj.find_external_cmds
134
+ @obj.get_config(:pdftk_path).should eq('')
135
+ end
136
+
137
+ it 'prints out an error message' do
138
+ @obj.stub(:say_status) {}
139
+ @obj.should_receive(:say_status).with(:error, kind_of(String), kind_of(Symbol))
140
+ @obj.find_external_cmds
141
+ end
142
+ end
143
+
144
+ describe 'with configuration set, with pdftk' do
145
+ before(:each) do
146
+ @obj = ExternalCmdsTester.new
147
+ @obj.stub(:load_config!) { }
148
+ @obj.stub(:save_config!) { }
149
+
150
+ @obj.set_config :pdftk_path, File.expand_path(File.join(Dir.tmpdir, 'pdftk'))
151
+ @obj.set_config :have_pdftk, true
152
+
153
+ add_to_path('pdftk')
154
+ end
155
+
156
+ it 'leaves have_pdftk true' do
157
+ @obj.find_external_cmds
158
+ @obj.get_config(:have_pdftk).should eq(true)
159
+ end
160
+
161
+ it 'leaves the right pdftk path' do
162
+ @obj.find_external_cmds
163
+
164
+ path = File.expand_path(File.join(Dir.tmpdir, 'pdftk'))
165
+ @obj.get_config(:pdftk_path).should eq(path)
166
+ end
167
+
168
+ it 'should not print any messages' do
169
+ @obj.should_not_receive(:say)
170
+ @obj.should_not_receive(:say_status)
171
+ @obj.find_external_cmds
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'stickyflag/patches/tempfile_encoding'
3
+
4
+ describe 'Tempfile' do
5
+ describe '.new_with_encoding' do
6
+ it 'successfully creates temporary files' do
7
+ f = Tempfile.new_with_encoding 'asdf'
8
+ f.should be
9
+
10
+ f.unlink
11
+ f.close
12
+ end
13
+
14
+ # JRuby <1.7.0 implements Ruby 1.9 but doesn't follow the spec for Tempfile
15
+ if RUBY_VERSION >= "1.9.0" && (RUBY_PLATFORM != 'java' || JRUBY_VERSION >= '1.7.0')
16
+ it 'sets the correct external encoding' do
17
+ f = Tempfile.new_with_encoding 'asdf'
18
+ f.external_encoding.should be
19
+ f.external_encoding.name.should eq('UTF-8')
20
+
21
+ f.unlink
22
+ f.close
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'fileutils'
3
+ require 'stickyflag/patches/tmpnam'
4
+
5
+ describe 'File' do
6
+ describe '.tmpnam' do
7
+ it "creates file names that don't exist" do
8
+ File.exist?(File.tmpnam).should be_false
9
+ end
10
+
11
+ it "puts extensions on files (no dot)" do
12
+ path = File.tmpnam('txt')
13
+ path[-4..-1].should eq('.txt')
14
+ end
15
+
16
+ it "puts extensions on files (with dot)" do
17
+ path = File.tmpnam('txt')
18
+ path[-4..-1].should eq('.txt')
19
+ end
20
+
21
+ it "puts files in the temporary directory" do
22
+ File.tmpnam.should start_with(Dir.tmpdir)
23
+ end
24
+
25
+ it "can create lots and lots in a row" do
26
+ files = []
27
+ (1..1000).each do |i|
28
+ files << File.tmpnam
29
+ FileUtils.touch(files.last)
30
+ end
31
+
32
+ files.each { |f| File.unlink(f) }
33
+ end
34
+ end
35
+ end