doing 2.0.24 → 2.0.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be908ed31434bd248efe3ebcba66b9022ed35be3651af6ada7e6464b50c91c9f
4
- data.tar.gz: 0dcf2ce4915637e2514a8d9735c8ca294a6d5bbc0558afdabeb714d3f1de5b50
3
+ metadata.gz: 7fc7ae9d7369be36fcfb7bdd888ed7a6342d998e9ca77c5647ae2386fbaff3ca
4
+ data.tar.gz: b2b71651788d3e99b71a964a6ac93b2b485adf9467e2cec2bc66e51c49314a8f
5
5
  SHA512:
6
- metadata.gz: ef314b60821ba50306c0d6b9704f310a21d6652480e67350f092cfc670c6ddab9024c24f602d68396e555fb624cf316507526a50b241c959639c738699c8602e
7
- data.tar.gz: 8474ed1164f978c0359f7826b1c92fd66821bb112ae71938a67245b42a8e342f8e629dd42ec4cc8216b033e6aff20e1c44d0b3d89cdbc7f96b5e6d4513cd1319
6
+ metadata.gz: 8b11ec84f5b92b9938ac95f5e9dd2777ba9b218ed918ffa9de2082f3129a683d3fd6f112db775e479dc0967e9af2f5a619cbfafcd6416c35fcbeaf3df05c0c33
7
+ data.tar.gz: 3f87f827b16fdbe04440d8b58253a3cd209de909fa0be9369ab9638c85da8753d41237d0028c3fe37deef64ad742890c5fd91877373ef3a4b562b5331eddbb42
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ### 2.0.25
2
+
3
+ #### NEW
4
+
5
+ - `doing config set` to set single config values from command line
6
+ - BREAKING CHANGE: Moves ~/.doingrc to ~/.config/doing/config.yml
7
+ - BREAKING CHANGE: convert config flags to subcommands, e.g. `doing config --udpate` => `doing config update`, and `doing config --dump` => `doing config dump`
8
+
1
9
  ### 2.0.24
2
10
 
3
11
  - include fzf source directly, in case git isn't installed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- doing (2.0.24)
4
+ doing (2.0.25)
5
5
  chronic (~> 0.10, >= 0.10.2)
6
6
  deep_merge (~> 1.2, >= 1.2.1)
7
7
  gli (~> 2.19, >= 2.19.2)
data/README.md CHANGED
@@ -6,7 +6,7 @@ _If you're one of the rare people like me who find this useful, feel free to [bu
6
6
 
7
7
  <!--README-->
8
8
 
9
- The current version of `doing` is <!--VER-->2.0.23<!--END VER-->.
9
+ The current version of `doing` is <!--VER-->2.0.24<!--END VER-->.
10
10
 
11
11
  Find all of the documentation in the [doing wiki](https://github.com/ttscoff/doing/wiki).
12
12
 
@@ -41,6 +41,12 @@ See the [doing project on BrettTerpstra.com](https://brettterpstra.com/projects/
41
41
 
42
42
  Evan Lovely has [created an Alfred workflow as well](http://www.evanlovely.com/blog/technology/alfred-for-terpstras-doing/).
43
43
 
44
+ ## Contributing
45
+
46
+ If you [create a plugin](https://github.com/ttscoff/doing/wiki/Creating-Plugins), custom command, or hook you can share, please [let me know](https://brettterpstra.com/contact/). If I get a few plugin contributions, I'll set up a second repository for them.
47
+
48
+ Feel free to fork [the repository](https://github.com/ttscoff/doing/) on GitHub and make pull requests with changes. Please target the `develop` branch with pull requests.
49
+
44
50
  <!--END README-->
45
51
 
46
52
  ---
data/bin/doing CHANGED
@@ -1188,7 +1188,7 @@ command :tag do |c|
1188
1188
  c.desc 'Tag last entry (or entries) not marked @done'
1189
1189
  c.switch %i[u unfinished], negatable: false, default_value: false
1190
1190
 
1191
- c.desc 'Autotag entries based on autotag configuration in ~/.doingrc'
1191
+ c.desc 'Autotag entries based on autotag configuration in ~/.config/doing/config.yml'
1192
1192
  c.switch %i[a autotag], negatable: false, default_value: false
1193
1193
 
1194
1194
  c.desc 'Tag the last X entries containing TAG.
@@ -2591,55 +2591,138 @@ command :open do |c|
2591
2591
  end
2592
2592
 
2593
2593
  desc 'Edit the configuration file or output a value from it'
2594
- long_desc %(Run without arguments, `doing config` opens your `.doingrc` in an editor.
2594
+ long_desc %(Run without arguments, `doing config` opens your `config.yml` in an editor.
2595
2595
  If local configurations are found in the path between the current directory
2596
- and `~/.doingrc`, a menu will allow you to select which to open in the editor.
2596
+ and the root (/), a menu will allow you to select which to open in the editor.
2597
2597
 
2598
2598
  It will use the editor defined in `config_editor_app`, or one specified with `--editor`.
2599
2599
 
2600
- Use `doing config -d` to output the configuration to the terminal, and
2600
+ Use `doing config get` to output the configuration to the terminal, and
2601
2601
  provide a dot-separated key path to get a specific value. Shows the current value
2602
2602
  including keys/overrides set by local configs.)
2603
- arg_name 'KEY_PATH'
2604
2603
  command :config do |c|
2605
2604
  c.example 'doing config', desc: "Open an active configuration in #{Doing::Util.find_default_editor('config')}"
2606
- c.example 'doing config -d doing_file', desc: 'Output the value of a config key as YAML'
2607
- c.example 'doing config -d plugins.say.say_voice -o json', desc: 'Output the value of a key path as JSON'
2605
+ c.example 'doing config get doing_file', desc: 'Output the value of a config key as YAML'
2606
+ c.example 'doing config get plugins.plugin_path -o json', desc: 'Output the value of a key path as JSON'
2607
+ c.example 'doing config set plugins.say.say_voice Alex', desc: 'Set the value of a key path and update config file'
2608
+ c.example 'doing config set plug.say.voice Zarvox', desc: 'Key paths for get and set are fuzzy matched'
2608
2609
 
2609
- c.desc 'Editor to use'
2610
- c.arg_name 'EDITOR'
2611
- c.flag %i[e editor], default_value: nil
2610
+ c.default_command :edit
2612
2611
 
2613
- c.desc 'Show a config key value based on arguments. Separate key paths with colons or dots, e.g. "export_templates.html". Empty arguments outputs the entire config.'
2614
- c.switch %i[d dump], negatable: false
2612
+ c.desc 'DEPRECATED'
2613
+ c.switch %i[d dump]
2615
2614
 
2616
- c.desc 'Format for --dump (json|yaml|raw)'
2617
- c.arg_name 'FORMAT'
2618
- c.flag %i[o output], default_value: 'yaml', must_match: /^(?:y(?:aml)?|j(?:son)?|r(?:aw)?)$/
2615
+ c.desc 'DEPRECATED'
2616
+ c.switch %i[u update]
2619
2617
 
2620
- c.desc 'Update config file with missing configuration options'
2621
- c.switch %i[u update], default_value: false, negatable: false
2618
+ c.desc 'Open config file in editor'
2619
+ c.command :edit do |edit|
2620
+ edit.example 'doing config edit', desc: 'Open a config file in the default editor'
2621
+ edit.example 'doing config edit --editor vim', desc: 'Open config in specific editor'
2622
2622
 
2623
- if `uname` =~ /Darwin/
2624
- c.desc 'Application to use'
2625
- c.arg_name 'APP_NAME'
2626
- c.flag [:a]
2623
+ edit.desc 'Editor to use'
2624
+ edit.arg_name 'EDITOR'
2625
+ edit.flag %i[e editor], default_value: nil
2627
2626
 
2628
- c.desc 'Application bundle id to use'
2629
- c.arg_name 'BUNDLE_ID'
2630
- c.flag [:b]
2627
+ if `uname` =~ /Darwin/
2628
+ edit.desc 'Application to use'
2629
+ edit.arg_name 'APP_NAME'
2630
+ edit.flag [:a]
2631
+
2632
+ edit.desc 'Application bundle id to use'
2633
+ edit.arg_name 'BUNDLE_ID'
2634
+ edit.flag [:b]
2635
+
2636
+ edit.desc "Use the config_editor_app defined in ~/.config/doing/config.yml (#{settings.key?('config_editor_app') ? settings['config_editor_app'] : 'config_editor_app not set'})"
2637
+ edit.switch [:x]
2638
+ end
2639
+
2640
+ edit.action do |global, options, args|
2641
+ if options[:update] || options[:dump]
2642
+ cmd = commands[:config]
2643
+ if options[:update]
2644
+ cmd = cmd.commands[:update]
2645
+ elsif options[:dump]
2646
+ cmd = cmd.commands[:get]
2647
+ end
2648
+ action = cmd.send(:get_action, nil)
2649
+ action.call(global, options, args)
2650
+ Doing.logger.warn('Deprecated:', '--dump and --update are deprecated,
2651
+ use `doing config get` and `doing config update`')
2652
+ Doing.logger.output_results
2653
+ return
2654
+ end
2655
+
2656
+ config_file = config.choose_config
2657
+
2658
+ if `uname` =~ /Darwin/
2659
+ if options[:x]
2660
+ editor = Doing::Util.find_default_editor('config')
2661
+ if editor
2662
+ if Doing::Util.exec_available(editor)
2663
+ system %(#{editor} "#{config_file}")
2664
+ else
2665
+ `open -a "#{editor}" "#{config_file}"`
2666
+ end
2667
+ else
2668
+ raise InvalidArgument, 'No viable editor found in config or environment.'
2669
+ end
2670
+ elsif options[:a] || options[:b]
2671
+ if options[:a]
2672
+ `open -a "#{options[:a]}" "#{config_file}"`
2673
+ elsif options[:b]
2674
+ `open -b #{options[:b]} "#{config_file}"`
2675
+ end
2676
+ else
2677
+ editor = options[:e] || Doing::Util.find_default_editor('config')
2678
+
2679
+ raise MissingEditor, 'No viable editor defined in config or environment' unless editor
2680
+
2681
+ if Doing::Util.exec_available(editor)
2682
+ system %(#{editor} "#{config_file}")
2683
+ else
2684
+ `open -a "#{editor}" "#{config_file}"`
2685
+ end
2686
+ end
2687
+ else
2688
+ editor = options[:e] || Doing::Util.default_editor
2689
+ raise MissingEditor, 'No EDITOR variable defined in environment' unless editor && Doing::Util.exec_available(editor)
2631
2690
 
2632
- c.desc "Use the config_editor_app defined in ~/.doingrc (#{settings.key?('config_editor_app') ? settings['config_editor_app'] : 'config_editor_app not set'})"
2633
- c.switch [:x]
2691
+ system %(#{editor} "#{config_file}")
2692
+ end
2693
+ end
2634
2694
  end
2635
2695
 
2636
- c.action do |_global_options, options, args|
2637
- if options[:update]
2696
+ c.desc 'Update default config file, adding any missing keys'
2697
+ c.command %i[update refresh] do |update|
2698
+ update.action do |_global, options, args|
2638
2699
  config.configure({rewrite: true, ignore_local: true})
2639
- return
2700
+ Doing.logger.warn('Config:', 'config refreshed')
2640
2701
  end
2702
+ end
2703
+
2704
+ c.desc 'Undo the last change to a config file'
2705
+ c.command :undo do |undo|
2706
+ undo.action do |_global, options, args|
2707
+ config_file = config.choose_config
2708
+ wwid.restore_backup(config_file)
2709
+ end
2710
+ end
2711
+
2712
+ c.desc 'Output a key\'s value'
2713
+ c.arg 'KEY_PATH'
2714
+ c.command %i[get dump] do |dump|
2715
+ dump.example 'doing config get', desc: 'Output the entire configuration'
2716
+ dump.example 'doing config get timer_format --output raw', desc: 'Output the value of timer_format as a plain string'
2717
+ dump.example 'doing config get doing_file', desc: 'Output the value of the doing_file setting, respecting local configurations'
2718
+ dump.example 'doing config get -o json plug.plugpath', desc: 'Key path is fuzzy matched: output the value of plugins->plugin_path as JSON'
2719
+
2720
+ dump.desc 'Format for output (json|yaml|raw)'
2721
+ dump.arg_name 'FORMAT'
2722
+ dump.flag %i[o output], default_value: 'yaml', must_match: /^(?:y(?:aml)?|j(?:son)?|r(?:aw)?)$/
2723
+
2724
+ dump.action do |_global, options, args|
2641
2725
 
2642
- if options[:dump]
2643
2726
  keypath = args.join('.')
2644
2727
  cfg = config.value_for_key(keypath)
2645
2728
 
@@ -2658,53 +2741,42 @@ command :config do |c|
2658
2741
  Doing.logger.output_results
2659
2742
  return
2660
2743
  end
2744
+ end
2661
2745
 
2662
- if config.additional_configs.count.positive?
2663
- choices = [config.config_file]
2664
- choices.concat(config.additional_configs)
2665
- res = wwid.choose_from(choices.uniq.sort.reverse, sorted: false, prompt: 'Local configs found, select which to edit > ')
2746
+ c.desc 'Set a key\'s value in the config file'
2747
+ c.arg 'KEY VALUE'
2748
+ c.command :set do |set|
2749
+ set.example 'doing config set timer_format human', desc: 'Set the value of timer_format to "human"'
2750
+ set.example 'doing config set plug.plugpath ~/my_plugins', desc: 'Key path is fuzzy matched: set the value of plugins->plugin_path'
2666
2751
 
2667
- raise UserCancelled, 'Cancelled' unless res
2752
+ set.action do |_global, options, args|
2753
+ if args.count < 2
2754
+ raise InvalidArgument, 'config set requires at least two arguments, key path and value'
2668
2755
 
2669
- config_file = res.strip || config.config_file
2670
- else
2671
- config_file = config.config_file
2672
- end
2756
+ end
2673
2757
 
2674
- if `uname` =~ /Darwin/
2675
- if options[:x]
2676
- editor = Doing::Util.find_default_editor('config')
2677
- if editor
2678
- if Doing::Util.exec_available(editor)
2679
- system %(#{editor} "#{config_file}")
2680
- else
2681
- `open -a "#{editor}" "#{config_file}"`
2682
- end
2683
- else
2684
- raise InvalidArgument, 'No viable editor found in config or environment.'
2685
- end
2686
- elsif options[:a] || options[:b]
2687
- if options[:a]
2688
- `open -a "#{options[:a]}" "#{config_file}"`
2689
- elsif options[:b]
2690
- `open -b #{options[:b]} "#{config_file}"`
2691
- end
2692
- else
2693
- editor = options[:e] || Doing::Util.find_default_editor('config')
2758
+ value = args.pop
2759
+ keypath = args.join('.')
2760
+ old_value = config.value_for_key(keypath).map { |k, v| v.to_s }
2761
+ real_path = config.resolve_key_path(keypath)
2762
+ raise InvalidArgument, 'Invalid key path' if real_path.empty?
2694
2763
 
2695
- raise MissingEditor, 'No viable editor defined in config or environment' unless editor
2764
+ key = real_path.last
2765
+ real_path[0...-1].inject(config.settings, :fetch)[key] = value
2696
2766
 
2697
- if Doing::Util.exec_available(editor)
2698
- system %(#{editor} "#{config_file}")
2699
- else
2700
- `open -a "#{editor}" "#{config_file}"`
2701
- end
2702
- end
2703
- else
2704
- editor = options[:e] || Doing::Util.default_editor
2705
- raise MissingEditor, 'No EDITOR variable defined in environment' unless editor && Doing::Util.exec_available(editor)
2767
+ config_file = config.choose_config
2768
+
2769
+ prev_level = Doing.logger.level
2770
+ Doing.logger.adjust_verbosity({ level: :info })
2771
+ Doing.logger.log_now(:info, 'Config:', "Updating #{config_file}")
2772
+ Doing.logger.log_now(:info, 'Config:', "#{real_path.join('->')} => #{value}")
2773
+ res = wwid.yn('Update selected config', default_response: true)
2774
+
2775
+ raise UserCancelled, 'Cancelled' unless res
2706
2776
 
2707
- system %(#{editor} "#{config_file}")
2777
+ Doing.logger.adjust_verbosity({ level: prev_level })
2778
+ Doing::Util.write_to_file(config_file, YAML.dump(config.settings), backup: true)
2779
+ Doing.logger.warn('Config:', "#{config_file} updated")
2708
2780
  end
2709
2781
  end
2710
2782
  end
data/doing.rdoc CHANGED
@@ -5,14 +5,14 @@ record of what you've been doing, complete with tag-based time tracking. The
5
5
  command line tool allows you to add entries, annotate with tags and notes, and
6
6
  view your entries with myriad options, with a focus on a "natural" language syntax.
7
7
 
8
- v2.0.24
8
+ v2.0.25
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
12
12
 
13
13
  Use a specific configuration file. Deprecated, set $DOING_CONFIG instead.
14
14
 
15
- [Default Value] /Users/ttscoff/.doingrc
15
+ [Default Value] /Users/ttscoff/.config/doing/config.yml
16
16
 
17
17
 
18
18
  === -f|--doing_file arg
@@ -385,63 +385,87 @@ Shell to generate for (bash, zsh, fish)
385
385
  [Must Match] (?i-mx:^[bzf](?:[ai]?sh)?$)
386
386
 
387
387
 
388
- ==== Command: <tt>config KEY_PATH</tt>
388
+ ==== Command: <tt>config </tt>
389
389
  Edit the configuration file or output a value from it
390
390
 
391
- Run without arguments, `doing config` opens your `.doingrc` in an editor.
391
+ Run without arguments, `doing config` opens your `config.yml` in an editor.
392
392
  If local configurations are found in the path between the current directory
393
- and `~/.doingrc`, a menu will allow you to select which to open in the editor.
393
+ and the root (/), a menu will allow you to select which to open in the editor.
394
394
 
395
395
  It will use the editor defined in `config_editor_app`, or one specified with `--editor`.
396
396
 
397
- Use `doing config -d` to output the configuration to the terminal, and
397
+ Use `doing config get` to output the configuration to the terminal, and
398
398
  provide a dot-separated key path to get a specific value. Shows the current value
399
399
  including keys/overrides set by local configs.
400
400
  ===== Options
401
- ===== -a APP_NAME
401
+ ===== -d|--[no-]dump
402
+ DEPRECATED
403
+
404
+
405
+
406
+ ===== -u|--[no-]update
407
+ DEPRECATED
408
+
409
+
410
+
411
+ ===== Commands
412
+ ====== Command: <tt>edit </tt>
413
+ Open config file in editor
414
+
415
+
416
+ ======= Options
417
+ ======= -a APP_NAME
402
418
 
403
419
  Application to use
404
420
 
405
421
  [Default Value] None
406
422
 
407
423
 
408
- ===== -b BUNDLE_ID
424
+ ======= -b BUNDLE_ID
409
425
 
410
426
  Application bundle id to use
411
427
 
412
428
  [Default Value] None
413
429
 
414
430
 
415
- ===== -e|--editor EDITOR
431
+ ======= -e|--editor EDITOR
416
432
 
417
433
  Editor to use
418
434
 
419
435
  [Default Value] None
420
436
 
421
437
 
422
- ===== -o|--output FORMAT
438
+ ======= -x
439
+ Use the config_editor_app defined in ~/.config/doing/config.yml (config_editor_app not set)
423
440
 
424
- Format for --dump (json|yaml|raw)
425
441
 
426
- [Default Value] yaml
427
- [Must Match] (?-mix:^(?:y(?:aml)?|j(?:son)?|r(?:aw)?)$)
442
+
443
+ ====== Command: <tt>get|dump </tt>
444
+ Output a key's value
428
445
 
429
446
 
430
- ===== -d|--dump
431
- Show a config key value based on arguments. Separate key paths with colons or dots, e.g. "export_templates.html". Empty arguments outputs the entire config.
447
+ ======= Options
448
+ ======= -o|--output FORMAT
432
449
 
450
+ Format for output (json|yaml|raw)
451
+
452
+ [Default Value] yaml
453
+ [Must Match] (?-mix:^(?:y(?:aml)?|j(?:son)?|r(?:aw)?)$)
433
454
 
434
455
 
435
- ===== -u|--update
436
- Update config file with missing configuration options
456
+ ====== Command: <tt>set </tt>
457
+ Set a key's value in the config file
437
458
 
438
459
 
460
+ ====== Command: <tt>undo </tt>
461
+ Undo the last change to a config file
439
462
 
440
- ===== -x
441
- Use the config_editor_app defined in ~/.doingrc (config_editor_app not set)
442
463
 
464
+ ====== Command: <tt>update|refresh </tt>
465
+ Update default config file, adding any missing keys
443
466
 
444
467
 
468
+ [Default Command] edit
445
469
  ==== Command: <tt>done|did ENTRY</tt>
446
470
  Add a completed item with @done(date). No argument finishes last entry.
447
471
 
@@ -1159,7 +1183,7 @@ Show time totals at the end of output
1159
1183
  ==== Command: <tt>open </tt>
1160
1184
  Open the "doing" file in an editor
1161
1185
 
1162
- `doing open` defaults to using the editor_app setting in /Users/ttscoff/.doingrc (not set).
1186
+ `doing open` defaults to using the editor_app setting in /Users/ttscoff/.config/doing/config.yml (not set).
1163
1187
  ===== Options
1164
1188
  ===== -a|--app APP_NAME
1165
1189
 
@@ -1734,7 +1758,7 @@ Tag the last X entries containing TAG.
1734
1758
 
1735
1759
 
1736
1760
  ===== -a|--autotag
1737
- Autotag entries based on autotag configuration in ~/.doingrc
1761
+ Autotag entries based on autotag configuration in ~/.config/doing/config.yml
1738
1762
 
1739
1763
 
1740
1764
 
data/example_plugin.rb CHANGED
@@ -14,13 +14,13 @@
14
14
  # Change what the plugin says by generating a template with
15
15
  # `doing template --type say`, saving it to a file, and
16
16
  # putting the path to that file in `export_templates->say` in
17
- # .doingrc.
17
+ # config.yml.
18
18
  #
19
19
  # export_templates:
20
20
  # say: /path/to/template.txt
21
21
  #
22
22
  # Use a different voice by adding a `say_voice` key to your
23
- # .doingrc. Use `say -v ?` to see available voices.
23
+ # config.yml. Use `say -v ?` to see available voices.
24
24
  #
25
25
  # say_voice: Zarvox
26
26