command_kit 0.1.0.pre2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +15 -0
  3. data/.rubocop.yml +141 -0
  4. data/ChangeLog.md +98 -2
  5. data/Gemfile +3 -0
  6. data/README.md +189 -117
  7. data/Rakefile +3 -2
  8. data/command_kit.gemspec +4 -4
  9. data/examples/command.rb +1 -1
  10. data/gemspec.yml +10 -2
  11. data/lib/command_kit/arguments/argument.rb +2 -0
  12. data/lib/command_kit/arguments/argument_value.rb +2 -0
  13. data/lib/command_kit/arguments.rb +23 -4
  14. data/lib/command_kit/colors.rb +253 -45
  15. data/lib/command_kit/command.rb +6 -1
  16. data/lib/command_kit/command_name.rb +9 -0
  17. data/lib/command_kit/commands/auto_load.rb +24 -1
  18. data/lib/command_kit/commands/auto_require.rb +16 -0
  19. data/lib/command_kit/commands/command.rb +3 -0
  20. data/lib/command_kit/commands/help.rb +5 -2
  21. data/lib/command_kit/commands/parent_command.rb +7 -0
  22. data/lib/command_kit/commands/subcommand.rb +13 -1
  23. data/lib/command_kit/commands.rb +54 -9
  24. data/lib/command_kit/description.rb +12 -1
  25. data/lib/command_kit/env/home.rb +9 -0
  26. data/lib/command_kit/env/path.rb +16 -1
  27. data/lib/command_kit/env.rb +4 -0
  28. data/lib/command_kit/examples.rb +12 -1
  29. data/lib/command_kit/exception_handler.rb +4 -0
  30. data/lib/command_kit/help/man.rb +26 -30
  31. data/lib/command_kit/help.rb +7 -1
  32. data/lib/command_kit/inflector.rb +49 -17
  33. data/lib/command_kit/interactive.rb +248 -0
  34. data/lib/command_kit/main.rb +18 -9
  35. data/lib/command_kit/man.rb +44 -0
  36. data/lib/command_kit/open_app.rb +69 -0
  37. data/lib/command_kit/options/option.rb +3 -6
  38. data/lib/command_kit/options/option_value.rb +5 -2
  39. data/lib/command_kit/options/parser.rb +46 -19
  40. data/lib/command_kit/options/quiet.rb +3 -0
  41. data/lib/command_kit/options/verbose.rb +5 -0
  42. data/lib/command_kit/options/version.rb +6 -0
  43. data/lib/command_kit/options.rb +32 -7
  44. data/lib/command_kit/os/linux.rb +157 -0
  45. data/lib/command_kit/os.rb +165 -11
  46. data/lib/command_kit/package_manager.rb +200 -0
  47. data/lib/command_kit/pager.rb +80 -11
  48. data/lib/command_kit/printing/indent.rb +27 -4
  49. data/lib/command_kit/printing.rb +35 -1
  50. data/lib/command_kit/program_name.rb +7 -0
  51. data/lib/command_kit/stdio.rb +24 -0
  52. data/lib/command_kit/sudo.rb +40 -0
  53. data/lib/command_kit/terminal.rb +159 -0
  54. data/lib/command_kit/usage.rb +14 -0
  55. data/lib/command_kit/version.rb +1 -1
  56. data/lib/command_kit/xdg.rb +13 -0
  57. data/lib/command_kit.rb +1 -0
  58. data/spec/arguments/argument_spec.rb +2 -2
  59. data/spec/arguments_spec.rb +53 -27
  60. data/spec/colors_spec.rb +277 -13
  61. data/spec/command_name_spec.rb +1 -1
  62. data/spec/command_spec.rb +79 -5
  63. data/spec/commands/auto_load/subcommand_spec.rb +1 -1
  64. data/spec/commands/auto_load_spec.rb +34 -3
  65. data/spec/commands/auto_require_spec.rb +2 -2
  66. data/spec/commands/help_spec.rb +1 -1
  67. data/spec/commands/parent_command_spec.rb +1 -1
  68. data/spec/commands/subcommand_spec.rb +1 -1
  69. data/spec/commands_spec.rb +103 -29
  70. data/spec/description_spec.rb +1 -25
  71. data/spec/env/home_spec.rb +1 -1
  72. data/spec/env/path_spec.rb +7 -1
  73. data/spec/examples_spec.rb +1 -25
  74. data/spec/exception_handler_spec.rb +1 -1
  75. data/spec/help/man_spec.rb +45 -58
  76. data/spec/help_spec.rb +0 -25
  77. data/spec/inflector_spec.rb +71 -9
  78. data/spec/interactive_spec.rb +415 -0
  79. data/spec/main_spec.rb +7 -7
  80. data/spec/man_spec.rb +46 -0
  81. data/spec/open_app_spec.rb +85 -0
  82. data/spec/options/option_spec.rb +5 -5
  83. data/spec/options/option_value_spec.rb +56 -1
  84. data/spec/options_spec.rb +283 -1
  85. data/spec/os/linux_spec.rb +164 -0
  86. data/spec/os_spec.rb +201 -14
  87. data/spec/package_manager_spec.rb +806 -0
  88. data/spec/pager_spec.rb +76 -11
  89. data/spec/printing/indent_spec.rb +8 -6
  90. data/spec/printing_spec.rb +33 -3
  91. data/spec/program_name_spec.rb +1 -1
  92. data/spec/spec_helper.rb +0 -3
  93. data/spec/sudo_spec.rb +51 -0
  94. data/spec/{console_spec.rb → terminal_spec.rb} +65 -35
  95. data/spec/usage_spec.rb +2 -2
  96. data/spec/xdg_spec.rb +1 -1
  97. metadata +26 -8
  98. data/lib/command_kit/console.rb +0 -141
@@ -14,6 +14,8 @@ module CommandKit
14
14
  #
15
15
  # Represents an additional argument associated with an option flag.
16
16
  #
17
+ # @api private
18
+ #
17
19
  class OptionValue < Arguments::ArgumentValue
18
20
 
19
21
  # Maps OptionParser types to USAGE strings.
@@ -39,7 +41,7 @@ module CommandKit
39
41
 
40
42
  # The desired type of the argument value.
41
43
  #
42
- # @return [Class, Hash, Array, Regexp, nil]
44
+ # @return [Class, Hash, Array, Regexp]
43
45
  attr_reader :type
44
46
 
45
47
  # The default parsed value for the argument value.
@@ -90,10 +92,11 @@ module CommandKit
90
92
  def self.default_usage(type)
91
93
  USAGES.fetch(type) do
92
94
  case type
93
- when Class then Inflector.underscore(type.name).upcase
94
95
  when Hash then type.keys.join('|')
95
96
  when Array then type.join('|')
96
97
  when Regexp then type.source
98
+ when Class
99
+ Inflector.underscore(Inflector.demodularize(type.name)).upcase
97
100
  else
98
101
  raise(TypeError,"unsupported option type: #{type.inspect}")
99
102
  end
@@ -33,6 +33,9 @@ module CommandKit
33
33
  include Main
34
34
  include Printing
35
35
 
36
+ #
37
+ # @api private
38
+ #
36
39
  module ModuleMethods
37
40
  #
38
41
  # Sets {CommandKit::Usage::ClassMethods#usage .usage} or extends
@@ -58,6 +61,8 @@ module CommandKit
58
61
  # The option parser.
59
62
  #
60
63
  # @return [OptionParser]
64
+ #
65
+ # @api semipublic
61
66
  attr_reader :option_parser
62
67
 
63
68
  #
@@ -65,6 +70,8 @@ module CommandKit
65
70
  #
66
71
  # @return [OptionParser]
67
72
  #
73
+ # @api public
74
+ #
68
75
  def initialize(**kwargs)
69
76
  super(**kwargs)
70
77
 
@@ -91,6 +98,8 @@ module CommandKit
91
98
  # @return [Integer]
92
99
  # The exit status code.
93
100
  #
101
+ # @api public
102
+ #
94
103
  def main(argv=[])
95
104
  super(parse_options(argv))
96
105
  rescue SystemExit => system_exit
@@ -106,24 +115,24 @@ module CommandKit
106
115
  # @return [Array<String>]
107
116
  # The remaining non-option arguments.
108
117
  #
118
+ # @api semipublic
119
+ #
109
120
  def parse_options(argv)
110
- begin
111
- option_parser.parse(argv)
112
- rescue OptionParser::InvalidOption => error
113
- on_invalid_option(error)
114
- rescue OptionParser::AmbiguousOption => error
115
- on_ambiguous_option(error)
116
- rescue OptionParser::InvalidArgument => error
117
- on_invalid_argument(error)
118
- rescue OptionParser::MissingArgument => error
119
- on_missing_argument(error)
120
- rescue OptionParser::NeedlessArgument => error
121
- on_needless_argument(error)
122
- rescue OptionParser::AmbiguousArgument => error
123
- on_ambiguous_argument(error)
124
- rescue OptionParser::ParseError => error
125
- on_parse_error(error)
126
- end
121
+ option_parser.parse(argv)
122
+ rescue OptionParser::InvalidOption => error
123
+ on_invalid_option(error)
124
+ rescue OptionParser::AmbiguousOption => error
125
+ on_ambiguous_option(error)
126
+ rescue OptionParser::InvalidArgument => error
127
+ on_invalid_argument(error)
128
+ rescue OptionParser::MissingArgument => error
129
+ on_missing_argument(error)
130
+ rescue OptionParser::NeedlessArgument => error
131
+ on_needless_argument(error)
132
+ rescue OptionParser::AmbiguousArgument => error
133
+ on_ambiguous_argument(error)
134
+ rescue OptionParser::ParseError => error
135
+ on_parse_error(error)
127
136
  end
128
137
 
129
138
  #
@@ -132,9 +141,11 @@ module CommandKit
132
141
  # @param [OptionParser::ParseError] error
133
142
  # The error from `OptionParser`.
134
143
  #
144
+ # @api semipublic
145
+ #
135
146
  def on_parse_error(error)
136
- print_error("#{command_name}: #{error.message}")
137
- print_error("Try '#{command_name} --help' for more information.")
147
+ print_error(error.message)
148
+ stderr.puts("Try '#{command_name} --help' for more information.")
138
149
  exit(1)
139
150
  end
140
151
 
@@ -145,6 +156,8 @@ module CommandKit
145
156
  #
146
157
  # @see on_parse_error
147
158
  #
159
+ # @api semipublic
160
+ #
148
161
  def on_invalid_option(error)
149
162
  on_parse_error(error)
150
163
  end
@@ -157,6 +170,8 @@ module CommandKit
157
170
  #
158
171
  # @see on_parse_error
159
172
  #
173
+ # @api semipublic
174
+ #
160
175
  def on_ambiguous_option(error)
161
176
  on_parse_error(error)
162
177
  end
@@ -169,6 +184,8 @@ module CommandKit
169
184
  #
170
185
  # @see on_parse_error
171
186
  #
187
+ # @api semipublic
188
+ #
172
189
  def on_invalid_argument(error)
173
190
  on_parse_error(error)
174
191
  end
@@ -181,6 +198,8 @@ module CommandKit
181
198
  #
182
199
  # @see on_parse_error
183
200
  #
201
+ # @api semipublic
202
+ #
184
203
  def on_missing_argument(error)
185
204
  on_parse_error(error)
186
205
  end
@@ -193,6 +212,8 @@ module CommandKit
193
212
  #
194
213
  # @see on_parse_error
195
214
  #
215
+ # @api semipublic
216
+ #
196
217
  def on_needless_argument(error)
197
218
  on_parse_error(error)
198
219
  end
@@ -205,6 +226,8 @@ module CommandKit
205
226
  #
206
227
  # @see on_parse_error
207
228
  #
229
+ # @api semipublic
230
+ #
208
231
  def on_ambiguous_argument(error)
209
232
  on_parse_error(error)
210
233
  end
@@ -212,6 +235,8 @@ module CommandKit
212
235
  #
213
236
  # Prints the `--help` output.
214
237
  #
238
+ # @api semipublic
239
+ #
215
240
  def help_options
216
241
  puts option_parser
217
242
  end
@@ -219,6 +244,8 @@ module CommandKit
219
244
  #
220
245
  # @see #help_options
221
246
  #
247
+ # @api public
248
+ #
222
249
  def help
223
250
  help_options
224
251
  end
@@ -18,6 +18,9 @@ module CommandKit
18
18
  module Quiet
19
19
  include Options
20
20
 
21
+ #
22
+ # @api private
23
+ #
21
24
  module ModuleMethods
22
25
  #
23
26
  # Defines a `-q, --quiet` option.
@@ -18,6 +18,9 @@ module CommandKit
18
18
  module Verbose
19
19
  include Options
20
20
 
21
+ #
22
+ # @api private
23
+ #
21
24
  module ModuleMethods
22
25
  #
23
26
  # Defines a `-v, --verbose` option or extends {ModuleMethods}, depending
@@ -47,6 +50,8 @@ module CommandKit
47
50
  #
48
51
  # @return [Boolean]
49
52
  #
53
+ # @api public
54
+ #
50
55
  def verbose?
51
56
  @verbose
52
57
  end
@@ -35,6 +35,8 @@ module CommandKit
35
35
  # @return [String, nil]
36
36
  # The classes version string.
37
37
  #
38
+ # @api public
39
+ #
38
40
  def version(new_version=nil)
39
41
  if new_version
40
42
  @version = new_version
@@ -47,6 +49,8 @@ module CommandKit
47
49
  #
48
50
  # @see ClassMethods#version
49
51
  #
52
+ # @api public
53
+ #
50
54
  def version
51
55
  self.class.version
52
56
  end
@@ -54,6 +58,8 @@ module CommandKit
54
58
  #
55
59
  # Prints the version.
56
60
  #
61
+ # @api public
62
+ #
57
63
  def print_version
58
64
  puts "#{command_name} #{version}"
59
65
  end
@@ -1,3 +1,4 @@
1
+ require 'command_kit/arguments'
1
2
  require 'command_kit/options/option'
2
3
  require 'command_kit/options/parser'
3
4
 
@@ -22,7 +23,7 @@ module CommandKit
22
23
  # @bar = arg.split(':')
23
24
  # end
24
25
  #
25
- # ### initialize and using ivars
26
+ # ### initialize and using instance variables
26
27
  #
27
28
  # option :number, value: {type: Integer},
28
29
  # desc: 'Numbers' do |num|
@@ -36,8 +37,12 @@ module CommandKit
36
37
  # end
37
38
  #
38
39
  module Options
40
+ include Arguments
39
41
  include Parser
40
42
 
43
+ #
44
+ # @api private
45
+ #
41
46
  module ModuleMethods
42
47
  #
43
48
  # Extends {ClassMethods} or {ModuleMethods}, depending on whether
@@ -68,6 +73,8 @@ module CommandKit
68
73
  #
69
74
  # @return [Hash{Symbol => Option}]
70
75
  #
76
+ # @api semipublic
77
+ #
71
78
  def options
72
79
  @options ||= if superclass.kind_of?(ClassMethods)
73
80
  superclass.options.dup
@@ -172,6 +179,8 @@ module CommandKit
172
179
  # # ...
173
180
  # end
174
181
  #
182
+ # @api public
183
+ #
175
184
  def option(name,**kwargs,&block)
176
185
  options[name] = Option.new(name,**kwargs,&block)
177
186
  end
@@ -180,6 +189,9 @@ module CommandKit
180
189
  # Hash of parsed option values.
181
190
  #
182
191
  # @return [Hash{Symbol => Object}]
192
+ #
193
+ # @api semipublic
194
+ #
183
195
  attr_reader :options
184
196
 
185
197
  #
@@ -187,24 +199,26 @@ module CommandKit
187
199
  # {Parser#option_parser option parser}.
188
200
  #
189
201
  # @param [Hash{Symbol => Object}] options
190
- # Optional pre-populated options hash.
202
+ # Optional prepopulated options hash.
191
203
  #
192
204
  # @note
193
205
  # The {#option_parser} will populate {#options} and also call any
194
206
  # {ClassMethods#option option} blocks with the parsed option values.
195
207
  #
208
+ # @api public
209
+ #
196
210
  def initialize(options: {}, **kwargs)
197
211
  @options = options
198
212
 
199
213
  super(**kwargs)
200
214
 
201
215
  self.class.options.each_value do |option|
216
+ default_value = option.default_value
217
+
218
+ @options[option.name] = default_value unless default_value.nil?
219
+
202
220
  option_parser.on(*option.usage,option.type,option.desc) do |arg,*captures|
203
- @options[option.name] = if arg.nil?
204
- option.default_value
205
- else
206
- arg
207
- end
221
+ @options[option.name] = arg
208
222
 
209
223
  if option.block
210
224
  instance_exec(*arg,*captures,&option.block)
@@ -212,5 +226,16 @@ module CommandKit
212
226
  end
213
227
  end
214
228
  end
229
+
230
+ #
231
+ # Overrides the default {Usage#help help} method and calls {#help_options}
232
+ # and {#help_arguments}.
233
+ #
234
+ # @api public
235
+ #
236
+ def help
237
+ help_options
238
+ help_arguments
239
+ end
215
240
  end
216
241
  end
@@ -0,0 +1,157 @@
1
+ require 'command_kit/os'
2
+
3
+ module CommandKit
4
+ module OS
5
+ #
6
+ # Provides methods for determining the specific type of Linux.
7
+ #
8
+ # ## Example
9
+ #
10
+ # require 'command_kit/command'
11
+ # require 'command_kit/os/linux'
12
+ #
13
+ # class Command < CommandKit::Command
14
+ #
15
+ # include CommandKit::OS::Linux
16
+ #
17
+ # def run
18
+ # if debian_linux?
19
+ # # ...
20
+ # elsif redhat_linux?
21
+ # # ...
22
+ # elsif suse_linux?
23
+ # # ...
24
+ # elsif arch_linux?
25
+ # # ...
26
+ # end
27
+ # end
28
+ # end
29
+ #
30
+ # @since 0.2.0
31
+ #
32
+ module Linux
33
+ #
34
+ # @api private
35
+ #
36
+ module ModuleMethods
37
+ #
38
+ # Extends {ClassMethods} or {ModuleMethods}, depending on whether
39
+ # {OS} is being included into a class or a module..
40
+ #
41
+ # @param [Class, Module] context
42
+ # The class or module which is including {OS}.
43
+ #
44
+ def included(context)
45
+ super(context)
46
+
47
+ if context.class == Module
48
+ context.extend ModuleMethods
49
+ else
50
+ context.extend ClassMethods
51
+ end
52
+ end
53
+ end
54
+
55
+ extend ModuleMethods
56
+
57
+ module ClassMethods
58
+ #
59
+ # Determines the specific Linux distro.
60
+ #
61
+ # @return [:fedora, :redhat, :debian, :suse, :arch, nil]
62
+ # Returns the type of Linux distro or `nil` if the Linux distro could
63
+ # not be determined.
64
+ #
65
+ # @api semipublic
66
+ #
67
+ def linux_distro
68
+ if File.file?('/etc/fedora-release') then :fedora
69
+ elsif File.file?('/etc/redhat-release') then :redhat
70
+ elsif File.file?('/etc/debian_version') then :debian
71
+ elsif File.file?('/etc/SuSE-release') then :suse
72
+ elsif File.file?('/etc/arch-release') then :arch
73
+ end
74
+ end
75
+ end
76
+
77
+ # The Linux distro.
78
+ #
79
+ # @return [:fedora, :redhat, :debian, :suse, :arch, nil]
80
+ #
81
+ # @api public
82
+ attr_reader :linux_distro
83
+
84
+ #
85
+ # Initializes the command.
86
+ #
87
+ # @param [:fedora, :redhat, :debian, :suse, :arch, nil] linux_distro
88
+ # Overrides the default detected Linux distro.
89
+ #
90
+ # @param [Hash{Symbol => Object}] kwargs
91
+ # Additional keyword arguments.
92
+ #
93
+ # @api public
94
+ #
95
+ def initialize(linux_distro: self.class.linux_distro, **kwargs)
96
+ super(**kwargs)
97
+
98
+ @linux_distro = linux_distro
99
+ end
100
+
101
+ #
102
+ # Determines if the current OS is RedHat Linux based distro.
103
+ #
104
+ # @return [Boolean]
105
+ #
106
+ # @api public
107
+ #
108
+ def redhat_linux?
109
+ @linux_distro == :redhat
110
+ end
111
+
112
+ #
113
+ # Determines if the current OS is Fedora Linux based distro.
114
+ #
115
+ # @return [Boolean]
116
+ #
117
+ # @api public
118
+ #
119
+ def fedora_linux?
120
+ @linux_distro == :fedora
121
+ end
122
+
123
+ #
124
+ # Determines if the current OS is Debian Linux based distro.
125
+ #
126
+ # @return [Boolean]
127
+ #
128
+ # @api public
129
+ #
130
+ def debian_linux?
131
+ @linux_distro == :debian
132
+ end
133
+
134
+ #
135
+ # Determines if the current OS is SUSE Linux based distro.
136
+ #
137
+ # @return [Boolean]
138
+ #
139
+ # @api public
140
+ #
141
+ def suse_linux?
142
+ @linux_distro == :suse
143
+ end
144
+
145
+ #
146
+ # Determines if the current OS is Arch Linux based distro.
147
+ #
148
+ # @return [Boolean]
149
+ #
150
+ # @api public
151
+ #
152
+ def arch_linux?
153
+ @linux_distro == :arch
154
+ end
155
+ end
156
+ end
157
+ end
@@ -4,26 +4,111 @@ module CommandKit
4
4
  #
5
5
  # ## Examples
6
6
  #
7
- # include CommandKit::OS
7
+ # require 'command_kit/command'
8
+ # require 'command_kit/os'
8
9
  #
9
- # def main(*argv)
10
- # if linux?
11
- # # ...
12
- # elsif macos?
13
- # # ...
14
- # elsif windows?
15
- # # ...
10
+ # class Command < CommandKit::Command
11
+ #
12
+ # include CommandKit::OS
13
+ #
14
+ # def main(*argv)
15
+ # if linux?
16
+ # # ...
17
+ # elsif macos?
18
+ # # ...
19
+ # elsif freebsd?
20
+ # # ...
21
+ # elsif windows?
22
+ # # ...
23
+ # end
16
24
  # end
25
+ #
17
26
  # end
18
27
  #
19
28
  module OS
29
+ #
30
+ # @api private
31
+ #
32
+ module ModuleMethods
33
+ #
34
+ # Extends {ClassMethods} or {ModuleMethods}, depending on whether
35
+ # {OS} is being included into a class or a module..
36
+ #
37
+ # @param [Class, Module] context
38
+ # The class or module which is including {OS}.
39
+ #
40
+ def included(context)
41
+ super(context)
42
+
43
+ if context.class == Module
44
+ context.extend ModuleMethods
45
+ else
46
+ context.extend ClassMethods
47
+ end
48
+ end
49
+ end
50
+
51
+ extend ModuleMethods
52
+
53
+ module ClassMethods
54
+ #
55
+ # Determines the current OS.
56
+ #
57
+ # @return [:linux, :macos, :freebsd, :openbsd, :netbsd, :windows, nil]
58
+ # The OS type or `nil` if the OS could not be determined.
59
+ #
60
+ # @api semipublic
61
+ #
62
+ # @since 0.2.0
63
+ #
64
+ def os
65
+ if RUBY_PLATFORM.include?('linux') then :linux
66
+ elsif RUBY_PLATFORM.include?('darwin') then :macos
67
+ elsif RUBY_PLATFORM.include?('freebsd') then :freebsd
68
+ elsif RUBY_PLATFORM.include?('openbsd') then :openbsd
69
+ elsif RUBY_PLATFORM.include?('netbsd') then :netbsd
70
+ elsif Gem.win_platform? then :windows
71
+ end
72
+ end
73
+ end
74
+
75
+ # The current OS.
76
+ #
77
+ # @return [:linux, :macos, :freebsd, :openbsd, :netbsd, :windows, nil]
78
+ #
79
+ # @api public
80
+ #
81
+ # @since 0.2.0
82
+ attr_reader :os
83
+
84
+ #
85
+ # Initializes the command.
86
+ #
87
+ # @param [:linux, :macos, :freebsd, :openbsd, :netbsd, :windows, nil] os
88
+ # Overrides the default OS.
89
+ #
90
+ # @param [Hash{Symbol => Object}] kwargs
91
+ # Additional keyword arguments.
92
+ #
93
+ # @api public
94
+ #
95
+ # @since 0.2.0
96
+ #
97
+ def initialize(os: self.class.os, **kwargs)
98
+ super(**kwargs)
99
+
100
+ @os = os
101
+ end
102
+
20
103
  #
21
104
  # Determines if the current OS is Linux.
22
105
  #
23
106
  # @return [Boolean]
24
107
  #
108
+ # @api public
109
+ #
25
110
  def linux?
26
- RUBY_PLATFORM.include?('linux')
111
+ @os == :linux
27
112
  end
28
113
 
29
114
  #
@@ -31,8 +116,75 @@ module CommandKit
31
116
  #
32
117
  # @return [Boolean]
33
118
  #
119
+ # @api public
120
+ #
34
121
  def macos?
35
- RUBY_PLATFORM.include?('darwin')
122
+ @os == :macos
123
+ end
124
+
125
+ #
126
+ # Determines if the current OS is FreeBSD.
127
+ #
128
+ # @return [Boolean]
129
+ #
130
+ # @api public
131
+ #
132
+ # @since 0.2.0
133
+ #
134
+ def freebsd?
135
+ @os == :freebsd
136
+ end
137
+
138
+ #
139
+ # Determines if the current OS is OpenBSD.
140
+ #
141
+ # @return [Boolean]
142
+ #
143
+ # @api public
144
+ #
145
+ # @since 0.2.0
146
+ #
147
+ def openbsd?
148
+ @os == :openbsd
149
+ end
150
+
151
+ #
152
+ # Determines if the current OS is NetBSD.
153
+ #
154
+ # @return [Boolean]
155
+ #
156
+ # @api public
157
+ #
158
+ # @since 0.2.0
159
+ #
160
+ def netbsd?
161
+ @os == :netbsd
162
+ end
163
+
164
+ #
165
+ # Determines if the current OS is BSD based.
166
+ #
167
+ # @return [Boolean]
168
+ #
169
+ # @since 0.2.0
170
+ #
171
+ # @api public
172
+ #
173
+ def bsd?
174
+ freebsd? || openbsd? || netbsd?
175
+ end
176
+
177
+ #
178
+ # Determines if the current OS is UNIX based.
179
+ #
180
+ # @return [Boolean]
181
+ #
182
+ # @since 0.2.0
183
+ #
184
+ # @api public
185
+ #
186
+ def unix?
187
+ linux? || macos? || bsd?
36
188
  end
37
189
 
38
190
  #
@@ -40,8 +192,10 @@ module CommandKit
40
192
  #
41
193
  # @return [Boolean]
42
194
  #
195
+ # @api public
196
+ #
43
197
  def windows?
44
- Gem.win_platform?
198
+ @os == :windows
45
199
  end
46
200
  end
47
201
  end