howzit 2.0.12 → 2.0.15

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: 700c444e11477c62c6de0f06b81b3029b21f3363f507c5a6cab927f2365d2be5
4
- data.tar.gz: be862c2c31427abae2428a024009aea0f73885a5dc9652c5d2b5f308c181ca3b
3
+ metadata.gz: bb673909d87ac094a2111c1f6fa364fb54183059267e009886562c89a81310d7
4
+ data.tar.gz: ec766bf5d2f3b3454a289f429e28c12f19545a79dfe6f10d29f0afb04abdc9b2
5
5
  SHA512:
6
- metadata.gz: d07c309680eef72f5edb3b41d40354aa9cefa1b6efebd1c0dfbaa59f7cbfc95c6211433f081b6f21afa069cd5ae30f79dc42f1a4a08c96680b533b16519ca25b
7
- data.tar.gz: '08ca9d51ec3793c1750d70f500bde1e68c1f327cd41d0b92839c317d6a421f96cbb8ef2f03204ab6cfe1ddb1d83a497084aa9590233d6ceb860921fdb473267e'
6
+ metadata.gz: b5f2e3624bad256848b1c2d8a4bc95dcbbee5d8cf0e2c63efa79b139ca3a330ce773edb2e68375ea72158de0ce69ffaedd7673f36cbee5cd937c255ccaa3e5fe
7
+ data.tar.gz: f024cd0ffb6b41ab6184cf36ef65e644e90f5ab7e5c57b8a2c9cc1be404802f992f708464a3a2ab984122fddb4880ec704cda85dd371aeee735b417e15d942c2
data/.rubocop.yml CHANGED
@@ -6,6 +6,7 @@ AllCops:
6
6
 
7
7
  Metrics/BlockLength:
8
8
  Exclude:
9
+ - Rakefile
9
10
  - bin/howzit
10
11
  - lib/*.rb
11
12
 
data/.travis.yml CHANGED
@@ -4,10 +4,13 @@ sudo: required
4
4
  dist: trusty
5
5
  cache: bundler
6
6
  rvm:
7
+ - ruby-2.6.4
7
8
  - ruby-2.7.0
8
9
  - ruby-3.0.1
9
10
  install:
10
- - gem uninstall bundler
11
11
  - gem install bundler --version '2.2.29'
12
12
  - bundle install
13
13
  script: "bundle exec rspec spec --exclude-pattern 'cli*'"
14
+ branches:
15
+ only:
16
+ - main
data/CHANGELOG.md CHANGED
@@ -1,3 +1,36 @@
1
+ ### 2.0.15
2
+
3
+ 2022-08-05 17:16
4
+
5
+ #### IMPROVED
6
+
7
+ - -R can take an argument to filter results
8
+ - Show a topic preview when using fzf to select from available topics
9
+ - Paginate help output
10
+ - Refactor Topic.run
11
+
12
+ #### FIXED
13
+
14
+ - Invalid options for more pager
15
+ - Error running grep command
16
+ - Show method not accepting paginate option
17
+
18
+ ### 2.0.14
19
+
20
+ 2022-08-05 13:24
21
+
22
+ #### FIXED
23
+
24
+ - Travis CI fixes
25
+
26
+ ### 2.0.13
27
+
28
+ 2022-08-05 13:19
29
+
30
+ #### IMPROVED
31
+
32
+ - Add tests for more ruby versions via Docker
33
+
1
34
  ### 2.0.12
2
35
 
3
36
  2022-08-05 11:27
data/Rakefile CHANGED
@@ -5,6 +5,7 @@ require 'bundler/gem_tasks'
5
5
  require 'rspec/core/rake_task'
6
6
  require 'rubocop/rake_task'
7
7
  require 'yard'
8
+ require 'tty-spinner'
8
9
 
9
10
  task default: %i[test yard]
10
11
 
@@ -34,3 +35,43 @@ desc 'Changelog version check'
34
35
  task :cver do
35
36
  puts IO.read(File.join(File.dirname(__FILE__), 'CHANGELOG.md')).match(/^#+ (\d+\.\d+\.\d+(\w+)?)/)[1]
36
37
  end
38
+
39
+ desc 'Run tests in Docker'
40
+ task :dockertest, :version, :login do |_, args|
41
+ args.with_defaults(version: 'all', login: false)
42
+ case args[:version]
43
+ when /^a/
44
+ %w[6 7 3].each do |v|
45
+ Rake::Task['dockertest'].reenable
46
+ Rake::Task['dockertest'].invoke(v, false)
47
+ end
48
+ Process.exit 0
49
+ when /^3/
50
+ img = 'howzittest3'
51
+ file = 'docker/Dockerfile-3.0'
52
+ when /6$/
53
+ img = 'howzittest26'
54
+ file = 'docker/Dockerfile-2.6'
55
+ when /(^2|7$)/
56
+ img = 'howzittest27'
57
+ file = 'docker/Dockerfile-2.7'
58
+ else
59
+ img = 'howzittest'
60
+ file = 'docker/Dockerfile'
61
+ end
62
+
63
+ puts `docker build . --file #{file} -t #{img}`
64
+
65
+ exec "docker run -v #{File.dirname(__FILE__)}:/howzit -it #{img} /bin/bash -l" if args[:login]
66
+
67
+ spinner = TTY::Spinner.new('[:spinner] Running tests ...', hide_cursor: true)
68
+
69
+ spinner.auto_spin
70
+ res = `docker run --rm -v #{File.dirname(__FILE__)}:/howzit -it #{img}`
71
+ # commit = puts `bash -c "docker commit $(docker ps -a|grep #{img}|awk '{print $1}'|head -n 1) #{img}"`.strip
72
+ spinner.success
73
+ spinner.stop
74
+
75
+ puts res
76
+ # puts commit&.empty? ? "Error commiting Docker tag #{img}" : "Committed Docker tag #{img}"
77
+ end
data/bin/howzit CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env ruby -W1
1
+ #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
4
  $LOAD_PATH.unshift File.join(__dir__, '..', 'lib')
@@ -49,7 +49,8 @@ OptionParser.new do |opts|
49
49
  Howzit.options[:list_topics] = true
50
50
  end
51
51
 
52
- opts.on('-R', '--list-runnable', 'List topics containing @ directives (verbose)') do
52
+ opts.on('-R', '--list-runnable [PATTERN]', 'List topics containing @ directives (verbose)') do |pat|
53
+ Howzit.options[:for_topic] = pat
53
54
  Howzit.options[:list_runnable] = true
54
55
  end
55
56
 
@@ -201,7 +202,7 @@ OptionParser.new do |opts|
201
202
  opts.separator("\n Misc:\n\n") #=================================================================== MISC
202
203
 
203
204
  opts.on('-h', '--help', 'Display this screen') do
204
- puts opts
205
+ Howzit::Util.page opts.to_s
205
206
  Process.exit 0
206
207
  end
207
208
 
data/docker/Dockerfile ADDED
@@ -0,0 +1,11 @@
1
+ FROM ruby:3.0.1
2
+ # RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
3
+ RUN mkdir /howzit
4
+ WORKDIR /howzit
5
+ # COPY ./ /howzit/
6
+ RUN gem install bundler:2.2.17
7
+ RUN apt-get update -y
8
+ RUN apt-get install -y less vim
9
+ COPY ./docker/inputrc /root/.inputrc
10
+ COPY ./docker/bash_profile /root/.bash_profile
11
+ CMD ["scripts/runtests.sh"]
@@ -0,0 +1,11 @@
1
+ FROM ruby:2.6
2
+ # RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
3
+ RUN mkdir /howzit
4
+ WORKDIR /howzit
5
+ # COPY ./ /howzit/
6
+ RUN gem install bundler:2.2.17
7
+ RUN apt-get update -y
8
+ RUN apt-get install -y less vim
9
+ COPY ./docker/inputrc /root/.inputrc
10
+ COPY ./docker/bash_profile /root/.bash_profile
11
+ CMD ["scripts/runtests.sh"]
@@ -0,0 +1,11 @@
1
+ FROM ruby:2.7
2
+ # RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
3
+ RUN mkdir /howzit
4
+ WORKDIR /howzit
5
+ # COPY ./ /howzit/
6
+ RUN gem install bundler:2.2.17
7
+ RUN apt-get update -y
8
+ RUN apt-get install -y less vim
9
+ COPY ./docker/inputrc /root/.inputrc
10
+ COPY ./docker/bash_profile /root/.bash_profile
11
+ CMD ["scripts/runtests.sh"]
@@ -0,0 +1,11 @@
1
+ FROM ruby:3.0.0
2
+ # RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
3
+ RUN mkdir /howzit
4
+ WORKDIR /howzit
5
+ # COPY ./ /howzit/
6
+ RUN gem install bundler:2.2.17
7
+ RUN apt-get update -y
8
+ RUN apt-get install -y less vim
9
+ COPY ./docker/inputrc /root/.inputrc
10
+ COPY ./docker/bash_profile /root/.bash_profile
11
+ CMD ["scripts/runtests.sh"]
@@ -0,0 +1,13 @@
1
+ #!/bin/bash
2
+ export GLI_DEBUG=true
3
+ export EDITOR="/usr/bin/vim"
4
+ alias b="bundle exec bin/howzit"
5
+
6
+ shopt -s nocaseglob
7
+ shopt -s histappend
8
+ shopt -s histreedit
9
+ shopt -s histverify
10
+ shopt -s cmdhist
11
+
12
+ cd /howzit
13
+ bundle install
data/docker/inputrc ADDED
@@ -0,0 +1,57 @@
1
+ "\e[3~": delete-char
2
+ "\ex": 'cd !$ \015ls\015'
3
+ "\ez": 'cd -\015'
4
+ "\e\C-m": '\C-a "$(\C-e|fzf)"\C-a'
5
+ "\e/": '"$(!!|fzf)"\C-a \C-m\C-m'
6
+ # these allow you to use alt+left/right arrow keys
7
+ # to jump the cursor over words
8
+ "\e[1;5C": forward-word
9
+ "\e[1;5D": backward-word
10
+ # "\e[D": backward-word
11
+ # "\e[C": forward-word
12
+ "\ea": menu-complete
13
+ # TAB: menu-complete
14
+ # "\e[Z": "\e-1\C-i"
15
+
16
+ "\e\C-l": history-and-alias-expand-line
17
+
18
+ # these allow you to start typing a command and
19
+ # use the up/down arrow to auto complete from
20
+ # commands in your history
21
+ "\e[B": history-search-forward
22
+ "\e[A": history-search-backward
23
+ "\ew": history-search-backward
24
+ "\es": history-search-forward
25
+ # this lets you hit tab to auto-complete a file or
26
+ # directory name ignoring case
27
+ set completion-ignore-case On
28
+ set mark-symlinked-directories On
29
+ set completion-prefix-display-length 2
30
+ set bell-style none
31
+ # set bell-style visible
32
+ set meta-flag on
33
+ set convert-meta off
34
+ set input-meta on
35
+ set output-meta on
36
+ set show-all-if-ambiguous on
37
+ set show-all-if-unmodified on
38
+ set completion-map-case on
39
+ set visible-stats on
40
+
41
+ # Do history expansion when space entered?
42
+ $if bash
43
+ Space: magic-space
44
+ $endif
45
+
46
+ # Show extra file information when completing, like `ls -F` does
47
+ set visible-stats on
48
+
49
+ # Be more intelligent when autocompleting by also looking at the text after
50
+ # the cursor. For example, when the current line is "cd ~/src/mozil", and
51
+ # the cursor is on the "z", pressing Tab will not autocomplete it to "cd
52
+ # ~/src/mozillail", but to "cd ~/src/mozilla". (This is supported by the
53
+ # Readline used by Bash 4.)
54
+ set skip-completed-text on
55
+
56
+ # Use Alt/Meta + Delete to delete the preceding word
57
+ "\e[3;3~": kill-word
data/howzit.gemspec CHANGED
@@ -38,6 +38,7 @@ Gem::Specification.new do |spec|
38
38
  spec.add_development_dependency 'yard', '~> 0.9.5'
39
39
  spec.add_development_dependency 'redcarpet', '~> 3.2'
40
40
  spec.add_development_dependency 'github-markup', '~> 1.3'
41
+ spec.add_development_dependency 'tty-spinner', '~> 0.9'
41
42
 
42
43
  spec.add_runtime_dependency 'mdless', '~> 1.0', '>= 1.0.28'
43
44
  spec.add_runtime_dependency 'tty-screen', '~> 0.8'
@@ -32,6 +32,11 @@ module Howzit
32
32
  read_help(file)
33
33
  end
34
34
 
35
+ ##
36
+ ## Inspect
37
+ ##
38
+ ## @return description
39
+ ##
35
40
  def inspect
36
41
  puts "#<Howzit::BuildNote @topics=[#{@topics.count}]>"
37
42
  end
@@ -55,7 +60,8 @@ module Howzit
55
60
  ##
56
61
  ## @param term [String] The search term
57
62
  ##
58
- def find_topic(term)
63
+ def find_topic(term = nil)
64
+ return @topics if term.nil?
59
65
  @topics.filter do |topic|
60
66
  rx = term.to_rx
61
67
  topic.title.downcase =~ rx
@@ -127,7 +133,8 @@ module Howzit
127
133
  def list_runnable
128
134
  output = []
129
135
  output.push(%({bg}"Runnable" Topics:{x}\n).c)
130
- @topics.each do |topic|
136
+
137
+ find_topic(Howzit.options[:for_topic]).each do |topic|
131
138
  s_out = []
132
139
 
133
140
  topic.tasks.each do |task|
@@ -243,6 +250,11 @@ module Howzit
243
250
  Process.exit 0
244
251
  end
245
252
 
253
+ ##
254
+ ## Accessor method for note_file (path to located build note)
255
+ ##
256
+ ## @return [String] path
257
+ ##
246
258
  def note_file
247
259
  @note_file ||= find_note_file
248
260
  end
@@ -581,7 +593,7 @@ module Howzit
581
593
  ARGV.length.times do
582
594
  ARGV.shift
583
595
  end
584
- res = yn("No build notes file found, create one?", true)
596
+ res = yn("No build notes file found, create one?", false)
585
597
  create_note if res
586
598
  Process.exit 1
587
599
  end
@@ -620,15 +632,15 @@ module Howzit
620
632
 
621
633
  topic_matches = []
622
634
  if Howzit.options[:grep]
623
- matches = grep_topics(Howzit.options[:grep])
635
+ matches = grep(Howzit.options[:grep])
624
636
  case Howzit.options[:multiple_matches]
625
637
  when :all
626
- topic_matches.concat(matches.sort)
638
+ topic_matches.concat(matches.sort_by(&:title))
627
639
  else
628
- topic_matches.concat(Prompt.choose(matches))
640
+ topic_matches.concat(Prompt.choose(matches.map(&:title), height: :max))
629
641
  end
630
642
  elsif Howzit.options[:choose]
631
- titles = Prompt.choose(list_topics)
643
+ titles = Prompt.choose(list_topics, height: :max)
632
644
  titles.each { |title| topic_matches.push(find_topic(title)[0]) }
633
645
  # If there are arguments use those to search for a matching topic
634
646
  elsif !Howzit.cli_args.empty?
data/lib/howzit/colors.rb CHANGED
@@ -243,6 +243,7 @@ module Howzit
243
243
 
244
244
  ATTRIBUTES.each do |c, v|
245
245
  new_method = <<-EOSCRIPT
246
+ # Color string as #{c}
246
247
  def #{c}(string = nil)
247
248
  result = ''
248
249
  result << "\e[#{v}m" if Howzit::Color.coloring?
@@ -266,6 +267,7 @@ module Howzit
266
267
 
267
268
  # Accept brightwhite in addition to boldwhite
268
269
  new_method = <<-EOSCRIPT
270
+ # color string as #{c}
269
271
  def #{c.to_s.sub(/bold/, 'bright')}(string = nil)
270
272
  result = ''
271
273
  result << "\e[#{v}m" if Howzit::Color.coloring?
@@ -286,6 +288,13 @@ module Howzit
286
288
  module_eval(new_method)
287
289
  end
288
290
 
291
+ ##
292
+ ## Generate escape codes for hex colors
293
+ ##
294
+ ## @param hex [String] The hexadecimal color code
295
+ ##
296
+ ## @return [String] ANSI escape string
297
+ ##
289
298
  def rgb(hex)
290
299
  is_bg = hex.match(/^bg?#/) ? true : false
291
300
  hex_string = hex.sub(/^([fb]g?)?#/, '')
data/lib/howzit/config.rb CHANGED
@@ -89,6 +89,7 @@ module Howzit
89
89
  flags = {
90
90
  choose: false,
91
91
  default: false,
92
+ for_topic: nil,
92
93
  grep: nil,
93
94
  list_runnable: false,
94
95
  list_runnable_titles: false,
data/lib/howzit/prompt.rb CHANGED
@@ -78,15 +78,21 @@ module Howzit
78
78
  ##
79
79
  ## @return [Array] the selected results
80
80
  ##
81
- def choose(matches)
81
+ def choose(matches, height: :auto)
82
+ height = if height == :auto
83
+ matches.count + 3
84
+ else
85
+ TTY::Screen.rows
86
+ end
82
87
  if Util.command_exist?('fzf')
83
88
  settings = [
84
89
  '-0',
85
90
  '-1',
86
91
  '-m',
87
- "--height=#{matches.count + 3}",
92
+ "--height=#{height}",
88
93
  '--header="Use tab to mark multiple selections, enter to display/run"',
89
- '--prompt="Select a section > "'
94
+ '--prompt="Select a section > "',
95
+ '--preview="howzit {}"'
90
96
  ]
91
97
  res = `echo #{Shellwords.escape(matches.join("\n"))} | fzf #{settings.join(' ')}`.strip
92
98
  if res.nil? || res.empty?
data/lib/howzit/task.rb CHANGED
@@ -17,14 +17,160 @@ module Howzit
17
17
  @default = default
18
18
  end
19
19
 
20
+ ##
21
+ ## Inspect
22
+ ##
23
+ ## @return [String] description
24
+ ##
20
25
  def inspect
21
26
  %(<#Howzit::Task @type=:#{@type} @title="#{@title}" @block?=#{@action.split(/\n/).count > 1}>)
22
27
  end
23
28
 
29
+ ##
30
+ ## Output string representation
31
+ ##
32
+ ## @return [String] string representation of the object.
33
+ ##
24
34
  def to_s
25
35
  @title
26
36
  end
27
37
 
38
+ ##
39
+ ## Execute a block type
40
+ ##
41
+ def run_block
42
+ Howzit.console.info "{bg}Running block {bw}#{@title}{x}".c if Howzit.options[:log_level] < 2
43
+ block = @action
44
+ script = Tempfile.new('howzit_script')
45
+ begin
46
+ script.write(block)
47
+ script.close
48
+ File.chmod(0o777, script.path)
49
+ system(%(/bin/sh -c "#{script.path}"))
50
+ ensure
51
+ script.close
52
+ script.unlink
53
+ end
54
+ end
55
+
56
+ ##
57
+ ## Execute an include task
58
+ ##
59
+ ## @return [Integer] number of tasks executed
60
+ ##
61
+ def run_include
62
+ output = []
63
+ matches = Howzit.buildnote.find_topic(@action)
64
+ raise "Topic not found: #{@action}" if matches.empty?
65
+
66
+ $stderr.puts "{by}Running tasks from {bw}#{matches[0].title}{x}".c if Howzit.options[:log_level] < 2
67
+ output.concat(matches[0].run(nested: true))
68
+ $stderr.puts "{by}End include: #{matches[0].tasks.count} tasks{x}".c if Howzit.options[:log_level] < 2
69
+ [output, matches[0].tasks.count]
70
+ end
71
+
72
+ ##
73
+ ## Execute a run task
74
+ ##
75
+ def run_run
76
+ title = Howzit.options[:show_all_code] ? @action : @title
77
+ $stderr.puts "{bg}Running {bw}#{title}{x}".c if Howzit.options[:log_level] < 2
78
+ system(@action)
79
+ end
80
+
81
+ ##
82
+ ## Execute a copy task
83
+ ##
84
+ def run_copy
85
+ title = Howzit.options[:show_all_code] ? @action : @title
86
+ $stderr.puts "{bg}Copied {bw}#{title}{bg} to clipboard{x}".c if Howzit.options[:log_level] < 2
87
+ os_copy(@action)
88
+ end
89
+
90
+ ##
91
+ ## Platform-agnostic copy-to-clipboard
92
+ ##
93
+ ## @param string [String] The string to copy
94
+ ##
95
+ def os_copy(string)
96
+ os = RbConfig::CONFIG['target_os']
97
+ out = "{bg}Copying {bw}#{string}".c
98
+ case os
99
+ when /darwin.*/i
100
+ $stderr.puts "#{out} (macOS){x}".c if Howzit.options[:log_level].zero?
101
+ `echo #{Shellwords.escape(string)}'\\c'|pbcopy`
102
+ when /mingw|mswin/i
103
+ $stderr.puts "#{out} (Windows){x}".c if Howzit.options[:log_level].zero?
104
+ `echo #{Shellwords.escape(string)} | clip`
105
+ else
106
+ if 'xsel'.available?
107
+ $stderr.puts "#{out} (Linux, xsel){x}".c if Howzit.options[:log_level].zero?
108
+ `echo #{Shellwords.escape(string)}'\\c'|xsel -i`
109
+ elsif 'xclip'.available?
110
+ $stderr.puts "#{out} (Linux, xclip){x}".c if Howzit.options[:log_level].zero?
111
+ `echo #{Shellwords.escape(string)}'\\c'|xclip -i`
112
+ else
113
+ $stderr.puts out if Howzit.options[:log_level].zero?
114
+ $stderr.puts 'Unable to determine executable for clipboard.'
115
+ end
116
+ end
117
+ end
118
+
119
+ ##
120
+ ## Platform-agnostic open command
121
+ ##
122
+ ## @param command [String] The command
123
+ ##
124
+ def os_open(command)
125
+ os = RbConfig::CONFIG['target_os']
126
+ out = "{bg}Opening {bw}#{command}".c
127
+ case os
128
+ when /darwin.*/i
129
+ Howzit.console.debug "#{out} (macOS){x}".c if Howzit.options[:log_level] < 2
130
+ `open #{Shellwords.escape(command)}`
131
+ when /mingw|mswin/i
132
+ Howzit.console.debug "#{out} (Windows){x}".c if Howzit.options[:log_level] < 2
133
+ `start #{Shellwords.escape(command)}`
134
+ else
135
+ if 'xdg-open'.available?
136
+ Howzit.console.debug "#{out} (Linux){x}".c if Howzit.options[:log_level] < 2
137
+ `xdg-open #{Shellwords.escape(command)}`
138
+ else
139
+ Howzit.console.debug out if Howzit.options[:log_level] < 2
140
+ Howzit.console.debug 'Unable to determine executable for `open`.'
141
+ end
142
+ end
143
+ end
144
+
145
+ ##
146
+ ## Execute the task
147
+ ##
148
+ def run
149
+ output = []
150
+ tasks = 1
151
+ if @type == :block
152
+ run_block
153
+ else
154
+ case @type
155
+ when :include
156
+ output, tasks = run_include
157
+ when :run
158
+ run_run
159
+ when :copy
160
+ run_copy
161
+ when :open
162
+ os_open(@action)
163
+ end
164
+ end
165
+
166
+ [output, tasks]
167
+ end
168
+
169
+ ##
170
+ ## Output terminal-formatted list item
171
+ ##
172
+ ## @return [String] List representation of the object.
173
+ ##
28
174
  def to_list
29
175
  " * #{@type}: #{@title.preserve_escapes}"
30
176
  end
data/lib/howzit/topic.rb CHANGED
@@ -56,52 +56,16 @@ module Howzit
56
56
  task_count = Howzit.buildnote.find_topic(task.action)[0].tasks.count
57
57
  " (#{task_count} tasks)"
58
58
  else
59
- ""
59
+ ''
60
60
  end
61
61
  q = %({bg}#{task.type.to_s.capitalize} {xw}"{bw}#{task.title}{xw}"#{note}{x}).c
62
62
  res = Prompt.yn(q, default: task.default)
63
63
  next unless res
64
64
 
65
65
  end
66
-
67
- if task.type == :block
68
- Howzit.console.info "{bg}Running block {bw}#{title}{x}".c if Howzit.options[:log_level] < 2
69
- block = task.action
70
- script = Tempfile.new('howzit_script')
71
- begin
72
- script.write(block)
73
- script.close
74
- File.chmod(0777, script.path)
75
- system(%(/bin/sh -c "#{script.path}"))
76
- tasks += 1
77
- ensure
78
- script.close
79
- script.unlink
80
- end
81
- else
82
- title = Howzit.options[:show_all_code] ? task.action : task.title
83
- case task.type
84
- when :include
85
- matches = Howzit.buildnote.find_topic(task.action)
86
- raise "Topic not found: #{task.action}" if matches.empty?
87
-
88
- $stderr.puts "{by}Running tasks from {bw}#{matches[0].title}{x}".c if Howzit.options[:log_level] < 2
89
- output.push(matches[0].run(nested: true))
90
- $stderr.puts "{by}End include: #{matches[0].tasks.count} tasks{x}".c if Howzit.options[:log_level] < 2
91
- tasks += matches[0].tasks.count
92
- when :run
93
- $stderr.puts "{bg}Running {bw}#{title}{x}".c if Howzit.options[:log_level] < 2
94
- system(task.action)
95
- tasks += 1
96
- when :copy
97
- $stderr.puts "{bg}Copied {bw}#{title}{bg} to clipboard{x}".c if Howzit.options[:log_level] < 2
98
- os_copy(task.action)
99
- tasks += 1
100
- when :open
101
- os_open(task.action)
102
- tasks += 1
103
- end
104
- end
66
+ run_output, total = task.run
67
+ output.concat(run_output)
68
+ tasks += total
105
69
  end
106
70
  else
107
71
  Howzit.console.warn "{r}--run: No {br}@directive{xr} found in {bw}#{@title}{x}".c
@@ -113,61 +77,6 @@ module Howzit
113
77
  output
114
78
  end
115
79
 
116
- ##
117
- ## Platform-agnostic copy-to-clipboard
118
- ##
119
- ## @param string [String] The string to copy
120
- ##
121
- def os_copy(string)
122
- os = RbConfig::CONFIG['target_os']
123
- out = "{bg}Copying {bw}#{string}".c
124
- case os
125
- when /darwin.*/i
126
- $stderr.puts "#{out} (macOS){x}".c if Howzit.options[:log_level].zero?
127
- `echo #{Shellwords.escape(string)}'\\c'|pbcopy`
128
- when /mingw|mswin/i
129
- $stderr.puts "#{out} (Windows){x}".c if Howzit.options[:log_level].zero?
130
- `echo #{Shellwords.escape(string)} | clip`
131
- else
132
- if 'xsel'.available?
133
- $stderr.puts "#{out} (Linux, xsel){x}".c if Howzit.options[:log_level].zero?
134
- `echo #{Shellwords.escape(string)}'\\c'|xsel -i`
135
- elsif 'xclip'.available?
136
- $stderr.puts "#{out} (Linux, xclip){x}".c if Howzit.options[:log_level].zero?
137
- `echo #{Shellwords.escape(string)}'\\c'|xclip -i`
138
- else
139
- $stderr.puts out if Howzit.options[:log_level].zero?
140
- $stderr.puts 'Unable to determine executable for clipboard.'
141
- end
142
- end
143
- end
144
-
145
- ##
146
- ## Platform-agnostic open command
147
- ##
148
- ## @param command [String] The command
149
- ##
150
- def os_open(command)
151
- os = RbConfig::CONFIG['target_os']
152
- out = "{bg}Opening {bw}#{command}".c
153
- case os
154
- when /darwin.*/i
155
- Howzit.console.debug "#{out} (macOS){x}".c if Howzit.options[:log_level] < 2
156
- `open #{Shellwords.escape(command)}`
157
- when /mingw|mswin/i
158
- Howzit.console.debug "#{out} (Windows){x}".c if Howzit.options[:log_level] < 2
159
- `start #{Shellwords.escape(command)}`
160
- else
161
- if 'xdg-open'.available?
162
- Howzit.console.debug "#{out} (Linux){x}".c if Howzit.options[:log_level] < 2
163
- `xdg-open #{Shellwords.escape(command)}`
164
- else
165
- Howzit.console.debug out if Howzit.options[:log_level] < 2
166
- Howzit.console.debug 'Unable to determine executable for `open`.'
167
- end
168
- end
169
- end
170
-
171
80
  # Output a topic with fancy title and bright white text.
172
81
  #
173
82
  # @param options [Hash] The options
data/lib/howzit/util.rb CHANGED
@@ -4,7 +4,6 @@ module Howzit
4
4
  # Util class
5
5
  module Util
6
6
  class << self
7
-
8
7
  ##
9
8
  ## Read a file with UTF-8 encoding and
10
9
  ## leading/trailing whitespace removed
@@ -90,7 +89,7 @@ module Howzit
90
89
  args = case pg
91
90
  when 'delta'
92
91
  '--pager="less -FXr"'
93
- when /^(less|more)$/
92
+ when 'less'
94
93
  '-FXr'
95
94
  when 'bat'
96
95
  if Howzit.options[:highlight]
@@ -153,6 +152,7 @@ module Howzit
153
152
  options = {
154
153
  color: true,
155
154
  highlight: false,
155
+ paginate: true,
156
156
  wrap: 0
157
157
  }
158
158
 
@@ -168,7 +168,7 @@ module Howzit
168
168
 
169
169
  output = `echo #{Shellwords.escape(string.strip)}#{pipes}`.strip
170
170
 
171
- if Howzit.options[:paginate]
171
+ if options[:paginate] && Howzit.options[:paginate]
172
172
  page(output)
173
173
  else
174
174
  puts output
@@ -3,5 +3,5 @@
3
3
  # Primary module for this gem.
4
4
  module Howzit
5
5
  # Current Howzit version.
6
- VERSION = '2.0.12'
6
+ VERSION = '2.0.15'
7
7
  end
data/lib/howzit.rb CHANGED
@@ -55,18 +55,30 @@ module Howzit
55
55
  @config ||= Config.new
56
56
  end
57
57
 
58
+ ##
59
+ ## Array for tracking inclusions and avoiding duplicates in output
60
+ ##
58
61
  def inclusions
59
62
  @inclusions ||= []
60
63
  end
61
64
 
65
+ ##
66
+ ## Module storage for Howzit::Config.options
67
+ ##
62
68
  def options
63
69
  config.options
64
70
  end
65
71
 
72
+ ##
73
+ ## Module storage for buildnote
74
+ ##
66
75
  def buildnote
67
76
  @buildnote ||= BuildNote.new
68
77
  end
69
78
 
79
+ ##
80
+ ## Convenience method for logging with Howzit.console.warn, etc.
81
+ ##
70
82
  def console
71
83
  @console ||= Howzit::ConsoleLogger.new(options[:log_level])
72
84
  end
@@ -0,0 +1,4 @@
1
+ #!/bin/bash
2
+
3
+ bundle install
4
+ rake test
data/spec/task_spec.rb CHANGED
@@ -15,4 +15,10 @@ describe Howzit::Task do
15
15
  expect(task).to be_a Howzit::Task
16
16
  end
17
17
  end
18
+
19
+ describe ".to_s" do
20
+ it "outputs title string" do
21
+ expect(task.to_s).to match(/List Directory/)
22
+ end
23
+ end
18
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: howzit
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.12
4
+ version: 2.0.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
@@ -220,6 +220,20 @@ dependencies:
220
220
  - - "~>"
221
221
  - !ruby/object:Gem::Version
222
222
  version: '1.3'
223
+ - !ruby/object:Gem::Dependency
224
+ name: tty-spinner
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '0.9'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '0.9'
223
237
  - !ruby/object:Gem::Dependency
224
238
  name: mdless
225
239
  requirement: !ruby/object:Gem::Requirement
@@ -289,6 +303,12 @@ files:
289
303
  - README.md
290
304
  - Rakefile
291
305
  - bin/howzit
306
+ - docker/Dockerfile
307
+ - docker/Dockerfile-2.6
308
+ - docker/Dockerfile-2.7
309
+ - docker/Dockerfile-3.0
310
+ - docker/bash_profile
311
+ - docker/inputrc
292
312
  - fish/completions/bld.fish
293
313
  - fish/completions/fisher.fish
294
314
  - fish/completions/howzit.fish
@@ -307,6 +327,7 @@ files:
307
327
  - lib/howzit/topic.rb
308
328
  - lib/howzit/util.rb
309
329
  - lib/howzit/version.rb
330
+ - scripts/runtests.sh
310
331
  - spec/.rubocop.yml
311
332
  - spec/buildnote_spec.rb
312
333
  - spec/cli_spec.rb