marked-conductor 1.0.6 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,6 +11,13 @@ module Conductor
11
11
  parse_condition
12
12
  end
13
13
 
14
+ ##
15
+ ## @brief Splits booleans and tests components.
16
+ ##
17
+ ## @param condition The condition to test
18
+ ##
19
+ ## @return [Boolean] test result
20
+ ##
14
21
  def split_booleans(condition)
15
22
  split = condition.split(/ ((?:AND )?NOT|AND|OR) /)
16
23
 
@@ -21,7 +28,7 @@ module Conductor
21
28
  bool = nil
22
29
  prev = false
23
30
  split.each do |cond|
24
- if cond =~ /((?:AND )?NOT|AND|OR)/
31
+ if /((?:AND )?NOT|AND|OR|&&|\|\||!!)/.match?(cond)
25
32
  bool = cond.bool_to_symbol
26
33
  next
27
34
  end
@@ -44,6 +51,15 @@ module Conductor
44
51
  end
45
52
  end
46
53
 
54
+ ##
55
+ ## @brief Test operators
56
+ ##
57
+ ## @param value1 Value
58
+ ## @param value2 Value to test
59
+ ## @param operator The operator
60
+ ##
61
+ ## @return [Boolean] test result
62
+ ##
47
63
  def test_operator(value1, value2, operator)
48
64
  case operator
49
65
  when :gt
@@ -63,13 +79,38 @@ module Conductor
63
79
  end
64
80
  end
65
81
 
82
+ ##
83
+ ## @brief Splits a natural language condition.
84
+ ##
85
+ ## @param condition The condition
86
+ ## @return [Array] Value, value to compare, operator
87
+ ##
66
88
  def split_condition(condition)
89
+ if condition.match(/(?:((?:does )?not)?(?:ha(?:s|ve)|contains?|includes?) +)?(yaml|headers|frontmatter|mmd|meta(?:data)?)(:\S+)?/i)
90
+ m = Regexp.last_match
91
+ op = m[1].nil? ? :contains : :not_contains
92
+ type = m[2] =~ /^m/i ? "mmd" : "yaml"
93
+ return ["#{type}#{m[3]}", nil, op]
94
+ end
67
95
  res = condition.match(/^(?<val1>.*?)(?:(?: +(?<op>(?:is|does)(?: not)?(?: an?|type(?: of)?|equals?(?: to))?|!?==?|[gl]t|(?:greater|less)(?: than)?|<|>|(?:starts|ends) with|(?:ha(?:s|ve) )?(?:prefix|suffix)|has|contains?|includes?) +)(?<val2>.*?))?$/i)
68
- [res['val1'], res['val2'], operator_to_symbol(res['op'])]
96
+ [res["val1"], res["val2"], operator_to_symbol(res["op"])]
69
97
  end
70
98
 
99
+ ##
100
+ ## @brief Test for type of value
101
+ ##
102
+ ## @param val1 value
103
+ ## @param val2 value to test against
104
+ ## @param operator The operator
105
+ ##
71
106
  def test_type(val1, val2, operator)
72
107
  res = case val2
108
+ when /number/
109
+ val1.is_a?(Numeric)
110
+ when /int(eger)?/
111
+ val1.is_a?(Integer)
112
+ when /(float|decimal)/
113
+ val1.is_a?(Float)
73
114
  when /array/i
74
115
  val1.is_a?(Array)
75
116
  when /(string|text)/i
@@ -80,12 +121,21 @@ module Conductor
80
121
  operator == :type_of ? res : !res
81
122
  end
82
123
 
124
+ ##
125
+ ## @brief Compare a string based on operator
126
+ ##
127
+ ## @param val1 The string to test against
128
+ ## @param val2 The value to test
129
+ ## @param operator The operator
130
+ ##
131
+ ## @return [Boolean] test result
132
+ ##
83
133
  def test_string(val1, val2, operator)
84
134
  return operator == :not_equal ? val1.nil? : !val1.nil? if val2.nil?
85
135
 
86
136
  return operator == :not_equal if val1.nil?
87
137
 
88
- val2 = val2.force_encoding('utf-8')
138
+ val2 = val2.force_encoding("utf-8")
89
139
 
90
140
  if val1.date?
91
141
  if val2.time?
@@ -109,12 +159,12 @@ module Conductor
109
159
  return res unless res.nil?
110
160
  end
111
161
 
112
- val2 = if val2.strip =~ %r{^/.*?/$}
113
- val2.gsub(%r{(^/|/$)}, '')
162
+ val2 = if %r{^/.*?/$}.match?(val2.strip)
163
+ val2.gsub(%r{(^/|/$)}, "")
114
164
  else
115
165
  Regexp.escape(val2)
116
166
  end
117
- val1 = val1.dup.to_s.force_encoding('utf-8')
167
+ val1 = val1.dup.to_s.force_encoding("utf-8")
118
168
  case operator
119
169
  when :contains
120
170
  val1 =~ /#{val2}/i
@@ -135,6 +185,17 @@ module Conductor
135
185
  end
136
186
  end
137
187
 
188
+ ##
189
+ ## @brief Test for the existince of a
190
+ ## file/directory in the parent tree
191
+ ##
192
+ ## @param origin Starting directory
193
+ ## @param value The file/directory to search
194
+ ## for
195
+ ## @param operator The operator
196
+ ##
197
+ ## @return [Boolean] test result
198
+ ##
138
199
  def test_tree(origin, value, operator)
139
200
  return true if File.exist?(File.join(origin, value))
140
201
 
@@ -142,13 +203,22 @@ module Conductor
142
203
 
143
204
  if Dir.exist?(File.join(dir, value))
144
205
  true
145
- elsif [Dir.home, '/'].include?(dir)
206
+ elsif [Dir.home, "/"].include?(dir)
146
207
  false
147
208
  else
148
209
  test_tree(dir, value, operator)
149
210
  end
150
211
  end
151
212
 
213
+ ##
214
+ ## @brief Test "truthiness"
215
+ ##
216
+ ## @param value1 Value to test against
217
+ ## @param value2 Value to test
218
+ ## @param operator The operator
219
+ ##
220
+ ## @return [Boolean] test result
221
+ ##
152
222
  def test_truthy(value1, value2, operator)
153
223
  return false unless value2&.bool?
154
224
 
@@ -159,6 +229,89 @@ module Conductor
159
229
  operator == :not_equal ? !res : res
160
230
  end
161
231
 
232
+ ##
233
+ ## @brief Test for presence of yaml, optionall for
234
+ ## a key, optionally for a key's value
235
+ ##
236
+ ## @param content Text content containing YAML
237
+ ## @param value The value to test for
238
+ ## @param key The key to test for
239
+ ## @param operator The operator
240
+ ##
241
+ ## @return [Boolean] test result
242
+ ##
243
+ def test_yaml(content, value, key, operator)
244
+ yaml = YAML.safe_load(content.split(/^(?:---|\.\.\.)/)[1])
245
+
246
+ return operator == :not_equal unless yaml
247
+
248
+ if key
249
+ value1 = yaml[key]
250
+ return operator == :not_equal if value1.nil?
251
+
252
+ if value.nil?
253
+ has_key = !value1.nil?
254
+ return operator == :not_equal ? !has_key : has_key
255
+ end
256
+
257
+ if %i[type_of not_type_of].include?(operator)
258
+ return test_type(value1, value, operator)
259
+ end
260
+
261
+ value1 = value1.join(",") if value1.is_a?(Array)
262
+
263
+ if value1.bool?
264
+ test_truthy(value1, value, operator)
265
+ elsif value1.number? && value.number? && %i[gt lt equal not_equal].include?(operator)
266
+ test_operator(value1, value, operator)
267
+ else
268
+ test_string(value1, value, operator)
269
+ end
270
+ else
271
+ res = value ? yaml.key?(value) : true
272
+ (operator == :not_equal) ? !res : res
273
+ end
274
+ end
275
+
276
+ ##
277
+ ## @brief Test for MultiMarkdown metadata,
278
+ ## optionally key and value
279
+ ##
280
+ ## @param content [String] The text content
281
+ ## @param value [String] The value to test for
282
+ ## @param key [String] The key to test for
283
+ ## @param operator [Symbol] The operator
284
+ ##
285
+ ## @return [Boolean] test result
286
+ ##
287
+ def test_meta(content, value, key, operator)
288
+ headers = []
289
+ content.split("\n").each do |line|
290
+ break if line == /^ *\n$/ || line !~ /\w+: *\S/
291
+
292
+ headers << line
293
+ end
294
+
295
+ return operator == :not_equal if headers.empty?
296
+
297
+ return operator != :not_equal if value.nil?
298
+
299
+ meta = {}
300
+ headers.each do |h|
301
+ parts = h.split(/ *: */)
302
+ k = parts[0].strip.downcase.gsub(/ +/, "")
303
+ v = parts[1..].join(":").strip
304
+ meta[k] = v
305
+ end
306
+
307
+ if key
308
+ test_string(meta[key], value, operator)
309
+ else
310
+ res = value ? meta.key?(value) : true
311
+ operator == :not_equal ? !res : res
312
+ end
313
+ end
314
+
162
315
  def test_condition(condition)
163
316
  type, value, operator = split_condition(condition)
164
317
 
@@ -178,38 +331,18 @@ module Conductor
178
331
  test_tree(@env[:origin], value, operator)
179
332
  when /^(path|dir)/i
180
333
  test_string(@env[:filepath], value, operator) ? true : false
334
+ when /^(file)?name/i
335
+ test_string(@env[:filename], value, operator) ? true : false
181
336
  when /^phase/i
182
337
  test_string(@env[:phase], value, :starts_with) ? true : false
183
338
  when /^text/i
184
- puts IO.read(@env[:filepath]).force_encoding('utf-8')
185
- test_string(IO.read(@env[:filepath]).force_encoding('utf-8'), value, operator) ? true : false
186
- when /^(yaml|headers|frontmatter)(?::(.*?))?$/i
187
- m = Regexp.last_match
188
- content = IO.read(@env[:filepath]).force_encoding('utf-8')
189
- return false unless content =~ /^---/m
190
-
191
- yaml = YAML.safe_load(content.split(/^(?:---|\.\.\.)/)[1])
192
-
193
- return false unless yaml
194
-
195
- if m[2]
196
- value1 = yaml[m[2]]
197
- return false if value1.nil?
198
-
199
- value1 = value1.join(',') if value1.is_a?(Array)
200
- if %i[type_of not_type_of].include?(operator)
201
- test_type(value1, value, operator)
202
- elsif value1.bool?
203
- test_truthy(value1, value, operator)
204
- elsif value1.number? && value2.number? && %i[gt lt equal not_equal].include?(operator)
205
- test_operator(value1, value, operator)
206
- else
207
- test_string(value1, value, operator)
208
- end
209
- else
210
- res = value? ? yaml.key?(value) : true
211
- operator == :not_equal ? !res : res
212
- end
339
+ test_string(Conductor.stdin, value, operator) ? true : false
340
+ when /^(?:yaml|headers|frontmatter)(?::(.*?))?$/i
341
+ key = Regexp.last_match(1) || nil
342
+ Conductor.stdin.yaml? ? test_yaml(Conductor.stdin, value, key, operator) : false
343
+ when /^(?:mmd|meta(?:data)?)(?::(.*?))?$/i
344
+ key = Regexp.last_match(1) || nil
345
+ Conductor.stdin.meta? ? test_meta(Conductor.stdin, value, key, operator) : false
213
346
  else
214
347
  false
215
348
  end
@@ -223,6 +356,8 @@ module Conductor
223
356
  :gt
224
357
  when /(lt|less( than)?|<|(?:is )?before)/i
225
358
  :lt
359
+ when /not (ha(?:s|ve)|contains|includes|match(es)?|\*=)/i
360
+ :not_contains
226
361
  when /(ha(?:s|ve)|contains|includes|match(es)?|\*=)/i
227
362
  :contains
228
363
  when /not (suffix|ends? with)/i
@@ -6,22 +6,22 @@ module Conductor
6
6
  attr_reader :config, :tracks
7
7
 
8
8
  def initialize
9
- config_file = File.expand_path('~/.config/conductor/tracks.yaml')
9
+ config_file = File.expand_path("~/.config/conductor/tracks.yaml")
10
10
 
11
11
  create_config(config_file) unless File.exist?(config_file)
12
12
 
13
13
  @config ||= YAML.safe_load(IO.read(config_file))
14
14
 
15
- @tracks = @config['tracks'].symbolize_keys
15
+ @tracks = @config["tracks"].symbolize_keys
16
16
  end
17
17
  end
18
18
 
19
19
  def create_config(config_file)
20
20
  config_dir = File.dirname(config_file)
21
- scripts_dir = File.dirname(File.join(config_dir, 'scripts'))
21
+ scripts_dir = File.dirname(File.join(config_dir, "scripts"))
22
22
  FileUtils.mkdir_p(config_dir) unless File.directory?(config_dir)
23
23
  FileUtils.mkdir_p(scripts_dir) unless File.directory?(scripts_dir)
24
- File.open(config_file, 'w') { |f| f.puts sample_config }
24
+ File.open(config_file, "w") { |f| f.puts sample_config }
25
25
  puts "Sample config created at #{config_file}"
26
26
 
27
27
  Process.exit 0
data/lib/conductor/env.rb CHANGED
@@ -3,52 +3,54 @@
3
3
  module Conductor
4
4
  module Env
5
5
  def self.env
6
- @env ||= if ENV['CONDUCTOR_TEST'] == 'true'
7
- load_test_env
8
- else
9
- @env ||= {
10
- home: ENV['HOME'],
11
- css_path: ENV['MARKED_CSS_PATH'],
12
- ext: ENV['MARKED_EXT'],
13
- includes: ENV['MARKED_INCLUDES'],
14
- origin: ENV['MARKED_ORIGIN'],
15
- filepath: ENV['MARKED_PATH'],
16
- phase: ENV['MARKED_PHASE'],
17
- outline: ENV['OUTLINE'],
18
- path: ENV['PATH']
19
- }
20
- end
6
+ @env ||= if ENV["CONDUCTOR_TEST"] == "true"
7
+ load_test_env
8
+ else
9
+ @env ||= {
10
+ home: ENV["HOME"],
11
+ css_path: ENV["MARKED_CSS_PATH"],
12
+ ext: ENV["MARKED_EXT"],
13
+ includes: ENV["MARKED_INCLUDES"],
14
+ origin: ENV["MARKED_ORIGIN"],
15
+ filepath: ENV["MARKED_PATH"],
16
+ filename: File.basename(filepath),
17
+ phase: ENV["MARKED_PHASE"],
18
+ outline: ENV["OUTLINE"],
19
+ path: ENV["PATH"]
20
+ }
21
+ end
21
22
 
22
23
  @env
23
24
  end
24
25
 
25
26
  def self.load_test_env
26
27
  @env = {
27
- home: '/Users/ttscoff',
28
- css_path: '/Applications/Marked 2.app/Contents/Resources/swiss.css',
29
- ext: 'md',
28
+ home: "/Users/ttscoff",
29
+ css_path: "/Applications/Marked 2.app/Contents/Resources/swiss.css",
30
+ ext: "md",
30
31
  includes: [],
31
- origin: '/Users/ttscoff/Desktop/Code/marked-conductor/',
32
- filepath: '/Users/ttscoff/Desktop/Code/marked-conductor/README.md',
33
- phase: 'PREPROCESS',
34
- outline: 'NONE',
35
- path: '/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/ttscoff/Dropbox/Writing/brettterpstra.com/_drafts/'
32
+ origin: "/Users/ttscoff/Desktop/Code/marked-conductor/",
33
+ filepath: "/Users/ttscoff/Desktop/Code/marked-conductor/README.md",
34
+ filename: "README.md",
35
+ phase: "PREPROCESS",
36
+ outline: "NONE",
37
+ path: "/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/ttscoff/Dropbox/Writing/brettterpstra.com/_drafts/"
36
38
  }
37
39
  end
38
40
 
39
41
  def self.to_s
40
42
  out_h = {
41
- 'HOME' => @env[:home],
42
- 'MARKED_CSS_PATH' => @env[:css_path],
43
- 'MARKED_EXT' => @env[:ext],
44
- 'MARKED_ORIGIN' => @env[:origin],
45
- 'MARKED_INCLUDES' => @env[:includes],
46
- 'MARKED_PATH' => @env[:filepath],
47
- 'MARKED_PHASE' => @env[:phase],
48
- 'OUTLINE' => @env[:outline],
49
- 'PATH'=> @env[:path]
43
+ "HOME" => @env[:home],
44
+ "MARKED_CSS_PATH" => @env[:css_path],
45
+ "MARKED_EXT" => @env[:ext],
46
+ "MARKED_ORIGIN" => @env[:origin],
47
+ "MARKED_INCLUDES" => @env[:includes],
48
+ "MARKED_PATH" => @env[:filepath],
49
+ "MARKED_PHASE" => @env[:phase],
50
+ "OUTLINE" => @env[:outline],
51
+ "PATH" => @env[:path]
50
52
  }
51
- out_h.map { |k, v| %(#{k}="#{v}") }.join(' ')
53
+ out_h.map { |k, v| %(#{k}="#{v}") }.join(" ")
52
54
  end
53
55
  end
54
56
  end
@@ -6,6 +6,6 @@ class ::Hash
6
6
  end
7
7
 
8
8
  def symbolize_keys
9
- each_with_object({}) { |(k, v), hsh| hsh[k.to_sym] = v.is_a?(Hash) ? v.symbolize_keys : v }
9
+ each_with_object({}) { |(k, v), hsh| hsh[k.to_sym] = (v.is_a?(Hash) || v.is_a?(Array)) ? v.symbolize_keys : v }
10
10
  end
11
11
  end
@@ -8,44 +8,44 @@ module Conductor
8
8
  def initialize(script)
9
9
  parts = Shellwords.split(script)
10
10
  self.path = parts[0]
11
- self.args = parts[1..].join(' ')
11
+ self.args = parts[1..].join(" ")
12
12
  end
13
13
 
14
14
  def path=(path)
15
- @path = if path =~ %r{^[%/]}
16
- File.expand_path(path)
17
- else
18
- script_dir = File.expand_path('~/.config/conductor/scripts')
19
- if File.exist?(File.join(script_dir, path))
20
- File.join(script_dir, path)
21
- elsif TTY::Which.exist?(path)
22
- TTY::Which.which(path)
23
- else
24
- raise "Path to #{path} not found"
25
-
26
- end
27
- end
15
+ @path = if %r{^[%/]}.match?(path)
16
+ File.expand_path(path)
17
+ else
18
+ script_dir = File.expand_path("~/.config/conductor/scripts")
19
+ if File.exist?(File.join(script_dir, path))
20
+ File.join(script_dir, path)
21
+ elsif TTY::Which.exist?(path)
22
+ TTY::Which.which(path)
23
+ else
24
+ raise "Path to #{path} not found"
25
+
26
+ end
27
+ end
28
28
  end
29
29
 
30
30
  def args=(array)
31
31
  @args = if array.is_a?(Array)
32
- array.join(' ')
33
- else
34
- array
35
- end
32
+ array.join(" ")
33
+ else
34
+ array
35
+ end
36
36
  end
37
37
 
38
38
  def run
39
39
  stdin = Conductor.stdin
40
40
 
41
- raise 'Script path not defined' unless @path
41
+ raise "Script path not defined" unless @path
42
42
 
43
43
  use_stdin = true
44
- if args =~ /\$\{?file\}?/
44
+ if /\$\{?file\}?/.match?(args)
45
45
  use_stdin = false
46
46
  args.sub!(/\$\{?file\}?/, Env.env[:filepath])
47
47
  else
48
- raise 'No input' unless stdin
48
+ raise "No input" unless stdin
49
49
 
50
50
  end
51
51
 
@@ -4,9 +4,9 @@
4
4
  class ::String
5
5
  def bool_to_symbol
6
6
  case self
7
- when /NOT/
7
+ when /(NOT|!!)/
8
8
  :not
9
- when /AND/
9
+ when /(AND|&&)/
10
10
  :and
11
11
  else
12
12
  :or
@@ -14,32 +14,40 @@ class ::String
14
14
  end
15
15
 
16
16
  def date?
17
- dup.force_encoding('utf-8').match(/^\d{4}-\d{2}-\d{2}/) ? true : false
17
+ dup.force_encoding("utf-8").match?(/^\d{4}-\d{2}-\d{2}/)
18
18
  end
19
19
 
20
20
  def time?
21
- dup.force_encoding('utf-8').match(/ \d{1,2}(:\d\d)? *([ap]m)?/i)
21
+ dup.force_encoding("utf-8").match(/ \d{1,2}(:\d\d)? *([ap]m)?/i)
22
22
  end
23
23
 
24
24
  def to_date
25
- Chronic.parse(self.dup.force_encoding('utf-8'))
25
+ Chronic.parse(dup.force_encoding("utf-8"))
26
26
  end
27
27
 
28
28
  def strip_time
29
- dup.force_encoding('utf-8').sub(/ \d{1,2}(:\d\d)? *([ap]m)?/i, '')
29
+ dup.force_encoding("utf-8").sub(/ \d{1,2}(:\d\d)? *([ap]m)?/i, "")
30
30
  end
31
31
 
32
32
  def to_day(time = :end)
33
- t = time == :end ? '23:59' : '00:00'
34
- Chronic.parse("#{self.strip_time} #{t}")
33
+ t = time == :end ? "23:59" : "00:00"
34
+ Chronic.parse("#{strip_time} #{t}")
35
35
  end
36
36
 
37
37
  def number?
38
- to_f > 0
38
+ to_f.positive?
39
39
  end
40
40
 
41
41
  def bool?
42
- dup.force_encoding('utf-8').match(/^(?:y(?:es)?|no?|t(?:rue)?|f(?:alse)?)$/) ? true : false
42
+ dup.force_encoding("utf-8").match?(/^(?:y(?:es)?|no?|t(?:rue)?|f(?:alse)?)$/)
43
+ end
44
+
45
+ def meta?
46
+ self =~ /^---/m
47
+ end
48
+
49
+ def yaml?
50
+ self =~ /^\w+: +\S+/m
43
51
  end
44
52
 
45
53
  def to_bool!
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Conductor
4
- VERSION = '1.0.6'
4
+ VERSION = "1.0.8"
5
5
  end
data/lib/conductor.rb CHANGED
@@ -1,28 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'tty-which'
4
- require 'yaml'
5
- require 'shellwords'
6
- require 'fcntl'
7
- require 'time'
8
- require 'chronic'
9
- require 'fileutils'
10
- require_relative 'conductor/version'
11
- require_relative 'conductor/env'
12
- require_relative 'conductor/config'
13
- require_relative 'conductor/hash'
14
- require_relative 'conductor/array'
15
- require_relative 'conductor/boolean'
16
- require_relative 'conductor/string'
17
- require_relative 'conductor/script'
18
- require_relative 'conductor/command'
19
- require_relative 'conductor/condition'
3
+ require "tty-which"
4
+ require "yaml"
5
+ require "shellwords"
6
+ require "fcntl"
7
+ require "time"
8
+ require "chronic"
9
+ require "fileutils"
10
+ require_relative "conductor/version"
11
+ require_relative "conductor/env"
12
+ require_relative "conductor/config"
13
+ require_relative "conductor/hash"
14
+ require_relative "conductor/array"
15
+ require_relative "conductor/boolean"
16
+ require_relative "conductor/string"
17
+ require_relative "conductor/script"
18
+ require_relative "conductor/command"
19
+ require_relative "conductor/condition"
20
20
 
21
21
  module Conductor
22
22
  class << self
23
+ attr_writer :stdin
24
+
23
25
  def stdin
24
- warn 'input on STDIN required' unless $stdin.stat.size.positive? || $stdin.fcntl(Fcntl::F_GETFL, 0).zero?
25
- @stdin ||= $stdin.read.strip.force_encoding('utf-8')
26
+ warn "input on STDIN required" unless $stdin.stat.size.positive? || $stdin.fcntl(Fcntl::F_GETFL, 0).zero?
27
+ @stdin ||= $stdin.read.strip.force_encoding("utf-8")
26
28
  end
27
29
  end
28
30
  end
@@ -3,15 +3,15 @@
3
3
  require_relative "lib/conductor/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "marked-conductor"
7
- spec.version = Conductor::VERSION
8
- spec.authors = ["Brett Terpstra"]
9
- spec.email = ["me@brettterpstra.com"]
6
+ spec.name = "marked-conductor"
7
+ spec.version = Conductor::VERSION
8
+ spec.authors = ["Brett Terpstra"]
9
+ spec.email = ["me@brettterpstra.com"]
10
10
 
11
- spec.summary = "A custom processor manager for Marked 2 (Mac)"
12
- spec.description = "Conductor allows easy configuration of multiple scripts that are run as custom pre/processors for Marked based on conditional statements."
13
- spec.homepage = "https://github.com/ttscoff/marked-conductor"
14
- spec.license = "MIT"
11
+ spec.summary = "A custom processor manager for Marked 2 (Mac)"
12
+ spec.description = "Conductor allows easy configuration of multiple scripts that are run as custom pre/processors for Marked based on conditional statements."
13
+ spec.homepage = "https://github.com/ttscoff/marked-conductor"
14
+ spec.license = "MIT"
15
15
  spec.required_ruby_version = ">= 2.6.0"
16
16
 
17
17
  spec.metadata["homepage_uri"] = spec.homepage
@@ -25,12 +25,20 @@ Gem::Specification.new do |spec|
25
25
  (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
26
26
  end
27
27
  end
28
- spec.bindir = "bin"
29
- spec.executables = spec.files.grep(%r{\Abin/}) { |f| File.basename(f) }
28
+ spec.bindir = "bin"
29
+ spec.executables = spec.files.grep(%r{\Abin/}) { |f| File.basename(f) }
30
30
  spec.require_paths = ["lib"]
31
31
 
32
32
  spec.add_development_dependency "pry", "~> 0.14.2"
33
33
  spec.add_development_dependency "awesome_print", "~> 1.9.2"
34
+ spec.add_development_dependency "bundler", "~> 2.0"
35
+ spec.add_development_dependency "gem-release", "~> 2.2"
36
+ spec.add_development_dependency "parse_gemspec-cli", "~> 1.0"
37
+ spec.add_development_dependency "rake", "~> 13.0"
38
+ spec.add_development_dependency "yard", "~> 0.9", ">= 0.9.26"
39
+ spec.add_development_dependency "rspec", "~> 3.0"
40
+ spec.add_development_dependency "simplecov", "~> 0.21"
41
+ spec.add_development_dependency "simplecov-console", "~> 0.9"
34
42
 
35
43
  # Uncomment to register a new dependency of your gem
36
44
  spec.add_dependency "tty-which", "~> 0.5.0"