marked-conductor 1.0.7 → 1.0.9

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,46 @@ 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)?|pandoc)(:\S+)?/i)
90
+ m = Regexp.last_match
91
+ op = m[1].nil? ? :contains : :not_contains
92
+ type = case m[2]
93
+ when /^m/i
94
+ "mmd"
95
+ when /^p/i
96
+ "pandoc"
97
+ else
98
+ "yaml"
99
+ end
100
+ return ["#{type}#{m[3]}", nil, op]
101
+ end
102
+
67
103
  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'])]
104
+ [res["val1"], res["val2"], operator_to_symbol(res["op"])]
69
105
  end
70
106
 
107
+ ##
108
+ ## @brief Test for type of value
109
+ ##
110
+ ## @param val1 value
111
+ ## @param val2 value to test against
112
+ ## @param operator The operator
113
+ ##
71
114
  def test_type(val1, val2, operator)
72
115
  res = case val2
116
+ when /number/
117
+ val1.is_a?(Numeric)
118
+ when /int(eger)?/
119
+ val1.is_a?(Integer)
120
+ when /(float|decimal)/
121
+ val1.is_a?(Float)
73
122
  when /array/i
74
123
  val1.is_a?(Array)
75
124
  when /(string|text)/i
@@ -80,12 +129,21 @@ module Conductor
80
129
  operator == :type_of ? res : !res
81
130
  end
82
131
 
132
+ ##
133
+ ## @brief Compare a string based on operator
134
+ ##
135
+ ## @param val1 The string to test against
136
+ ## @param val2 The value to test
137
+ ## @param operator The operator
138
+ ##
139
+ ## @return [Boolean] test result
140
+ ##
83
141
  def test_string(val1, val2, operator)
84
142
  return operator == :not_equal ? val1.nil? : !val1.nil? if val2.nil?
85
143
 
86
144
  return operator == :not_equal if val1.nil?
87
145
 
88
- val2 = val2.force_encoding('utf-8')
146
+ val2 = val2.force_encoding("utf-8")
89
147
 
90
148
  if val1.date?
91
149
  if val2.time?
@@ -109,12 +167,12 @@ module Conductor
109
167
  return res unless res.nil?
110
168
  end
111
169
 
112
- val2 = if val2.strip =~ %r{^/.*?/$}
113
- val2.gsub(%r{(^/|/$)}, '')
170
+ val2 = if %r{^/.*?/$}.match?(val2.strip)
171
+ val2.gsub(%r{(^/|/$)}, "")
114
172
  else
115
173
  Regexp.escape(val2)
116
174
  end
117
- val1 = val1.dup.to_s.force_encoding('utf-8')
175
+ val1 = val1.dup.to_s.force_encoding("utf-8")
118
176
  case operator
119
177
  when :contains
120
178
  val1 =~ /#{val2}/i
@@ -135,6 +193,17 @@ module Conductor
135
193
  end
136
194
  end
137
195
 
196
+ ##
197
+ ## @brief Test for the existince of a
198
+ ## file/directory in the parent tree
199
+ ##
200
+ ## @param origin Starting directory
201
+ ## @param value The file/directory to search
202
+ ## for
203
+ ## @param operator The operator
204
+ ##
205
+ ## @return [Boolean] test result
206
+ ##
138
207
  def test_tree(origin, value, operator)
139
208
  return true if File.exist?(File.join(origin, value))
140
209
 
@@ -142,13 +211,22 @@ module Conductor
142
211
 
143
212
  if Dir.exist?(File.join(dir, value))
144
213
  true
145
- elsif [Dir.home, '/'].include?(dir)
214
+ elsif [Dir.home, "/"].include?(dir)
146
215
  false
147
216
  else
148
217
  test_tree(dir, value, operator)
149
218
  end
150
219
  end
151
220
 
221
+ ##
222
+ ## @brief Test "truthiness"
223
+ ##
224
+ ## @param value1 Value to test against
225
+ ## @param value2 Value to test
226
+ ## @param operator The operator
227
+ ##
228
+ ## @return [Boolean] test result
229
+ ##
152
230
  def test_truthy(value1, value2, operator)
153
231
  return false unless value2&.bool?
154
232
 
@@ -159,34 +237,64 @@ module Conductor
159
237
  operator == :not_equal ? !res : res
160
238
  end
161
239
 
240
+ ##
241
+ ## @brief Test for presence of yaml, optionall for
242
+ ## a key, optionally for a key's value
243
+ ##
244
+ ## @param content Text content containing YAML
245
+ ## @param value The value to test for
246
+ ## @param key The key to test for
247
+ ## @param operator The operator
248
+ ##
249
+ ## @return [Boolean] test result
250
+ ##
162
251
  def test_yaml(content, value, key, operator)
163
252
  yaml = YAML.safe_load(content.split(/^(?:---|\.\.\.)/)[1])
164
253
 
165
- return operator == :not_equal ? true : false unless yaml
254
+ return operator == :not_equal unless yaml
166
255
 
167
256
  if key
168
257
  value1 = yaml[key]
169
- return operator == :not_equal ? true : false if value1.nil?
258
+ return operator == :not_equal if value1.nil?
259
+
260
+ if value.nil?
261
+ has_key = !value1.nil?
262
+ return operator == :not_equal ? !has_key : has_key
263
+ end
170
264
 
171
- value1 = value1.join(',') if value1.is_a?(Array)
172
265
  if %i[type_of not_type_of].include?(operator)
173
- test_type(value1, value, operator)
174
- elsif value1.bool?
266
+ return test_type(value1, value, operator)
267
+ end
268
+
269
+ value1 = value1.join(",") if value1.is_a?(Array)
270
+
271
+ if value1.bool?
175
272
  test_truthy(value1, value, operator)
176
- elsif value1.number? && value2.number? && %i[gt lt equal not_equal].include?(operator)
273
+ elsif value1.number? && value.number? && %i[gt lt equal not_equal].include?(operator)
177
274
  test_operator(value1, value, operator)
178
275
  else
179
276
  test_string(value1, value, operator)
180
277
  end
181
278
  else
182
279
  res = value ? yaml.key?(value) : true
183
- operator == :not_equal ? !res : res
280
+ (operator == :not_equal) ? !res : res
184
281
  end
185
282
  end
186
283
 
284
+ ##
285
+ ## @brief Test for MultiMarkdown metadata,
286
+ ## optionally key and value
287
+ ##
288
+ ## @param content [String] The text content
289
+ ## @param value [String] The value to test for
290
+ ## @param key [String] The key to test for
291
+ ## @param operator [Symbol] The operator
292
+ ##
293
+ ## @return [Boolean] test result
294
+ ##
187
295
  def test_meta(content, value, key, operator)
188
296
  headers = []
189
- content.split(/\n/).each do |line|
297
+ content.split("\n").each do |line|
190
298
  break if line == /^ *\n$/ || line !~ /\w+: *\S/
191
299
 
192
300
  headers << line
@@ -199,8 +307,8 @@ module Conductor
199
307
  meta = {}
200
308
  headers.each do |h|
201
309
  parts = h.split(/ *: */)
202
- k = parts[0].strip.downcase.gsub(/ +/, '')
203
- v = parts[1..].join(':').strip
310
+ k = parts[0].strip.downcase.gsub(/ +/, "")
311
+ v = parts[1..].join(":").strip
204
312
  meta[k] = v
205
313
  end
206
314
 
@@ -212,6 +320,11 @@ module Conductor
212
320
  end
213
321
  end
214
322
 
323
+ def test_pandoc(content, operator)
324
+ res = content.match(/^%% /)
325
+ %i[not_contains not_equal].include?(operator) ? !res.nil? : res.nil?
326
+ end
327
+
215
328
  def test_condition(condition)
216
329
  type, value, operator = split_condition(condition)
217
330
 
@@ -231,26 +344,20 @@ module Conductor
231
344
  test_tree(@env[:origin], value, operator)
232
345
  when /^(path|dir)/i
233
346
  test_string(@env[:filepath], value, operator) ? true : false
347
+ when /^(file)?name/i
348
+ test_string(@env[:filename], value, operator) ? true : false
234
349
  when /^phase/i
235
350
  test_string(@env[:phase], value, :starts_with) ? true : false
236
351
  when /^text/i
237
- test_string(IO.read(@env[:filepath]).force_encoding('utf-8'), value, operator) ? true : false
238
- when /^(yaml|headers|frontmatter)(?::(.*?))?$/i
239
- m = Regexp.last_match
240
-
241
- key = m[2] || nil
242
-
243
- content = IO.read(@env[:filepath]).force_encoding('utf-8')
244
-
245
- content.yaml? ? test_yaml(content, value, key, operator) : false
246
- when /^(mmd|meta(?:data)?)(?::(.*?))?$/i
247
- m = Regexp.last_match
248
-
249
- key = m[2] || nil
250
-
251
- content = IO.read(@env[:filepath]).force_encoding('utf-8')
252
-
253
- content.meta? ? test_meta(content, value, key, operator) : false
352
+ test_string(Conductor.stdin, value, operator) ? true : false
353
+ when /^(?:yaml|headers|frontmatter)(?::(.*?))?$/i
354
+ key = Regexp.last_match(1) || nil
355
+ Conductor.stdin.yaml? ? test_yaml(Conductor.stdin, value, key, operator) : false
356
+ when /^(?:mmd|meta(?:data)?)(?::(.*?))?$/i
357
+ key = Regexp.last_match(1) || nil
358
+ Conductor.stdin.meta? ? test_meta(Conductor.stdin, value, key, operator) : false
359
+ when /^pandoc/
360
+ test_pandoc(Conductor.stdin, operator)
254
361
  else
255
362
  false
256
363
  end
@@ -264,6 +371,8 @@ module Conductor
264
371
  :gt
265
372
  when /(lt|less( than)?|<|(?:is )?before)/i
266
373
  :lt
374
+ when /not (ha(?:s|ve)|contains|includes|match(es)?)/i
375
+ :not_contains
267
376
  when /(ha(?:s|ve)|contains|includes|match(es)?|\*=)/i
268
377
  :contains
269
378
  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(ENV["MARKED_PATH"]),
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/nvultra-docs/content/",
33
+ filepath: "/Users/ttscoff/Desktop/Code/nvultra-docs/content/advanced-features.md",
34
+ filename: "advanced-features.md",
35
+ phase: "PROCESS",
36
+ outline: "NONE",
37
+ path: "/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/ttscoff/Desktop/Code/nvultra-docs/content/"
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,32 @@ 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
43
  end
44
44
 
45
45
  def meta?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Conductor
4
- VERSION = '1.0.7'
4
+ VERSION = '1.0.9'
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"