howzit 1.2.14 → 1.2.17

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,149 @@
1
+ module Howzit
2
+ module Util
3
+ class << self
4
+ def valid_command?(command)
5
+ cmd = command.split(' ')[0]
6
+ command_exist?(cmd)
7
+ end
8
+
9
+ def command_exist?(command)
10
+ exts = ENV.fetch('PATHEXT', '').split(::File::PATH_SEPARATOR)
11
+ if Pathname.new(command).absolute?
12
+ ::File.exist?(command) ||
13
+ exts.any? { |ext| ::File.exist?("#{command}#{ext}") }
14
+ else
15
+ ENV.fetch('PATH', '').split(::File::PATH_SEPARATOR).any? do |dir|
16
+ file = ::File.join(dir, command)
17
+ ::File.exist?(file) ||
18
+ exts.any? { |ext| ::File.exist?("#{file}#{ext}") }
19
+ end
20
+ end
21
+ end
22
+
23
+ # If either mdless or mdcat are installed, use that for highlighting
24
+ # markdown
25
+ def which_highlighter
26
+ if Howzit.options[:highlighter] =~ /auto/i
27
+ highlighters = %w[mdcat mdless]
28
+ highlighters.delete_if(&:nil?).select!(&:available?)
29
+ return nil if highlighters.empty?
30
+
31
+ hl = highlighters.first
32
+ args = case hl
33
+ when 'mdless'
34
+ '--no-pager'
35
+ end
36
+
37
+ [hl, args].join(' ')
38
+ else
39
+ hl = Howzit.options[:highlighter].split(/ /)[0]
40
+ if hl.available?
41
+ Howzit.options[:highlighter]
42
+ else
43
+ warn Color.template("{Rw}Error:{xbw} Specified highlighter (#{Howzit.options[:highlighter]}) not found, switching to auto")
44
+ Howzit.options[:highlighter] = 'auto'
45
+ which_highlighter
46
+ end
47
+ end
48
+ end
49
+
50
+ # When pagination is enabled, find the best (in my opinion) option,
51
+ # favoring environment settings
52
+ def which_pager
53
+ if Howzit.options[:pager] =~ /auto/i
54
+ pagers = [ENV['PAGER'], ENV['GIT_PAGER'],
55
+ 'bat', 'less', 'more', 'pager']
56
+ pagers.delete_if(&:nil?).select!(&:available?)
57
+ return nil if pagers.empty?
58
+
59
+ pg = pagers.first
60
+ args = case pg
61
+ when 'delta'
62
+ '--pager="less -FXr"'
63
+ when /^(less|more)$/
64
+ '-FXr'
65
+ when 'bat'
66
+ if Howzit.options[:highlight]
67
+ '--language Markdown --style plain --pager="less -FXr"'
68
+ else
69
+ '--style plain --pager="less -FXr"'
70
+ end
71
+ else
72
+ ''
73
+ end
74
+
75
+ [pg, args].join(' ')
76
+ else
77
+ pg = Howzit.options[:pager].split(/ /)[0]
78
+ if pg.available?
79
+ Howzit.options[:pager]
80
+ else
81
+ warn Color.template("{Rw}Error:{xbw} Specified pager (#{Howzit.options[:pager]}) not found, switching to auto")
82
+ Howzit.options[:pager] = 'auto'
83
+ which_pager
84
+ end
85
+ end
86
+ end
87
+
88
+ # Paginate the output
89
+ def page(text)
90
+ read_io, write_io = IO.pipe
91
+
92
+ input = $stdin
93
+
94
+ pid = Kernel.fork do
95
+ write_io.close
96
+ input.reopen(read_io)
97
+ read_io.close
98
+
99
+ # Wait until we have input before we start the pager
100
+ IO.select [input]
101
+
102
+ pager = which_pager
103
+
104
+ begin
105
+ exec(pager)
106
+ rescue SystemCallError => e
107
+ @log.error(e)
108
+ exit 1
109
+ end
110
+ end
111
+
112
+ read_io.close
113
+ write_io.write(text)
114
+ write_io.close
115
+
116
+ _, status = Process.waitpid2(pid)
117
+
118
+ status.success?
119
+ end
120
+
121
+ # print output to terminal
122
+ def show(string, opts = {})
123
+ options = {
124
+ color: true,
125
+ highlight: false,
126
+ wrap: 0
127
+ }
128
+
129
+ options.merge!(opts)
130
+
131
+ string = string.uncolor unless options[:color]
132
+
133
+ pipes = ''
134
+ if options[:highlight]
135
+ hl = which_highlighter
136
+ pipes = "|#{hl}" if hl
137
+ end
138
+
139
+ output = `echo #{Shellwords.escape(string.strip)}#{pipes}`.strip
140
+
141
+ if Howzit.options[:paginate]
142
+ page(output)
143
+ else
144
+ puts output
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
@@ -2,5 +2,5 @@
2
2
  # Primary module for this gem.
3
3
  module Howzit
4
4
  # Current Howzit version.
5
- VERSION = '1.2.14'.freeze
5
+ VERSION = '1.2.17'.freeze
6
6
  end
data/lib/howzit.rb CHANGED
@@ -1,8 +1,17 @@
1
- require 'howzit/version'
2
- require 'howzit/prompt'
3
- require 'howzit/colors'
4
- require 'howzit/buildnotes'
5
- require 'howzit/stringutils'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'howzit/version'
4
+ require_relative 'howzit/prompt'
5
+ require_relative 'howzit/colors'
6
+ require_relative 'howzit/stringutils'
7
+
8
+ require_relative 'howzit/util'
9
+ require_relative 'howzit/hash'
10
+ require_relative 'howzit/config'
11
+ require_relative 'howzit/task'
12
+ require_relative 'howzit/topic'
13
+ require_relative 'howzit/buildnote'
14
+
6
15
  require 'optparse'
7
16
  require 'shellwords'
8
17
  require 'pathname'
@@ -17,3 +26,30 @@ CONFIG_FILE = 'howzit.yaml'
17
26
  IGNORE_FILE = 'ignore.yaml'
18
27
  MATCHING_OPTIONS = %w[partial exact fuzzy beginswith].freeze
19
28
  MULTIPLE_OPTIONS = %w[first best all choose].freeze
29
+ HEADER_FORMAT_OPTIONS = %w[border block].freeze
30
+
31
+ module Howzit
32
+ class << self
33
+ attr_accessor :arguments, :cli_args
34
+ ##
35
+ ## Holds a Configuration object with methods and a @settings hash
36
+ ##
37
+ ## @return [Configuration] Configuration object
38
+ ##
39
+ def config
40
+ @config ||= Config.new
41
+ end
42
+
43
+ def inclusions
44
+ @inclusions ||= []
45
+ end
46
+
47
+ def options
48
+ config.options
49
+ end
50
+
51
+ def buildnote
52
+ @buildnote ||= BuildNote.new
53
+ end
54
+ end
55
+ end
@@ -1,40 +1,110 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Howzit::BuildNotes do
4
- subject(:ruby_gem) { Howzit::BuildNotes.new([]) }
3
+ describe Howzit::BuildNote do
4
+ subject(:buildnote) { Howzit.buildnote }
5
5
 
6
6
  describe ".new" do
7
7
  it "makes a new instance" do
8
- expect(ruby_gem).to be_a Howzit::BuildNotes
8
+ expect(buildnote).to be_a Howzit::BuildNote
9
9
  end
10
10
  end
11
11
  end
12
12
 
13
- describe Howzit::BuildNotes do
13
+ describe Howzit::Task do
14
+ subject(:task) { Howzit::Task.new(:run, 'List Directory', 'ls') }
15
+
16
+ describe ".new" do
17
+ it "makes a new task instance" do
18
+ expect(task).to be_a Howzit::Task
19
+ end
20
+ end
21
+ end
22
+
23
+ describe Howzit::Topic do
24
+ title = 'Test Title'
25
+ content = 'Test Content'
26
+ subject(:topic) { Howzit::Topic.new(title, content) }
27
+
28
+ describe ".new" do
29
+ it "makes a new topic instance" do
30
+ expect(topic).to be_a Howzit::Topic
31
+ end
32
+ it "has the correct title" do
33
+ expect(topic.title).to eq title
34
+ end
35
+ it "has the correct content" do
36
+ expect(topic.content).to eq content
37
+ end
38
+ end
39
+ end
40
+
41
+ describe Howzit::BuildNote do
14
42
  Dir.chdir('spec')
15
- how = Howzit::BuildNotes.new(['--no-upstream', '--default'])
16
- how.create_note
17
- subject { how }
43
+ Howzit.options[:include_upstream] = false
44
+ Howzit.options[:default] = true
45
+ hz = Howzit.buildnote
46
+
47
+ hz.create_note
48
+ subject(:how) { hz }
18
49
 
19
50
  describe ".note_file" do
20
51
  it "locates a build note file" do
21
- expect(subject.note_file).not_to be_empty
52
+ expect(how.note_file).not_to be_empty
53
+ end
54
+ end
55
+
56
+ describe ".grep" do
57
+ it "finds topic containing 'editable'" do
58
+ expect(how.grep('editable').map { |topic| topic.title }).to include('File Structure')
59
+ end
60
+ it "does not return non-matching topic" do
61
+ expect(how.grep('editable').map { |topic| topic.title }).not_to include('Build')
22
62
  end
23
63
  end
24
64
 
25
- describe ".grep_topics" do
26
- it "finds editable" do
27
- expect(subject.grep_topics('editable')).to include('File Structure')
28
- expect(subject.grep_topics('editable')).not_to include('Build')
65
+ describe ".find_topic" do
66
+ it "finds the File Structure topic" do
67
+ matches = how.find_topic('file struct')
68
+ expect(matches.count).to eq 1
69
+ expect(matches[0].title).to eq 'File Structure'
70
+ end
71
+ it "fuzzy matches" do
72
+ Howzit.options[:matching] = 'fuzzy'
73
+ matches = how.find_topic('flestct')
74
+ expect(matches.count).to eq 1
75
+ expect(matches[0].title).to eq 'File Structure'
76
+ end
77
+ it "succeeds with partial match" do
78
+ Howzit.options[:matching] = 'partial'
79
+ matches = how.find_topic('structure')
80
+ expect(matches.count).to eq 1
81
+ expect(matches[0].title).to eq 'File Structure'
82
+ end
83
+ it "succeeds with beginswith match" do
84
+ Howzit.options[:matching] = 'beginswith'
85
+ matches = how.find_topic('file')
86
+ expect(matches.count).to eq 1
87
+ expect(matches[0].title).to eq 'File Structure'
88
+ end
89
+ it "succeeds with exact match" do
90
+ Howzit.options[:matching] = 'exact'
91
+ matches = how.find_topic('file structure')
92
+ expect(matches.count).to eq 1
93
+ expect(matches[0].title).to eq 'File Structure'
94
+ end
95
+ it "fails with incomplete exact match" do
96
+ Howzit.options[:matching] = 'exact'
97
+ matches = how.find_topic('file struct')
98
+ expect(matches.count).to eq 0
29
99
  end
30
100
  end
31
101
 
32
- describe ".list_topic_titles" do
33
- it "finds 4 topics" do
34
- expect(subject.topics.keys.count).to eq 4
102
+ describe ".topics" do
103
+ it "contains 4 topics" do
104
+ expect(how.list_topics.count).to eq 4
35
105
  end
36
- it "outputs a newline-separated string" do
37
- expect(subject.list_topic_titles.scan(/\n/).count).to eq 3
106
+ it "outputs a newline-separated string for completion" do
107
+ expect(how.list_completions.scan(/\n/).count).to eq 3
38
108
  end
39
109
  end
40
110
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: howzit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.14
4
+ version: 1.2.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-02 00:00:00.000000000 Z
11
+ date: 2022-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -268,10 +268,16 @@ files:
268
268
  - howzit.gemspec
269
269
  - lib/.rubocop.yml
270
270
  - lib/howzit.rb
271
+ - lib/howzit/buildnote.rb
271
272
  - lib/howzit/buildnotes.rb
272
273
  - lib/howzit/colors.rb
274
+ - lib/howzit/config.rb
275
+ - lib/howzit/hash.rb
273
276
  - lib/howzit/prompt.rb
274
277
  - lib/howzit/stringutils.rb
278
+ - lib/howzit/task.rb
279
+ - lib/howzit/topic.rb
280
+ - lib/howzit/util.rb
275
281
  - lib/howzit/version.rb
276
282
  - spec/.rubocop.yml
277
283
  - spec/ruby_gem_spec.rb