hookapp 2.0.5 → 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +26 -3
  4. data/Rakefile +7 -3
  5. data/bin/hook +49 -2
  6. data/buildnotes.md +30 -0
  7. data/hook.rdoc +21 -2
  8. data/lib/helpers/fuzzyfilefinder +0 -0
  9. data/lib/hook/hookapp.rb +29 -10
  10. data/lib/hook/string.rb +4 -0
  11. data/lib/hook/version.rb +1 -1
  12. data/test/helpers/hook-helpers.rb +76 -0
  13. data/test/hook_clip_test.rb +24 -0
  14. data/test/hook_clone_test.rb +30 -0
  15. data/test/hook_encode_test.rb +30 -0
  16. data/test/hook_link_test.rb +39 -0
  17. data/test/hook_list_test.rb +25 -0
  18. data/test/hook_remove_test.rb +34 -0
  19. data/test/hook_scripts_test.rb +21 -0
  20. metadata +10 -69
  21. data/html/App.html +0 -107
  22. data/html/GLI/Commands/Doc.html +0 -91
  23. data/html/GLI/Commands/MarkdownDocumentListener.html +0 -511
  24. data/html/GLI/Commands.html +0 -91
  25. data/html/GLI.html +0 -91
  26. data/html/Hook.html +0 -100
  27. data/html/HookApp.html +0 -946
  28. data/html/Hooker.html +0 -141
  29. data/html/README_rdoc.html +0 -325
  30. data/html/String.html +0 -313
  31. data/html/created.rid +0 -9
  32. data/html/css/fonts.css +0 -167
  33. data/html/css/rdoc.css +0 -639
  34. data/html/fonts/Lato-Light.ttf +0 -0
  35. data/html/fonts/Lato-LightItalic.ttf +0 -0
  36. data/html/fonts/Lato-Regular.ttf +0 -0
  37. data/html/fonts/Lato-RegularItalic.ttf +0 -0
  38. data/html/fonts/SourceCodePro-Bold.ttf +0 -0
  39. data/html/fonts/SourceCodePro-Regular.ttf +0 -0
  40. data/html/images/add.png +0 -0
  41. data/html/images/arrow_up.png +0 -0
  42. data/html/images/brick.png +0 -0
  43. data/html/images/brick_link.png +0 -0
  44. data/html/images/bug.png +0 -0
  45. data/html/images/bullet_black.png +0 -0
  46. data/html/images/bullet_toggle_minus.png +0 -0
  47. data/html/images/bullet_toggle_plus.png +0 -0
  48. data/html/images/date.png +0 -0
  49. data/html/images/delete.png +0 -0
  50. data/html/images/find.png +0 -0
  51. data/html/images/loadingAnimation.gif +0 -0
  52. data/html/images/macFFBgHack.png +0 -0
  53. data/html/images/package.png +0 -0
  54. data/html/images/page_green.png +0 -0
  55. data/html/images/page_white_text.png +0 -0
  56. data/html/images/page_white_width.png +0 -0
  57. data/html/images/plugin.png +0 -0
  58. data/html/images/ruby.png +0 -0
  59. data/html/images/tag_blue.png +0 -0
  60. data/html/images/tag_green.png +0 -0
  61. data/html/images/transparent.png +0 -0
  62. data/html/images/wrench.png +0 -0
  63. data/html/images/wrench_orange.png +0 -0
  64. data/html/images/zoom.png +0 -0
  65. data/html/index.html +0 -293
  66. data/html/js/darkfish.js +0 -84
  67. data/html/js/navigation.js +0 -105
  68. data/html/js/navigation.js.gz +0 -0
  69. data/html/js/search.js +0 -110
  70. data/html/js/search_index.js +0 -1
  71. data/html/js/search_index.js.gz +0 -0
  72. data/html/js/searcher.js +0 -229
  73. data/html/js/searcher.js.gz +0 -0
  74. data/html/table_of_contents.html +0 -345
  75. data/test/default_test.rb +0 -14
  76. data/test/hookfiles/01.test +0 -0
  77. data/test/hookfiles/02.test +0 -0
  78. data/test/hookfiles/03.test +0 -0
  79. data/test/hookfiles/04.test +0 -0
  80. data/test/hookfiles/05.test +0 -0
  81. data/test/hookfiles/06.test +0 -0
  82. data/test/hookfiles/07.test +0 -0
  83. data/test/hookfiles/08.test +0 -0
  84. data/test/hookfiles/09.test +0 -0
  85. data/test/hookfiles/10.test +0 -0
  86. data/test/hookfiles/11.test +0 -0
  87. data/test/hookfiles/12.test +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 06acc4dd72c5ca227e0cbf252542ca79e42a31d624b5e78f609cfb019220f3c3
4
- data.tar.gz: 6f2f660014f3486dd80a0fd06c52aa6822844097580780b6addf247ee0ee8cee
3
+ metadata.gz: 477033a68381137c2a2c67a486896da5d1210fb8d261950beff09df64b0b6566
4
+ data.tar.gz: b3de73462923bc91c88c7ab58b3c8fc7195ffe19cb4d09bef2acd3d0e579e7d5
5
5
  SHA512:
6
- metadata.gz: 4c3c57b1879c66c9ce671bf3eb7a676e9d543962a50c0647ade2d451f93207c071d34c67a93ccdde8fcf5d19e54a0bb53a056e8cba928e5c6b6cdf69868b69ab
7
- data.tar.gz: 5ba08b7b5ef07d6d0062fc18cfea73957d83146194185de9e1d1cbaf8f5680f230792a919a954099b03e26c023fe204766ece2429acc9fe4de1b0e233418d76a
6
+ metadata.gz: c64691a5a0ddc289590408efd13936e352962838f182ec905dfd8ac706197e6f5538d2cbe2a108b1a72f7ace459d90d36d1b789cf48bc7a6871391c871698a24
7
+ data.tar.gz: 3b91f789621f9cf091793ac75d9d44b61c09c2c07ae34fc4e84495ee670c2016c8583b71d00c067917f12aff77e603b389773a1cf4acb8a3a12bcd9cea2ac1bb
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hookapp (2.0.4)
4
+ hookapp (2.0.7)
5
5
  gli (~> 2.20.1)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -2,9 +2,10 @@
2
2
 
3
3
  CLI interface for Hook.app (macOS)
4
4
 
5
- > Hook.app is a productivity tool for macOS <https://hookproductivity.com/>. This gem includes a `hook` binary that allows interaction with the features of Hook.app.
5
+ > Hook.app is a productivity tool for macOS <https://hookproductivity.com/>.
6
+ This gem includes a `hook` binary that allows interaction with the features of Hook.app.
6
7
 
7
- *v2.0.3*
8
+ *v2.0.7*
8
9
 
9
10
  ## Installation
10
11
 
@@ -257,6 +258,24 @@ Generate a menu to select hook(s) for opening
257
258
 
258
259
  * * * * * *
259
260
 
261
+ ### `$ hook` <mark>`percent`</mark> ` STRING`
262
+
263
+ *Percent encode/decode a string*
264
+
265
+ > Use encode or decode to apply Hook's url encoding to a string argument. Use '-' to read input from STDIN.
266
+
267
+ #### Commands
268
+
269
+ ##### `$ hook` <mark>`decode`</mark> ` STRING`
270
+
271
+ *decode a percent-encoded string*
272
+
273
+ ##### `$ hook` <mark>`encode`</mark> ` STRING`
274
+
275
+ *percent encode a string*
276
+
277
+ * * * * * *
278
+
260
279
  ### `$ hook` <mark>`remove|rm`</mark> ` ITEM_1 ITEM_2`
261
280
 
262
281
  *Remove a hook between two files/urls*
@@ -271,6 +290,10 @@ Generate a menu to select hook(s) for opening
271
290
 
272
291
  Remove ALL links on files, requires confirmation
273
292
 
293
+ ##### `-f`|`--force`
294
+
295
+
296
+
274
297
  * * * * * *
275
298
 
276
299
  ### `$ hook` <mark>`scripts`</mark> ` SHELL`
@@ -325,5 +348,5 @@ This software is licensed under the MIT License.
325
348
  THE SOFTWARE.
326
349
 
327
350
 
328
- Documentation generated 2021-09-18 12:29
351
+ Documentation generated 2021-09-25 07:37
329
352
 
data/Rakefile CHANGED
@@ -4,6 +4,7 @@ require 'rubygems/package_task'
4
4
  require 'rdoc/task'
5
5
  require 'cucumber'
6
6
  require 'cucumber/rake/task'
7
+ require 'rake/testtask'
7
8
  Rake::RDocTask.new do |rd|
8
9
  rd.main = "README.rdoc"
9
10
  rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
@@ -14,6 +15,7 @@ spec = eval(File.read('hookapp.gemspec'))
14
15
 
15
16
  Gem::PackageTask.new(spec) do |pkg|
16
17
  end
18
+
17
19
  CUKE_RESULTS = 'results.html'
18
20
  CLEAN << CUKE_RESULTS
19
21
  desc 'Run features'
@@ -35,10 +37,12 @@ end
35
37
  task :cucumber => :features
36
38
  task 'cucumber:wip' => 'features:wip'
37
39
  task :wip => 'features:wip'
38
- require 'rake/testtask'
40
+
39
41
  Rake::TestTask.new do |t|
40
- t.libs << "test"
42
+ t.libs << ['test', 'test/helpers']
41
43
  t.test_files = FileList['test/*_test.rb']
44
+ t.verbose = ENV['VERBOSE'] =~ /(true|1)/i ? true : false
42
45
  end
43
46
 
44
- task :default => [:test,:features]
47
+ # task :default => [:test,:features]
48
+ task :default => [:test]
data/bin/hook CHANGED
@@ -2,13 +2,15 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'hook'
5
+ require 'shellwords'
5
6
 
6
7
  # Main class for GLI app
7
8
  class App
8
9
  extend GLI::App
9
10
 
10
11
  program_desc 'CLI interface for Hook.app (macOS)'
11
- program_long_desc 'Hook.app is a productivity tool for macOS <https://hookproductivity.com/>. This gem includes a `hook` binary that allows interaction with the features of Hook.app.'
12
+ program_long_desc 'Hook.app is a productivity tool for macOS <https://hookproductivity.com/>.
13
+ This gem includes a `hook` binary that allows interaction with the features of Hook.app.'
12
14
  default_command 'help'
13
15
  autocomplete_commands = true
14
16
  synopsis_format(:terminal)
@@ -19,6 +21,7 @@ class App
19
21
  arguments :strict
20
22
 
21
23
  hookapp = nil
24
+ stdin = nil
22
25
 
23
26
  desc 'List hooks on a file or url'
24
27
  long_desc %{
@@ -215,9 +218,10 @@ If --all isn't specified, exactly two arguments (Files/URLs) are required.
215
218
  command %i[remove rm] do |c|
216
219
  c.desc 'Remove ALL links on files, requires confirmation'
217
220
  c.switch %i[a all], { negatable: false, default_value: false }
221
+ c.switch %i[f force], { negatable: false, default_value: false }
218
222
 
219
223
  c.action do |_global_options, options, args|
220
- result = hookapp.delete_hooks(args, { all: options[:a] })
224
+ result = hookapp.delete_hooks(args, { all: options[:all], force: options[:force] })
221
225
  puts result
222
226
  end
223
227
  end
@@ -264,12 +268,55 @@ Opens Hook.app on the specified file/URL for browsing and performing actions. Ex
264
268
  end
265
269
  end
266
270
 
271
+ desc 'Percent encode/decode a string'
272
+ long_desc %{Use encode or decode to apply Hook's url encoding to a string argument. Use '-' to read input from STDIN.}
273
+ arg_name 'STRING'
274
+ command :percent do |c|
275
+ c.desc 'percent encode a string'
276
+ c.arg_name 'STRING'
277
+ c.command :encode do |enc|
278
+ enc.action do |_global_options, _options, args|
279
+ if stdin
280
+ string = stdin
281
+ else
282
+ exit_now!('no string provided') unless args.size.positive?
283
+
284
+ string = args.join(' ').strip
285
+ end
286
+
287
+ print hookapp.encode(string)
288
+ end
289
+ end
290
+
291
+ c.desc 'decode a percent-encoded string'
292
+ c.arg_name 'STRING'
293
+ c.command :decode do |dec|
294
+ dec.action do |_global_options, _options, args|
295
+ if stdin
296
+ string = stdin
297
+ else
298
+ exit_now! ('no string provided') unless args.size.positive?
299
+
300
+ string = args.join(' ').strip
301
+ end
302
+
303
+ print hookapp.decode(string)
304
+ end
305
+ end
306
+
307
+ # c.default_command :encode
308
+ end
309
+
267
310
  pre do |global, _command, _options, _args|
268
311
  # Pre logic here
269
312
  # Return true to proceed; false to abort and not call the
270
313
  # chosen command
271
314
  # Use skips_pre before a command to skip this block
272
315
  # on that command only
316
+ if !STDIN.tty?
317
+ stdin = STDIN.read.strip
318
+ end
319
+
273
320
  hookapp = HookApp.new
274
321
  true
275
322
  end
data/buildnotes.md CHANGED
@@ -27,3 +27,33 @@ Helpers and main classes are in `lib/`.
27
27
  Update the docs with `bundle exec bin/hook _doc --format=markdown` and `bundle exec bin/hook _doc --format=rdoc`, then run `rake rerdoc`
28
28
 
29
29
  @run(bundle exec bin/hook _doc --format=rdoc && bundle exec bin/hook _doc --format=markdown && rake rerdoc)
30
+
31
+ ## Test
32
+
33
+ Run all tests using `rake test`.
34
+
35
+ Run verbose using `rake test TESTOPT="-v"`
36
+
37
+ Run a single test using `rake test TEST=test/TEST_FILE.rb`
38
+
39
+ This howzit task accepts an optional argument pointing to a specific test (just the test part of the filename, e.g. archive runs `test/doing_archive_test.rb`).
40
+
41
+ `howzit -r test -- archive` (or `bld test archive` with the Fish function)
42
+
43
+ ```run
44
+ #!/bin/bash
45
+ if [[ -n $1 ]]; then
46
+ rake test TESTOPT="-v" TEST=test/hook_$1_test.rb
47
+ if [[ $? != 0 ]]; then
48
+ echo "Available tests"
49
+ echo -e "\033[1;32;40m"
50
+ FILES="test/hook_*_test.rb"
51
+ for file in $FILES; do
52
+ echo $(basename $file ".rb") | sed -E 's/hook_(.*)_test/- \1/'
53
+ done
54
+ echo -e "\033[0m"
55
+ fi
56
+ else
57
+ rake test TESTOPT="-v"
58
+ fi
59
+ ```
data/hook.rdoc CHANGED
@@ -1,8 +1,9 @@
1
1
  == hook - CLI interface for Hook.app (macOS)
2
2
 
3
- Hook.app is a productivity tool for macOS <https://hookproductivity.com/>. This gem includes a `hook` binary that allows interaction with the features of Hook.app.
3
+ Hook.app is a productivity tool for macOS <https://hookproductivity.com/>.
4
+ This gem includes a `hook` binary that allows interaction with the features of Hook.app.
4
5
 
5
- v2.0.3
6
+ v2.0.7
6
7
 
7
8
  === Global Options
8
9
  === --help
@@ -151,6 +152,19 @@ This option is a shortcut to `hook select` and overrides any other arguments.
151
152
  Open the specified file or url in Hook GUI
152
153
 
153
154
  Opens Hook.app on the specified file/URL for browsing and performing actions. Exactly one argument (File/URL) required.
155
+ ==== Command: <tt>percent STRING</tt>
156
+ Percent encode/decode a string
157
+
158
+ Use encode or decode to apply Hook's url encoding to a string argument. Use '-' to read input from STDIN.
159
+ ===== Commands
160
+ ====== Command: <tt>decode STRING</tt>
161
+ decode a percent-encoded string
162
+
163
+
164
+ ====== Command: <tt>encode STRING</tt>
165
+ percent encode a string
166
+
167
+
154
168
  ==== Command: <tt>remove|rm ITEM_1 ITEM_2</tt>
155
169
  Remove a hook between two files/urls
156
170
 
@@ -163,6 +177,11 @@ Remove ALL links on files, requires confirmation
163
177
 
164
178
 
165
179
 
180
+ ===== -f|--force
181
+
182
+
183
+
184
+
166
185
  ==== Command: <tt>scripts SHELL</tt>
167
186
  Shell completion examples
168
187
 
Binary file
data/lib/hook/hookapp.rb CHANGED
@@ -171,9 +171,9 @@ class HookApp
171
171
  output = output_array(result, opts)
172
172
 
173
173
  if opts[:format] =~ /^v/
174
- "Search results for: #{search}\n---------\n" + output.join("\n")
174
+ "Search results for: #{search}\n---------\n" + output.join("\n") if output
175
175
  else
176
- output.join(separator)
176
+ output.join(separator) if output
177
177
  end
178
178
  end
179
179
 
@@ -334,10 +334,13 @@ class HookApp
334
334
  end
335
335
 
336
336
  # Delete all hooked files/urls from target file
337
- def delete_all_hooks(url)
338
- STDERR.print "Are you sure you want to delete ALL hooks from #{url} (y/N)? "
339
- res = STDIN.gets.strip
340
- if res =~ /^y/i
337
+ def delete_all_hooks(url, force: false)
338
+ unless force
339
+ STDERR.print "Are you sure you want to delete ALL hooks from #{url} (y/N)? "
340
+ res = STDIN.gets.strip
341
+ end
342
+
343
+ if res =~ /^y/i || force
341
344
  get_hooks(url).each do |hook|
342
345
  `osascript <<'APPLESCRIPT'
343
346
  tell application "Hook"
@@ -360,7 +363,7 @@ class HookApp
360
363
  urls.each_with_index do |url, i|
361
364
  raise "Invalid target: #{args[i]}" unless url
362
365
 
363
- output.push(delete_all_hooks(url))
366
+ output.push(delete_all_hooks(url, force: opts[:force]))
364
367
  end
365
368
  return output.join("\n")
366
369
  end
@@ -431,7 +434,7 @@ class HookApp
431
434
  hooks_arr = get_hooks(url)
432
435
 
433
436
  output = output_array(hooks_arr, opts)
434
- result.push({ file: filename, links: output.join(separator) })
437
+ result.push({ file: filename, links: output.join(separator) }) if output
435
438
  end
436
439
 
437
440
 
@@ -479,11 +482,27 @@ class HookApp
479
482
  end
480
483
  end
481
484
  else
482
- output = ['No bookmarks']
485
+ warn 'No bookmarks'
483
486
  end
484
487
 
485
488
  output
486
489
  end
487
- end
488
490
 
491
+ def encode(string)
492
+ result = `osascript <<'APPLESCRIPT'
493
+ tell application "Hook"
494
+ percent encode "#{string.escape_quotes}"
495
+ end tell
496
+ APPLESCRIPT`.strip.gsub(/'/,'%27')
497
+ print result
498
+ end
489
499
 
500
+ def decode(string)
501
+ result = `osascript <<'APPLESCRIPT'
502
+ tell application "Hook"
503
+ percent decode "#{string.escape_quotes}"
504
+ end tell
505
+ APPLESCRIPT`.strip
506
+ print result
507
+ end
508
+ end
data/lib/hook/string.rb CHANGED
@@ -57,4 +57,8 @@ class String
57
57
 
58
58
  true
59
59
  end
60
+
61
+ def escape_quotes
62
+ gsub(/"/, '\\"')
63
+ end
60
64
  end
data/lib/hook/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hook
4
- VERSION = '2.0.5'
4
+ VERSION = '2.0.7'
5
5
  end
@@ -0,0 +1,76 @@
1
+ require 'fileutils'
2
+ require 'open3'
3
+
4
+ class ::Numeric
5
+ def pad_to(x)
6
+ "%0#{x.to_i}d" % self
7
+ end
8
+ end
9
+
10
+ module HookHelpers
11
+ HOOK_EXEC = File.join(File.dirname(__FILE__), '..', '..', 'bin', 'hook')
12
+ HOOK_FILES_DIR = File.join(File.dirname(__FILE__), '..', 'hookfiles')
13
+ HOOK_COMPLETIONS_DIR = File.join(File.dirname(__FILE__), '..', '..', 'lib', 'completion')
14
+
15
+ def create_temp_files
16
+ FileUtils.mkdir_p HOOK_FILES_DIR
17
+ 10.times.with_index do |i|
18
+ new_file = File.join(HOOK_FILES_DIR, i.pad_to(2) + '.md')
19
+ File.open(new_file, 'w') do |f|
20
+ f.puts ("Hook Test File ##{i}")
21
+ end
22
+ hook('rm', '-a', '-f', new_file)
23
+ end
24
+ end
25
+
26
+ def clean_temp_files
27
+ FileUtils.rm_r HOOK_FILES_DIR, force: true
28
+ end
29
+
30
+ def assert_count_links(file, count, msg)
31
+ res = hook('ls', file).strip
32
+
33
+ links = res == 'No bookmarks' ? 0 : res.split(/\n/).size
34
+
35
+ assert_equal(count, links, msg)
36
+ end
37
+
38
+ def assert_links_include(file, pattern, msg)
39
+ result = hook('ls', file).strip
40
+ assert_match(/#{pattern}/, result, msg)
41
+ end
42
+
43
+ def hook(*args)
44
+ hook_with_env({}, *args)
45
+ end
46
+
47
+ def hook_with_stdin(input, *args)
48
+ pread_stdin({}, input, HOOK_EXEC, *args)
49
+ end
50
+
51
+ def hook_with_env(env, *args)
52
+ pread(env, HOOK_EXEC, *args)
53
+ end
54
+
55
+ def pread_stdin(env, input, *cmd)
56
+ out, err, status = Open3.capture3(env, 'bundle', 'exec', *cmd, :stdin_data => input)
57
+ unless status.success?
58
+ raise [
59
+ "Error (#{status}): #{cmd.inspect} failed", "STDOUT:", out.inspect, "STDERR:", err.inspect
60
+ ].join("\n")
61
+ end
62
+
63
+ out
64
+ end
65
+
66
+ def pread(env, *cmd)
67
+ out, err, status = Open3.capture3(env, 'bundle', 'exec', *cmd)
68
+ unless status.success?
69
+ raise [
70
+ "Error (#{status}): #{cmd.inspect} failed", "STDOUT:", out.inspect, "STDERR:", err.inspect
71
+ ].join("\n")
72
+ end
73
+
74
+ out
75
+ end
76
+ end
@@ -0,0 +1,24 @@
1
+ require 'hook-helpers'
2
+ require 'test_helper'
3
+
4
+ class ClipTest < Test::Unit::TestCase
5
+ include HookHelpers
6
+
7
+ def setup
8
+ @basedir = HOOK_FILES_DIR
9
+ create_temp_files
10
+ end
11
+
12
+ def teardown
13
+ clean_temp_files
14
+ end
15
+
16
+ def test_clip
17
+ file = Dir.glob(File.join(HOOK_FILES_DIR, '*.md'))[0]
18
+ # Clear clipboard
19
+ `echo -n | pbcopy`
20
+ hook('clip', file)
21
+ clipboard = `pbpaste`.strip
22
+ assert_match(/^hook:.*?#{File.basename(file)}$/, clipboard, 'Clipboard should contain link to first file')
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ require 'hook-helpers'
2
+ require 'test_helper'
3
+
4
+ class CloneTest < Test::Unit::TestCase
5
+ include HookHelpers
6
+
7
+ def setup
8
+ @basedir = HOOK_FILES_DIR
9
+ create_temp_files
10
+ end
11
+
12
+ def teardown
13
+ clean_temp_files
14
+ end
15
+
16
+ def test_clone
17
+ count = 3
18
+
19
+ files = Dir.glob(File.join(HOOK_FILES_DIR, '*.md'))
20
+
21
+ # Link all files to last file
22
+ hook('link', *files[0..count - 1])
23
+ links = hook('ls', files[count - 1]).strip
24
+
25
+ hook('clone', files[count-1], files[count])
26
+ cloned_links = hook('ls', files[count]).strip
27
+
28
+ assert_match(links, cloned_links, "#{files[count - 1]} links should match #{files[count]} links")
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ require 'hook-helpers'
2
+ require 'test_helper'
3
+
4
+ class EncodeTest < Test::Unit::TestCase
5
+ include HookHelpers
6
+
7
+ def setup
8
+ end
9
+
10
+ def teardown
11
+ end
12
+
13
+ # # FIXME: I don't know why this isn't getting output
14
+ # def test_encode_args
15
+ # result = hook('percent', 'encode', %(here's a "string?"))
16
+ # assert_match(/here%27s%20a%20%22string%3F%22/, result, 'URL encoded string should match')
17
+ # end
18
+
19
+ def test_encode_stdin
20
+ result = pread_stdin({}, %(here's a "string?"), HOOK_EXEC, 'percent', 'encode')
21
+ assert_match(/here%27s%20a%20%22string%3F%22/, result, 'URL encoded string should match')
22
+ end
23
+
24
+ def test_encode_decode_stdin
25
+ original_string = %(here's a "string?")
26
+ encoded = pread_stdin({}, original_string, HOOK_EXEC, 'percent', 'encode')
27
+ decoded = pread_stdin({}, encoded, HOOK_EXEC, 'percent', 'decode')
28
+ assert_match(decoded, original_string, 'URL encoded string should match')
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ require 'hook-helpers'
2
+ require 'test_helper'
3
+
4
+ class LinkTest < Test::Unit::TestCase
5
+ include HookHelpers
6
+
7
+ def setup
8
+ @basedir = HOOK_FILES_DIR
9
+ create_temp_files
10
+ end
11
+
12
+ def teardown
13
+ clean_temp_files
14
+ end
15
+
16
+ def test_link
17
+ count = 3
18
+
19
+ files = Dir.glob(File.join(HOOK_FILES_DIR, '*.md'))[0..(count - 1)]
20
+
21
+ # Link all files to last file
22
+ hook('link', *files)
23
+
24
+ assert_count_links(files[-1], count - 1, "Last file should have #{count - 1} links")
25
+ assert_count_links(files[0], 1, 'First file should have 1 link')
26
+ end
27
+
28
+ def test_bi_link
29
+ count = 3
30
+
31
+ files = Dir.glob(File.join(HOOK_FILES_DIR, '*.md'))[0..(count - 1)]
32
+
33
+ # Link all files bi-directionally
34
+ hook('link', '-a', *files)
35
+
36
+ assert_count_links(files[-1], count - 1, "Last file should have #{count - 1} links")
37
+ assert_count_links(files[0], count - 1, "First file should have #{count - 1} links")
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ require 'hook-helpers'
2
+ require 'test_helper'
3
+
4
+ class ListTest < Test::Unit::TestCase
5
+ include HookHelpers
6
+
7
+ def setup
8
+ @basedir = HOOK_FILES_DIR
9
+ create_temp_files
10
+ end
11
+
12
+ def teardown
13
+ clean_temp_files
14
+ end
15
+
16
+ def test_list
17
+ count = 2
18
+ files = Dir.glob(File.join(HOOK_FILES_DIR, '*.md'))[0..(count - 1)]
19
+ # Link all files to last file
20
+ hook('link', *files)
21
+
22
+ assert_count_links(files[-1], count - 1, "Last file should have #{count - 1} links")
23
+ assert_links_include(files[-1], File.basename(files[0]), 'Links on last file should include first file')
24
+ end
25
+ end
@@ -0,0 +1,34 @@
1
+ require 'hook-helpers'
2
+ require 'test_helper'
3
+
4
+ class RemoveTest < Test::Unit::TestCase
5
+ include HookHelpers
6
+
7
+ def setup
8
+ @basedir = HOOK_FILES_DIR
9
+ create_temp_files
10
+ end
11
+
12
+ def teardown
13
+ clean_temp_files
14
+ end
15
+
16
+ def test_remove
17
+ count = 5
18
+
19
+ files = Dir.glob(File.join(HOOK_FILES_DIR, '*.md'))[0..(count - 1)]
20
+
21
+ # Link all files to last file
22
+ hook('link', *files)
23
+
24
+ assert_count_links(files[-1], count - 1, "Last file should start with #{count - 1} links")
25
+
26
+ hook('remove', files[-1], files[0])
27
+
28
+ assert_count_links(files[-1], count - 2, "Last file should have #{count - 2} links")
29
+
30
+ hook('remove', '--all', '--force', files[-1])
31
+
32
+ assert_count_links(files[-1], 0, "Last file should end with 0 links")
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ require 'hook-helpers'
2
+ require 'test_helper'
3
+
4
+ class EncodeTest < Test::Unit::TestCase
5
+ include HookHelpers
6
+
7
+ def setup
8
+ end
9
+
10
+ def teardown
11
+ end
12
+
13
+ def test_shell_scripts
14
+ %w[bash fish zsh].each do |sh|
15
+ source = IO.read(File.join(HOOK_COMPLETIONS_DIR, 'hook_completion.' + sh))
16
+ result = hook('scripts', sh)
17
+
18
+ assert_match(source, result, 'Script output should match')
19
+ end
20
+ end
21
+ end