libclimate-ruby 0.7.5 → 0.11.0

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
- SHA256:
3
- metadata.gz: 5143c5a832e476919e0a314035a5127ec1edd1831f9f66711e798a76eb15bdd3
4
- data.tar.gz: 8189d0bae8d271ec54207b499d7bb8efe99779ce46c45ddbd6268f4f9c01a0bb
2
+ SHA1:
3
+ metadata.gz: 353fcd858d3ab427e53c1a9413dd95b84a51ce60
4
+ data.tar.gz: 4e6800354074160420024c735c9c74c25479b61e
5
5
  SHA512:
6
- metadata.gz: 8bda6e0339bb494fab974079653b777602f4874301cd8fb00f8f3455d9e4866c7c5c43605120f31c3e1d80ad509fe1d3fe5a4b590737ce2bc9b8135abbfc43e4
7
- data.tar.gz: ad7f3d2ed6dd854927c6cb4ef75bd3639dcd47cc313c5b34c37c75ed388e1f6c89d16df30aefb6813382b7e5b1441c35a0bcf2f71aab5eb664b7da16926d4924
6
+ metadata.gz: 66435e1e61927c1c2cb3f8deeff70622ef6fe11d7829597fcdebf3e4310fde56c3d80d084cf29261f82f8914d344d97168e51a1de274f1c1a44560e44e411a10
7
+ data.tar.gz: 56b07a2b44395c8e0c72e7c6c553285a2f4de427a1cfc2268c49b7e8ac33ab9978de755f9c188eb0e4504f19d054b00db3ffd0c5b54c3fda40e33a99b958ce64
data/README.md CHANGED
@@ -1,28 +1,70 @@
1
1
  # libCLImate.Ruby
2
- libCLImate for Ruby
2
+ libCLImate, for Ruby
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/libclimate-ruby.svg)](https://badge.fury.io/rb/libclimate-ruby)
5
5
 
6
- ## Installation & usage
6
+ ## Introduction
7
7
 
8
- Install using `gem install libclimate-ruby` or add it to your `Gemfile`.
8
+ **libCLImate** is a portable, lightweight mini-framework that encapsulates the common aspects of **C**ommand-**L**ine **I**nterface boilerplate, including:
9
9
 
10
- ## Description
10
+ - command-line argument parsing and sorting;
11
+ - provision of de-facto standard CLI facilities, such as responding to '--help' and '--version';
11
12
 
12
- TODO
13
+ **libCLImate.Ruby** is the Ruby version.
13
14
 
14
- ## Where to get help
15
+ ## Table of Contents
16
+
17
+ 1. [Introduction](#introduction)
18
+ 2. [Installation](#installation)
19
+ 3. [Components](#components)
20
+ 4. [Project Information](#project-information)
21
+
22
+ ## Installation
23
+
24
+ Install via **gem** as in:
25
+
26
+ ```
27
+ gem install libclimate-ruby
28
+ ```
29
+
30
+ or add it to your `Gemfile`.
31
+
32
+ Use via **require***, as in:
33
+
34
+ ```Ruby
35
+ require 'libclimate-ruby'
36
+ ```
37
+
38
+ ## Components
39
+
40
+ T.B.C.
41
+
42
+ ## Project Information
43
+
44
+ ### Where to get help
15
45
 
16
46
  [GitHub Page](https://github.com/synesissoftware/libCLImate.Ruby "GitHub Page")
17
47
 
18
- ## Contribution guidelines
48
+ ### Contribution guidelines
19
49
 
20
50
  Defect reports, feature requests, and pull requests are welcome on https://github.com/synesissoftware/libCLImate.Ruby.
21
51
 
22
- ## Related projects
52
+ ### Dependencies
53
+
54
+ **libCLImate.Ruby** depends on:
55
+
56
+ * the [**CLASP.Ruby**](https://github.com/synesissoftware/CLASP.Ruby) library; and
57
+ * the [**xqsr3**](https://github.com/synesissoftware/xqsr3) library.
58
+
59
+ ### Related projects
23
60
 
24
- **libCLImate.Ruby** uses the **[clasp.Ruby](https://github.com/synesissoftware/clasp.Ruby)** and **[xqsr3](https://github.com/synesissoftware/xqsr3)** libraries.
61
+ * [**libCLImate C/C++](https://github.com/synesissoftware/libCLImate.Ruby)
62
+ * [**CLASP**](https://github.com/synesissoftware/CLASP/)
63
+ * [**CLASP.Go**](https://github.com/synesissoftware/CLASP.Go/)
64
+ * [**CLASP.js**](https://github.com/synesissoftware/CLASP.js/)
65
+ * [**CLASP.Ruby**](https://github.com/synesissoftware/CLASP.Ruby/)
66
+ * [xqsr3](https://github.com/synesissoftware.com/libCLImate.Ruby-xml/)
25
67
 
26
- ## License
68
+ ### License
27
69
 
28
- **libCLImate.Ruby** is released under the 3-clause BSD license. See LICENSE for details.
70
+ **libCLImate.Ruby** is released under the 3-clause BSD license. See [LICENSE](./LICENSE) for details.
@@ -5,13 +5,13 @@
5
5
  # Purpose: Definition of the ::LibCLImate::Climate class
6
6
  #
7
7
  # Created: 13th July 2015
8
- # Updated: 4th February 2018
8
+ # Updated: 12th March 2019
9
9
  #
10
10
  # Home: http://github.com/synesissoftware/libCLImate.Ruby
11
11
  #
12
12
  # Author: Matthew Wilson
13
13
  #
14
- # Copyright (c) 2015-2018, Matthew Wilson and Synesis Software
14
+ # Copyright (c) 2015-2019, Matthew Wilson and Synesis Software
15
15
  # All rights reserved.
16
16
  #
17
17
  # Redistribution and use in source and binary forms, with or without
@@ -146,7 +146,7 @@ module LibCLImate
146
146
  # program_options[:flavour] = check_flavour(o.value) or cl.abort "Invalid flavour '#{o.value}'; use --help for usage"
147
147
  # end
148
148
  #
149
- # cl.usage_value = '<value-1> [ ... <value-N> ]'
149
+ # cl.usage_values = '<value-1> [ ... <value-N> ]'
150
150
  #
151
151
  # cl.info_lines = [
152
152
  #
@@ -169,6 +169,7 @@ class Climate
169
169
  options.merge! stream: stdout, program_name: program_name, version: version, exit: exit_on_usage ? 0 : nil
170
170
  options[:info_lines] = info_lines if info_lines
171
171
  options[:values] = usage_values if usage_values
172
+ options[:flags_and_options] = flags_and_options if flags_and_options
172
173
 
173
174
  CLASP.show_usage aliases, options
174
175
  end
@@ -183,7 +184,7 @@ class Climate
183
184
  # algorithm:
184
185
  #
185
186
  # 1. PROGRAM_VERSION: loaded from ctxt / global
186
- # 2. PROGRAM_VER(SION)_(MAJOR|MINOR|REVISION|BUILD): loaded from
187
+ # 2. PROGRAM_VER(SION)_(MAJOR|MINOR|(PATCH|REVISION)|BUILD): loaded from
187
188
  # ctxt / global
188
189
 
189
190
  if ctxt
@@ -202,9 +203,15 @@ class Climate
202
203
 
203
204
  ver << ctxt.const_get(:PROGRAM_VER_MINOR)
204
205
 
205
- if ctxt.const_defined? :PROGRAM_VER_REVISION
206
+ if ctxt.const_defined?(:PROGRAM_VER_REVISION) || ctxt.const_defined?(:PROGRAM_VER_PATCH)
206
207
 
207
- ver << ctxt.const_get(:PROGRAM_VER_REVISION)
208
+ if ctxt.const_defined?(:PROGRAM_VER_PATCH)
209
+
210
+ ver << ctxt.const_get(:PROGRAM_VER_PATCH)
211
+ else
212
+
213
+ ver << ctxt.const_get(:PROGRAM_VER_REVISION)
214
+ end
208
215
 
209
216
  if ctxt.const_defined? :PROGRAM_VER_BUILD
210
217
 
@@ -229,9 +236,15 @@ class Climate
229
236
 
230
237
  ver << PROGRAM_VER_MINOR
231
238
 
232
- if defined? PROGRAM_VER_REVISION
239
+ if defined?(PROGRAM_VER_REVISION) || defined?(PROGRAM_VER_PATCH)
240
+
241
+ if defined?(PROGRAM_VER_PATCH)
233
242
 
234
- ver << PROGRAM_VER_REVISION
243
+ ver << PROGRAM_VER_PATCH
244
+ else
245
+
246
+ ver << PROGRAM_VER_REVISION
247
+ end
235
248
 
236
249
  if defined? PROGRAM_VER_BUILD
237
250
 
@@ -258,12 +271,16 @@ class Climate
258
271
  # - +options:+:: An options hash, containing any of the following options.
259
272
  #
260
273
  # * *Options*:
261
- # - +:no_help_flag+:: Prevents the use of the CLASP::Flag.Help flag-alias
262
- # - +:no_version_flag+:: Prevents the use of the CLASP::Version.Help flag-alias
263
- # - +:program_name+:: [ ::String ] An explicit program-name, which is
274
+ # - +:no_help_flag+:: (boolean) Prevents the use of the
275
+ # +CLASP::Flag.Help+ flag-alias
276
+ # - +:no_version_flag+:: (boolean) Prevents the use of the
277
+ # +CLASP::Flag.Version+ flag-alias
278
+ # - +:program_name+:: (::String) An explicit program-name, which is
264
279
  # inferred from +$0+ if this is +nil+
265
280
  # - +:version+:: A version specification. If not specified, this is
266
281
  # inferred
282
+ # - +:version_context+:: Object or class that defines a context for
283
+ # searching the version. Ignored if +:version+ is specified
267
284
  #
268
285
  # * *Block*:: An optional block which receives the constructing instance, allowing the user to modify the attributes.
269
286
  def initialize(options={}) # :yields: climate
@@ -272,6 +289,8 @@ class Climate
272
289
 
273
290
  options ||= {}
274
291
 
292
+ check_option options, :no_help_flag, type: :boolean, allow_nil: true
293
+ check_option options, :no_version_flag, type: :boolean, allow_nil: true
275
294
  check_option options, :program_name, type: ::String, allow_nil: true
276
295
 
277
296
  pr_name = options[:program_name]
@@ -279,10 +298,11 @@ class Climate
279
298
  unless pr_name
280
299
 
281
300
  pr_name = File.basename($0)
282
- pr_name = (pr_name =~ /\.rb$/) ? "#$`(#$&)" : pr_name
301
+ pr_name = (pr_name =~ /\.(?:bat|cmd|rb|sh)$/) ? "#$`(#$&)" : pr_name
283
302
  end
284
303
 
285
304
  @aliases = []
305
+ @ignore_unknown = false
286
306
  @exit_on_unknown = true
287
307
  @exit_on_missing = true
288
308
  @exit_on_usage = true
@@ -290,7 +310,10 @@ class Climate
290
310
  set_program_name pr_name
291
311
  @stdout = $stdout
292
312
  @stderr = $stderr
313
+ @constrain_values = nil
314
+ @flags_and_options = flags_and_options
293
315
  @usage_values = usage_values
316
+ @value_names = []
294
317
  version_context = options[:version_context]
295
318
  @version = options[:version] || infer_version_(version_context)
296
319
 
@@ -300,43 +323,66 @@ class Climate
300
323
  yield self if block_given?
301
324
  end
302
325
 
326
+ # [DEPRECATED] This method is now deprecated. Instead use
327
+ # +program_name=+
328
+ #
329
+ # @deprecated
303
330
  def set_program_name name
304
331
 
305
- if defined? Colcon
306
-
307
- name = "#{::Colcon::Decorations::Bold}#{name}#{::Colcon::Decorations::Unbold}"
308
- end
309
-
310
332
  @program_name = name
311
333
  end
312
334
 
313
335
  # An array of aliases attached to the climate instance, whose contents should be modified by adding (or removing) CLASP aliases
314
- # @return [Array] The aliases
336
+ # @return (::Array) The aliases
315
337
  attr_reader :aliases
316
338
  # Indicates whether exit will be called (with non-zero exit code) when a
317
339
  # required command-line option is missing
318
- # @return [Boolean]
340
+ # @return (boolean)
319
341
  # @return *true* exit(1) will be called
320
342
  # @return *false* exit will not be called
321
343
  attr_accessor :exit_on_missing
344
+ # Indicates whether unknown flags or options will be ignored. This
345
+ # overrides +:exit_on_unknown+
346
+ attr_accessor :ignore_unknown
322
347
  # Indicates whether exit will be called (with non-zero exit code) when an unknown command-line flag or option is encountered
323
- # @return [Boolean]
348
+ # @return (boolean)
324
349
  # @return *true* exit(1) will be called
325
350
  # @return *false* exit will not be called
326
351
  attr_accessor :exit_on_unknown
327
- # @return [Boolean] Indicates whether exit will be called (with zero exit code) when usage/version is requested on the command-line
352
+ # @return (boolean) Indicates whether exit will be called (with zero exit code) when usage/version is requested on the command-line
328
353
  attr_accessor :exit_on_usage
329
- # @return [Array] Optional array of string of program-information that will be written before the rest of the usage block when usage is requested on the command-line
354
+ # @return (::Array) Optional array of string of program-information that will be written before the rest of the usage block when usage is requested on the command-line
330
355
  attr_accessor :info_lines
331
- # @return [String] A program name; defaults to the name of the executing script
332
- attr_accessor :program_name
333
- # @return [IO] The output stream for normative output; defaults to $stdout
356
+ # @return (::String) A program name; defaults to the name of the executing script
357
+ def program_name
358
+
359
+ name = @program_name
360
+
361
+ if defined?(Colcon) && @stdout.tty?
362
+
363
+ name = "#{::Colcon::Decorations::Bold}#{name}#{::Colcon::Decorations::Unbold}"
364
+ end
365
+
366
+ name
367
+ end
368
+ attr_writer :program_name
369
+ # @return (::IO) The output stream for normative output; defaults to $stdout
334
370
  attr_accessor :stdout
335
- # @return [IO] The output stream for contingent output; defaults to $stderr
371
+ # @return (::IO) The output stream for contingent output; defaults to $stderr
336
372
  attr_accessor :stderr
337
- # @return [String] Optional string to describe the program values, eg \<xyz "[ { <<directory> | &lt;file> } ]"
373
+ # @return (::Integer, ::Range) Optional constraint on the values that
374
+ # must be provided to the program
375
+ attr_accessor :constrain_values
376
+ # @return (::String) Optional string to describe the flags and options
377
+ # section
378
+ attr_accessor :flags_and_options
379
+ # @return (::String) Optional string to describe the program values, eg \<xyz "[ { <<directory> | &lt;file> } ]"
338
380
  attr_accessor :usage_values
339
- # @return [String, Array] A version string or an array of integers representing the version component(s)
381
+ # @return (::Array) Zero-based array of names for values to be used when
382
+ # that value is not present (according to the +:constrain_values+
383
+ # attribute)
384
+ attr_accessor :value_names
385
+ # @return (::String, ::Array) A version string or an array of integers representing the version component(s)
340
386
  attr_accessor :version
341
387
 
342
388
  # Executes the prepared Climate instance
@@ -422,7 +468,12 @@ class Climate
422
468
 
423
469
  message = "unrecognised flag '#{f}'; use --help for usage"
424
470
 
425
- if exit_on_unknown
471
+ if false
472
+
473
+ elsif ignore_unknown
474
+
475
+ ;
476
+ elsif exit_on_unknown
426
477
 
427
478
  self.abort message
428
479
  else
@@ -479,7 +530,12 @@ class Climate
479
530
 
480
531
  message = "unrecognised option '#{o}'; use --help for usage"
481
532
 
482
- if exit_on_unknown
533
+ if false
534
+
535
+ elsif ignore_unknown
536
+
537
+ ;
538
+ elsif exit_on_unknown
483
539
 
484
540
  self.abort message
485
541
  else
@@ -497,40 +553,107 @@ class Climate
497
553
  end
498
554
 
499
555
 
500
- # now police any required options
556
+ # now police any required options
557
+
558
+ required_aliases = aliases.select do |a|
559
+
560
+ a.kind_of?(::CLASP::Option) && a.required?
561
+ end
562
+
563
+ required_aliases = Hash[required_aliases.map { |a| [ a.name, a ] }]
564
+
565
+ given_options = Hash[results[:options][:given].map { |o| [ o.name, o ]}]
566
+
567
+ required_aliases.each do |k, a|
568
+
569
+ unless given_options.has_key? k
570
+
571
+ message = a.required_message
501
572
 
502
- required_aliases = aliases.select do |a|
573
+ if exit_on_missing
503
574
 
504
- a.kind_of?(::CLASP::Option) && a.required?
575
+ self.abort message
576
+ else
577
+
578
+ if program_name && !program_name.empty?
579
+
580
+ message = "#{program_name}: #{message}"
581
+ end
582
+
583
+ stderr.puts message
584
+ end
585
+
586
+ results[:missing_option_aliases] << a
505
587
  end
588
+ end
506
589
 
507
- required_aliases = Hash[required_aliases.map { |a| [ a.name, a ] }]
590
+ # now police the values
508
591
 
509
- given_options = Hash[results[:options][:given].map { |o| [ o.name, o ]}]
592
+ values_constraint = constrain_values
593
+ values_constraint = values_constraint.begin if ::Range === values_constraint && values_constraint.end == values_constraint.begin
594
+ val_names = ::Array === value_names ? value_names : []
510
595
 
511
- required_aliases.each do |k, a|
596
+ case values_constraint
597
+ when nil
512
598
 
513
- unless given_options.has_key? k
599
+ ;
600
+ when ::Integer
514
601
 
515
- message = a.required_message
602
+ unless values.size == values_constraint
516
603
 
517
- if exit_on_missing
604
+ if name = val_names[values.size]
518
605
 
519
- self.abort message
520
- else
606
+ message = name + ' not specified; use --help for usage'
607
+ else
521
608
 
522
- if program_name && !program_name.empty?
609
+ message = "wrong number of values: #{values.size} given, #{values_constraint} required; use --help for usage"
610
+ end
523
611
 
524
- message = "#{program_name}: #{message}"
525
- end
612
+ if exit_on_unknown
526
613
 
527
- stderr.puts message
614
+ self.abort message
615
+ else
616
+
617
+ if program_name && !program_name.empty?
618
+
619
+ message = "#{program_name}: #{message}"
528
620
  end
529
621
 
530
- results[:missing_option_aliases] << a
622
+ stderr.puts message
623
+ end
624
+ end
625
+ when ::Range
626
+
627
+ unless values_constraint.include? values.size
628
+
629
+ if name = val_names[values.size]
630
+
631
+ message = name + ' not specified; use --help for usage'
632
+ else
633
+
634
+ message = "wrong number of values: #{values.size} givens, #{values_constraint.begin} - #{values_constraint.end - (values_constraint.exclude_end? ? 1 : 0)} required; use --help for usage"
635
+ end
636
+
637
+ if exit_on_unknown
638
+
639
+ self.abort message
640
+ else
641
+
642
+ if program_name && !program_name.empty?
643
+
644
+ message = "#{program_name}: #{message}"
645
+ end
646
+
647
+ stderr.puts message
531
648
  end
649
+ end
650
+ else
651
+
652
+ warn "value of 'constrain_values' attribute - '#{constrain_values}' (#{constrain_values.class}) - of wrong type : must be #{::Integer}, #{::Range}, or nil"
532
653
  end
533
654
 
655
+
656
+
534
657
  def results.flags
535
658
 
536
659
  self[:flags]
@@ -602,7 +725,7 @@ class Climate
602
725
  # === Signature
603
726
  #
604
727
  # * *Parameters*
605
- # - +name+:: The flag name
728
+ # - +name_or_flag+:: The flag name or instance of CLASP::Flag
606
729
  # - +options+:: An options hash, containing any of the following options.
607
730
  #
608
731
  # * *Options*
@@ -610,13 +733,26 @@ class Climate
610
733
  # - +:alias+::
611
734
  # - +:aliases+::
612
735
  # - +:extras+::
613
- def add_flag(name, options={}, &block)
736
+ def add_flag(name_or_flag, options={}, &block)
737
+
738
+ check_parameter name_or_flag, 'name_or_flag', allow_nil: false, types: [ ::String, ::Symbol, ::CLASP::Flag ]
614
739
 
615
- check_parameter name, 'name', allow_nil: false, types: [ ::String, ::Symbol ]
740
+ if ::CLASP::Flag === name_or_flag
616
741
 
617
- aliases << CLASP.Flag(name, **options, &block)
742
+ aliases << name_or_flag
743
+ else
744
+
745
+ aliases << CLASP.Flag(name_or_flag, **options, &block)
746
+ end
618
747
  end
619
748
 
749
+ # Adds an option to +aliases+
750
+ #
751
+ # === Signature
752
+ #
753
+ # * *Parameters*
754
+ # - +name_or_option+:: The option name or instance of CLASP::Option
755
+ # - +options+:: An options hash, containing any of the following options.
620
756
  #
621
757
  # * *Options*
622
758
  # - +:alias+::
@@ -625,19 +761,25 @@ class Climate
625
761
  # - +:values_range+::
626
762
  # - +:default_value+::
627
763
  # - +:extras+::
628
- def add_option(name, options={}, &block)
764
+ def add_option(name_or_option, options={}, &block)
765
+
766
+ check_parameter name_or_option, 'name_or_option', allow_nil: false, types: [ ::String, ::Symbol, ::CLASP::Option ]
629
767
 
630
- check_parameter name, 'name', allow_nil: false, types: [ ::String, ::Symbol ]
768
+ if ::CLASP::Option === name_or_option
631
769
 
632
- aliases << CLASP.Option(name, **options, &block)
770
+ aliases << name_or_option
771
+ else
772
+
773
+ aliases << CLASP.Option(name_or_option, **options, &block)
774
+ end
633
775
  end
634
776
 
635
- # Adds a flag to +aliases+
777
+ # Adds an alias to +aliases+
636
778
  #
637
779
  # === Signature
638
780
  #
639
781
  # * *Parameters*
640
- # - +name+:: The flag/option name or the valued option
782
+ # - +name_or_alias+:: The flag/option name or the valued option
641
783
  # - +aliases+:: One or more aliases
642
784
  #
643
785
  # === Examples
@@ -670,12 +812,22 @@ class Climate
670
812
  # +climate.add_option('--verbosity')+
671
813
  # +climate.add_alias('--verbosity=succinct', '-s')+
672
814
  # +climate.add_alias('--verbosity=verbose', '-v')+
673
- def add_alias(name, *aliases)
815
+ def add_alias(name_or_alias, *aliases)
674
816
 
675
- check_parameter name, 'name', allow_nil: false, types: [ ::String, ::Symbol ]
817
+ check_parameter name_or_alias, 'name_or_alias', allow_nil: false, types: [ ::String, ::Symbol, ::CLASP::Flag, ::CLASP::Option ]
676
818
  raise ArgumentError, "must supply at least one alias" if aliases.empty?
677
819
 
678
- self.aliases << CLASP.Alias(name, aliases: aliases)
820
+ case name_or_alias
821
+ when ::CLASP::Flag
822
+
823
+ self.aliases << name_or_alias
824
+ when ::CLASP::Option
825
+
826
+ self.aliases << name_or_alias
827
+ else
828
+
829
+ self.aliases << CLASP.Alias(name_or_alias, aliases: aliases)
830
+ end
679
831
  end
680
832
  end # class Climate
681
833
 
@@ -4,11 +4,11 @@
4
4
  # Purpose: Version for libclimate.Ruby library
5
5
  #
6
6
  # Created: 13th July 2015
7
- # Updated: 23rd February 2018
7
+ # Updated: 12th March 2019
8
8
  #
9
9
  # Home: http://github.com/synesissoftware/libCLImate.Ruby
10
10
  #
11
- # Copyright (c) 2015-2018, Matthew Wilson and Synesis Software
11
+ # Copyright (c) 2015-2019, Matthew Wilson and Synesis Software
12
12
  # All rights reserved.
13
13
  #
14
14
  # Redistribution and use in source and binary forms, with or without
@@ -43,7 +43,7 @@
43
43
  module LibCLImate
44
44
 
45
45
  # Current version of the libCLImate.Ruby library
46
- VERSION = '0.7.5'
46
+ VERSION = '0.11.0'
47
47
 
48
48
  private
49
49
  VERSION_PARTS_ = VERSION.split(/[.]/).collect { |n| n.to_i } # :nodoc:
@@ -84,3 +84,4 @@ end
84
84
 
85
85
  # ############################## end of file ############################# #
86
86
 
87
+
@@ -82,6 +82,29 @@ class Test_Climate_infer_PROGRAM_VERSION_as_array < Test::Unit::TestCase
82
82
  end
83
83
  end
84
84
 
85
+ class Test_Climate_infer_version_3_2_99_via_PATCH < Test::Unit::TestCase
86
+
87
+ PROGRAM_VER_MINOR = 7
88
+ PROGRAM_VER_PATCH = 101
89
+
90
+ def test_inference_of_version
91
+
92
+ strout = StringIO.new
93
+
94
+ climate = LibCLImate::Climate.new(version_context: self) do |cl|
95
+
96
+ cl.program_name = 'myprog'
97
+ cl.stdout = strout
98
+
99
+ cl.exit_on_usage = false
100
+ end.run [ 'myprog', '--version' ]
101
+
102
+ s = strout.string
103
+
104
+ assert_equal "myprog 3.7.101", s.chomp
105
+ end
106
+ end
107
+
85
108
  # ############################## end of file ############################# #
86
109
 
87
110
 
@@ -360,3 +360,4 @@ end
360
360
 
361
361
  # ############################## end of file ############################# #
362
362
 
363
+
@@ -87,3 +87,4 @@ end
87
87
 
88
88
  # ############################## end of file ############################# #
89
89
 
90
+
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), '../..', 'lib')
4
+
5
+
6
+ require 'libclimate'
7
+
8
+ require 'xqsr3/extensions/test/unit'
9
+ require 'test/unit'
10
+
11
+ require 'stringio'
12
+
13
+ class Test_Climate_values_constraints < Test::Unit::TestCase
14
+
15
+ def test_constrain_with_no_constraint
16
+
17
+ stdout = StringIO.new
18
+ stderr = StringIO.new
19
+
20
+ climate = LibCLImate::Climate.new do |cl|
21
+
22
+ cl.exit_on_unknown = false
23
+
24
+ cl.stdout = stdout
25
+ cl.stderr = stderr
26
+ end
27
+
28
+ stdout.truncate(0)
29
+ stderr.truncate(0)
30
+ r = climate.run [ ]
31
+ assert_equal 0, r.values.size
32
+ assert_empty stdout.string
33
+ assert_empty stderr.string
34
+
35
+ stdout.truncate(0)
36
+ stderr.truncate(0)
37
+ r = climate.run [ 'value-1' ]
38
+ assert_equal 1, r.values.size
39
+ assert_empty stdout.string
40
+ assert_empty stderr.string
41
+ end
42
+
43
+ def test_constrain_with_integer
44
+
45
+ stdout = StringIO.new
46
+ stderr = StringIO.new
47
+
48
+ climate = LibCLImate::Climate.new do |cl|
49
+
50
+ cl.exit_on_unknown = false
51
+
52
+ cl.stdout = stdout
53
+ cl.stderr = stderr
54
+
55
+ cl.constrain_values = 2
56
+ end
57
+
58
+ stdout.truncate(0)
59
+ stderr.truncate(0)
60
+ r = climate.run [ ]
61
+ assert_equal 0, r.values.size
62
+ assert_empty stdout.string
63
+ assert_not_empty stderr.string
64
+ assert_match /wrong number of values.*0 given.*2 required.*/, stderr.string
65
+
66
+ stdout.truncate(0)
67
+ stderr.truncate(0)
68
+ r = climate.run [ 'value-1' ]
69
+ assert_equal 1, r.values.size
70
+ assert_empty stdout.string
71
+ assert_not_empty stderr.string
72
+ assert_match /wrong number of values.*1 given.*2 required.*/, stderr.string
73
+
74
+ stdout.truncate(0)
75
+ stderr.truncate(0)
76
+ r = climate.run [ 'value-1', 'value-2' ]
77
+ assert_equal 2, r.values.size
78
+ assert_empty stdout.string
79
+ assert_empty stderr.string
80
+
81
+ stdout.truncate(0)
82
+ stderr.truncate(0)
83
+ r = climate.run [ 'value-1', 'value-2', 'value-3' ]
84
+ assert_equal 3, r.values.size
85
+ assert_empty stdout.string
86
+ assert_not_empty stderr.string
87
+ assert_match /wrong number of values.*3 given.*2 required.*/, stderr.string
88
+ end
89
+
90
+ def test_constrain_with_simple_range
91
+
92
+ stdout = StringIO.new
93
+ stderr = StringIO.new
94
+
95
+ climate = LibCLImate::Climate.new do |cl|
96
+
97
+ cl.exit_on_unknown = false
98
+
99
+ cl.stdout = stdout
100
+ cl.stderr = stderr
101
+
102
+ cl.constrain_values = 0..2
103
+ end
104
+
105
+ stdout.truncate(0)
106
+ stderr.truncate(0)
107
+ r = climate.run [ ]
108
+ assert_equal 0, r.values.size
109
+ assert_empty stdout.string
110
+ assert_empty stderr.string
111
+
112
+ stdout.truncate(0)
113
+ stderr.truncate(0)
114
+ r = climate.run [ 'value-1' ]
115
+ assert_equal 1, r.values.size
116
+ assert_empty stdout.string
117
+ assert_empty stderr.string
118
+
119
+ stdout.truncate(0)
120
+ stderr.truncate(0)
121
+ r = climate.run [ 'value-1', 'value-2' ]
122
+ assert_equal 2, r.values.size
123
+ assert_empty stdout.string
124
+ assert_empty stderr.string
125
+
126
+ stdout.truncate(0)
127
+ stderr.truncate(0)
128
+ r = climate.run [ 'value-1', 'value-2', 'value-3' ]
129
+ assert_equal 3, r.values.size
130
+ assert_empty stdout.string
131
+ assert_not_empty stderr.string
132
+
133
+ stdout.truncate(0)
134
+ stderr.truncate(0)
135
+ r = climate.run [ 'value-1', 'value-2', 'value-3', 'value-4' ]
136
+ assert_equal 4, r.values.size
137
+ assert_empty stdout.string
138
+ assert_not_empty stderr.string
139
+ end
140
+ end
141
+
@@ -50,3 +50,4 @@ end
50
50
 
51
51
  # ############################## end of file ############################# #
52
52
 
53
+
@@ -50,3 +50,4 @@ end
50
50
 
51
51
  # ############################## end of file ############################# #
52
52
 
53
+
metadata CHANGED
@@ -1,55 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libclimate-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.5
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Wilson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-23 00:00:00.000000000 Z
11
+ date: 2019-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clasp-ruby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: 0.13.2
20
- - - <
21
- - !ruby/object:Gem::Version
22
- version: '1.0'
19
+ version: '0.15'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - '>='
28
- - !ruby/object:Gem::Version
29
- version: 0.13.2
30
- - - <
24
+ - - ~>
31
25
  - !ruby/object:Gem::Version
32
- version: '1.0'
26
+ version: '0.15'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: xqsr3
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
- - - '>='
38
- - !ruby/object:Gem::Version
39
- version: 0.8.4
40
- - - <
31
+ - - ~>
41
32
  - !ruby/object:Gem::Version
42
- version: '1.0'
33
+ version: '0.31'
43
34
  type: :runtime
44
35
  prerelease: false
45
36
  version_requirements: !ruby/object:Gem::Requirement
46
37
  requirements:
47
- - - '>='
38
+ - - ~>
48
39
  - !ruby/object:Gem::Version
49
- version: 0.8.4
50
- - - <
51
- - !ruby/object:Gem::Version
52
- version: '1.0'
40
+ version: '0.31'
53
41
  description: |2+
54
42
 
55
43
  email: matthew@synesis.com.au
@@ -57,12 +45,10 @@ executables: []
57
45
  extensions: []
58
46
  extra_rdoc_files: []
59
47
  files:
60
- - LICENSE
61
- - README.md
62
- - lib/libclimate.rb
63
48
  - lib/libclimate/climate.rb
64
49
  - lib/libclimate/libclimate.rb
65
50
  - lib/libclimate/version.rb
51
+ - lib/libclimate.rb
66
52
  - test/scratch/aliases.rb
67
53
  - test/scratch/blankzeroes.rb
68
54
  - test/unit/tc_abort.rb
@@ -70,9 +56,12 @@ files:
70
56
  - test/unit/tc_minimal.rb
71
57
  - test/unit/tc_minimal_CLASP.rb
72
58
  - test/unit/tc_test_aliases.rb
59
+ - test/unit/tc_values.rb
73
60
  - test/unit/tc_with_blocks.rb
74
61
  - test/unit/tc_with_blocks_CLASP.rb
75
62
  - test/unit/ts_all.rb
63
+ - README.md
64
+ - LICENSE
76
65
  homepage: http://www.libclimate.org/
77
66
  licenses:
78
67
  - Modified BSD
@@ -83,9 +72,9 @@ require_paths:
83
72
  - lib
84
73
  required_ruby_version: !ruby/object:Gem::Requirement
85
74
  requirements:
86
- - - '>='
75
+ - - ~>
87
76
  - !ruby/object:Gem::Version
88
- version: '0'
77
+ version: '2.0'
89
78
  required_rubygems_version: !ruby/object:Gem::Requirement
90
79
  requirements:
91
80
  - - '>='
@@ -93,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
82
  version: '0'
94
83
  requirements: []
95
84
  rubyforge_project:
96
- rubygems_version: 2.7.5
85
+ rubygems_version: 2.0.14.1
97
86
  signing_key:
98
87
  specification_version: 4
99
88
  summary: libCLImate.Ruby