cmdlet 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a228cff2db6bbe44396a3ace5b9821d35543741aaf3d747ed4c1558b81b5122a
4
- data.tar.gz: 3700618c940d33e2e5521b8fbc3be24cac854fe484dce81a8d2f6331cbfebf73
3
+ metadata.gz: 49865609277b82bf27cc7275b38f0830109e2228b8ab3629ca1774d07b85f834
4
+ data.tar.gz: 7d6c2c92910fc466f8f0d3e04ebb4356dfb070c17e553a3e573c60e946648032
5
5
  SHA512:
6
- metadata.gz: eaf387c0b489d2ff93d6ff10b6bf158d98d2ac265206d70ff25780fd0bd39c7a16eb54ab843b8844a586c192d52c18e31124afc133ddea403c412d6e0ffb3c3c
7
- data.tar.gz: b599968faa50ddfbc1d8b78a7989df7e7816fedb126260b888919c6e8cdb993352b8acaa5abc29e7d3bc782a72c73d862440f3720f9fc142dffecbcf7816861d
6
+ metadata.gz: d7bd4e1e6364146d104a96bd66425df76f3bd164b350f1b3328f046cc8c8e2b6f2d65eec9dacd18c7ce510e064846f10b0ba2a49315089f6ff0235e494b34387
7
+ data.tar.gz: e0ddc16a51d5c16957ac2241098de2f1a7a0de777f59621d8398da8e61172ae07c9ea796971e48ce024a646eee0c6b29cd1fe93fde4c6840c0d41b497c63da14
@@ -0,0 +1,19 @@
1
+ # Funcky Functions
2
+
3
+ > Funcky provides a set of functions (wrapped in the command pattern) that perform simple actions
4
+
5
+ ## List of categories
6
+
7
+ | Name | Description |
8
+ |-|-|
9
+ {{#each categories}}
10
+ | {{titleize name}} | {{description}} |
11
+ {{/each}}
12
+
13
+ ## List of functions
14
+
15
+ | Category | Name | Alias | Description |
16
+ |-|-|-|-|
17
+ {{#each functions}}
18
+ | {{titleize category}} | `{{name}}` | {{#each alias}}{{surround . '`' '` '}}{{/each}} | {{description}} |
19
+ {{/each}}
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ {{#each commands}}
4
+ require 'cmdlet/{{category}}/{{name}}'
5
+ {{/each}}
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ # reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
4
+
5
+ module Cmdlet
6
+ # {{cmdlet.category_description}}
7
+ module {{camel cmdlet.category}}
8
+ # {{camel cmdlet.name}}: {{cmdlet.command_description}}
9
+ class {{camel cmdlet.name}} < Funcky::BaseFunction
10
+ {{#each cmdlet.usecases}}
11
+ # @example
12
+ #
13
+ # puts {{camel ./function}}.new.parse({{{nice_inputs}}})
14
+ #
15
+ # {{expected_output}}
16
+ #
17
+ {{/each}}
18
+ #
19
+ # @param [String|Int] value - numeric value
20
+ # @return [String] ordinal suffix that would be required for a number
21
+ def parse(value)
22
+ {{{cmdlet.ruby}}}
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # {{camel command.name}}: {{command.function_description}}
4
+ RSpec.describe Funcky::{{camel command.category}}::{{camel command.name}} do
5
+ let(:instance) { described_class.new }
6
+
7
+ describe 'initialize' do
8
+ subject { instance }
9
+
10
+ it { is_expected.not_to be_nil }
11
+ end
12
+
13
+ describe '#parse' do
14
+ subject { instance.parse(value) }
15
+
16
+ let(:value) { nil }
17
+
18
+ context 'safely handle nil' do
19
+ it { is_expected.to eq('') }
20
+ end
21
+ end
22
+ end
data/.builders/_.rb CHANGED
@@ -1 +1,5 @@
1
- require_relative './documents/_'
1
+ # require_relative './documents/_'
2
+ require_relative './director/category_director'
3
+ require_relative './director/cmdlet_builder'
4
+ require_relative './director/cmdlet_director'
5
+ require_relative './director/cmdlet_child'
data/.builders/boot.rb CHANGED
@@ -49,10 +49,10 @@ KConfig.configure(CONFIG_KEY) do |config|
49
49
  config.template_folders.add(:template , File.expand_path('.templates', Dir.pwd))
50
50
 
51
51
  config.target_folders.add(:app , base_folder)
52
- config.target_folders.add(:lib , :app, 'lib/funcky')
53
- config.target_folders.add(:spec , :app, 'spec/funcky')
52
+ config.target_folders.add(:lib , :app, 'lib/cmdlet')
53
+ config.target_folders.add(:spec , :app, 'spec/cmdlet')
54
54
  config.target_folders.add(:builder , builder_folder)
55
-
55
+ config.target_folders.add(:builder_data , :builder, 'data')
56
56
  end
57
57
 
58
58
  KConfig.configuration(CONFIG_KEY).debug
@@ -62,6 +62,7 @@ resource_manager = area.resource_manager
62
62
  resource_manager
63
63
  .fileset
64
64
  .glob('*.rb', exclude: ['boot.rb'])
65
+ .glob('documents/**/*.rb')
65
66
  .glob('generators/**/*.rb')
66
67
  resource_manager.add_resources
67
68
 
@@ -0,0 +1,36 @@
1
+ {
2
+ "categories": [
3
+ {
4
+ "name": "case",
5
+ "description": "Tokenize and apply case and/or separator"
6
+ },
7
+ {
8
+ "name": "comparison",
9
+ "description": "Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc."
10
+ },
11
+ {
12
+ "name": "inflection",
13
+ "description": "Inflection handling routines, eg. pluralize, singular, ordinalize"
14
+ },
15
+ {
16
+ "name": "string",
17
+ "description": "String handling helpers"
18
+ },
19
+ {
20
+ "name": "a_array",
21
+ "description": "Array handling routines, eg. join, join_prefix, join_post"
22
+ },
23
+ {
24
+ "name": "a_transform",
25
+ "description": "Tokenize and apply case and/or separator"
26
+ },
27
+ {
28
+ "name": "a_comparison",
29
+ "description": "Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc."
30
+ },
31
+ {
32
+ "name": "a_inflection",
33
+ "description": "Inflection handling routines, eg. pluralize, singular, ordinalize"
34
+ }
35
+ ]
36
+ }
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CategoryDirector < KDirector::Directors::BaseDirector
4
+ def category(name, description)
5
+ value = {
6
+ name: name,
7
+ description: description
8
+ }
9
+
10
+ builder.add(:categories, value: value)
11
+
12
+ self
13
+ end
14
+
15
+ def category_file
16
+ k_builder.target_folders.join(:builder_data, 'categories.json')
17
+ end
18
+
19
+ def save_categories
20
+ cd(:builder_data)
21
+ add('categories.json', content: builder.to_json)
22
+
23
+ self
24
+ end
25
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CmdletBuilder < KDirector::Builders::ActionsBuilder
4
+ attr_reader :current_helper
5
+ # attr_accessor :actions
6
+ # attr_accessor :last_action
7
+
8
+ def initialize
9
+ super
10
+
11
+ dom[:helpers] = []
12
+ dom[:categories] = []
13
+ # @actions = []
14
+ # @last_action = {}
15
+ end
16
+
17
+ def category(name, description)
18
+ dom[:categories] << {
19
+ name: name,
20
+ description: description,
21
+ }
22
+ end
23
+
24
+ def helpers
25
+ dom[:helpers]
26
+ end
27
+
28
+ def add_helper
29
+ @current_helper = new_helper
30
+ dom[:helpers] << current_helper
31
+ end
32
+
33
+ def helper_setting(name, value)
34
+ @current_helper[name] = value
35
+ end
36
+
37
+ def add_helper_parameter(name, description, splat: false)
38
+ parameter = {
39
+ name: name,
40
+ description: description,
41
+ splat: splat
42
+ }
43
+
44
+ @current_helper[:parameters] << parameter
45
+ end
46
+
47
+ def add_helper_example(value)
48
+ lines = value.split("\n")
49
+ value = lines.map { |line| " # #{line.strip}" }.join("\n")
50
+
51
+ @current_helper[:examples] << value
52
+ end
53
+
54
+
55
+ private
56
+
57
+ def new_helper
58
+ {
59
+ name: nil,
60
+ description: nil,
61
+ result: nil,
62
+ category: nil,
63
+ category_description: nil,
64
+ base_class_require: nil,
65
+ base_class: nil,
66
+ example_input_value: nil,
67
+ example_output_value: nil,
68
+ test_input_value: nil,
69
+ test_output_value: nil,
70
+ parameters: [],
71
+ examples: []
72
+ }
73
+ end
74
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ class HandlebarsHelperChild < KDirector::Directors::ChildDirector
4
+ def initialize(parent, **opts)
5
+ super(parent, **opts)
6
+
7
+ builder.add_helper
8
+
9
+ # defaults = {
10
+ # repo_name: opts[:repo_name], # || parent.builder.dom&[:github]&[:repo_name]
11
+ # username: opts[:username] || default_github_username, # || parent.builder.dom&[:github]&[:username]
12
+ # organization: opts[:organization] # || parent.builder.dom&[:github]&[:organization]
13
+ # }
14
+ end
15
+
16
+ def name(value)
17
+ builder.helper_setting(:name, value)
18
+ end
19
+
20
+ def description(value)
21
+ builder.helper_setting(:description, value)
22
+ end
23
+
24
+ def result(value)
25
+ builder.helper_setting(:result, value)
26
+ end
27
+
28
+ def category(value)
29
+ builder.helper_setting(:category, value)
30
+ end
31
+
32
+ def category_description(value)
33
+ builder.helper_setting(:category_description, value)
34
+ end
35
+
36
+ # def base_class_require(value)
37
+ # builder.helper_setting(:base_class_require, value)
38
+ # end
39
+
40
+ # def base_class(value)
41
+ # builder.helper_setting(:base_class, value)
42
+ # end
43
+
44
+ # def example_input_value(value)
45
+ # builder.helper_setting(:example_input_value, value)
46
+ # end
47
+
48
+ # def example_output_value(value)
49
+ # builder.helper_setting(:example_output_value, value)
50
+ # end
51
+
52
+ # def test_input_value(value)
53
+ # builder.helper_setting(:test_input_value, value)
54
+ # end
55
+
56
+ # def test_output_value(value)
57
+ # builder.helper_setting(:test_output_value, value)
58
+ # end
59
+
60
+ def parameter(name, description, splat: false)
61
+ builder.add_helper_parameter(name, description, splat: splat)
62
+ end
63
+
64
+ def example(value)
65
+ builder.add_helper_example(value)
66
+ end
67
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CmdletDirector < KDirector::Directors::BaseDirector
4
+ default_builder_type(CmdletBuilder)
5
+
6
+ def category(name, description)
7
+ builder.category(name, description)
8
+
9
+ self
10
+ end
11
+
12
+ def helper(**opts, &block)
13
+ helper = CmdletChild.new(self, **opts)
14
+ helper.instance_eval(&block) if block_given?
15
+
16
+ self
17
+ end
18
+
19
+ def build_helpers
20
+ builder.helpers.each do |helper|
21
+ cd(:lib)
22
+ add("helpers/#{helper[:category]}/#{helper[:name]}.rb", template_file: 'helper.rb', helper: helper)
23
+
24
+ cd(:spec)
25
+ add("helpers/#{helper[:category]}/#{helper[:name]}_spec.rb", template_file: 'helper_spec.rb', helper: helper)
26
+ end
27
+
28
+ self
29
+ end
30
+
31
+ def save_categories
32
+ cd(:builder_data)
33
+ add('categories.json', content: JSON.pretty_generate(builder.categories.map(&:to_h)))
34
+ play_actions
35
+ end
36
+ end
@@ -11,7 +11,7 @@ def categories
11
11
  row :inflection , "Inflection handling routines, eg. pluralize, singular, ordinalize"
12
12
  row :string , "String handling helpers"
13
13
 
14
- row :a_array , "Array handling routines, eg. join, join_prefix, join_post"
14
+ row :array , "Array handling routines, eg. join, join_prefix, join_post"
15
15
  row :a_transform , "Tokenize and apply case and/or separator"
16
16
  row :a_comparison , "Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc."
17
17
  row :a_inflection , "Inflection handling routines, eg. pluralize, singular, ordinalize"
@@ -0,0 +1,30 @@
1
+ def cmdlets
2
+ commands.map do |command|
3
+ category = categories.find { |c| c.name == command.category }
4
+
5
+ log.error("Category '#{command.category}' not found") unless category
6
+
7
+ OpenStruct.new(
8
+ category: command.category,
9
+ name: command.name,
10
+ category_description: category.description,
11
+ command_description: command.description,
12
+ ruby: command.ruby,
13
+ usecases: use_cases
14
+ .select { |uc| uc.category == command.category && uc.command == command.name }
15
+ .map { |uc|
16
+ OpenStruct.new({
17
+ category: uc.category,
18
+ command: uc.command,
19
+ inputs: uc.inputs,
20
+ nice_inputs: nice_inputs(uc.inputs),
21
+ expected_output: uc.expected_output
22
+ })
23
+ }
24
+ )
25
+ end
26
+ end
27
+
28
+ def nice_inputs(values)
29
+ values.map { |value| value.is_a?(String) ? "'#{value}'" : value }.join(', ')
30
+ end
@@ -1,31 +1,226 @@
1
1
  def commands
2
- functions.map do |function|
3
- category = categories.find { |c| c.name == function.category }
2
+ return @commands unless @commands.nil?
3
+
4
+ result = KDoc.model :document do
5
+ table :rows do
6
+ fields :category, :name, :alias, :description, :ruby # , f(name: :params, default: [:value])
7
+
8
+ # context 'when array of string' do
9
+ # let(:value) { %w[the quick fox] }
10
+
11
+ # it { is_expected.to eq('the,quick,fox') }
12
+ # end
13
+
14
+ # context 'when array of numbers' do
15
+ # let(:value) { [1, 2, 3] }
16
+
17
+ # it { is_expected.to eq('1,2,3') }
18
+ # end
19
+
20
+ # context 'when array of symbol' do
21
+ # let(:value) { %i[the quick fox] }
22
+
23
+ # it { is_expected.to eq('the,quick,fox') }
24
+ # end
25
+
26
+ row :array , :join , [] , "join an array of values with separator as a string", <<-'RUBY'
27
+ return '' if value.nil? || !value.is_a?(Array)
28
+ values = value.reject(&:blank?)
29
+ return '' if value.length.zero?
30
+
31
+ separator = ','
32
+ values.join(separator)
33
+ RUBY
34
+
35
+ # row :array , :join_pre , [] , "join an array of values with separator as a string and using the separator at the beginning of string", <<-'RUBY'
36
+ # return '' if value.nil? || !value.is_a?(Array)
37
+ # values = value.reject(&:blank?)
38
+ # return '' if value.length.zero?
39
+
40
+ # separator = ','
41
+ # "#{separator}#{value.join(separator)}"
42
+ # RUBY
43
+
44
+ # row :array , :join_post , [] , "join an array of values with separator as a string and using the separator at the end of string", <<-'RUBY'
45
+ # return '' if value.nil? || !value.is_a?(Array)
46
+ # values = value.reject(&:blank?)
47
+ # return '' if value.length.zero?
48
+
49
+ # separator = ','
50
+ # "#{value.join(separator)}#{separator}"
51
+ # RUBY
52
+
53
+ # row :a_transform , :backslash , [:back_slash] , "convert to back slash notation", <<-'RUBY'
54
+ # tokenizer.parse(value, preserve_case: true, separator: '\\')
55
+ # RUBY
56
+
57
+ # row :a_transform , :camel , [:upper_camel, :pascal] , "convert to camel notation", <<-'RUBY'
58
+ # tokenizer.parse(value).underscore.camelize
59
+ # RUBY
60
+
61
+ # row :a_transform , :constant , [:constantize] , "", <<-'RUBY'
62
+ # tokenizer.parse(value, separator: '_').upcase
63
+ # RUBY
64
+
65
+ # row :a_transform , :dash , [:dasherize] , "convert to dash notation", <<-'RUBY'
66
+ # tokenizer.parse(value)
67
+ # RUBY
68
+
69
+ # row :a_transform , :dot , [:dotirize] , "", <<-'RUBY'
70
+ # tokenizer.parse(value, separator: '.')
71
+ # RUBY
72
+
73
+ # row :a_transform , :double_colon , [] , "", <<-'RUBY'
74
+ # tokenizer.parse(value, preserve_case: true, separator: '::')
75
+ # RUBY
76
+
77
+ # row :a_transform , :lower , [:lowercase, :downcase] , "", <<-'RUBY'
78
+ # return '' if value.nil?
79
+
80
+ # value.downcase
81
+ # RUBY
82
+
83
+ # # row :a_transform , :format_as , [] , "", <<-'RUBY'
84
+
85
+ # # RUBY
86
+
87
+ # row :a_transform , :proper , [] , "Proper case capitalizes the first letter of ALL words in a string", <<-'RUBY'
88
+ # tokenizer.parse(value,
89
+ # separator: ' ',
90
+ # preserve_case: true,
91
+ # compress_prefix_numerals: false,
92
+ # compress_suffix_numerals: false)
93
+ # .titleize
94
+ # RUBY
95
+
96
+ # row :a_transform , :sentence , [:human, :humanize] , "Upper case for first letter only. Numbers will maintain their spacing", <<-'RUBY'
97
+ # tokenizer.parse(value,
98
+ # separator: ' ',
99
+ # preserve_case: true,
100
+ # compress_prefix_numerals: false,
101
+ # compress_suffix_numerals: false)
102
+ # .humanize
103
+ # RUBY
104
+
105
+ # row :a_transform , :lamel , [:lower_camel] , "", <<-'RUBY'
106
+ # tokenizer.parse(value, separator: '_').camelize(:lower)
107
+ # RUBY
108
+
109
+ # row :a_transform , :slash , [:forwardslash, :forward_slash] , "", <<-'RUBY'
110
+ # tokenizer.parse(value, preserve_case: true, separator: '/')
111
+ # RUBY
112
+
113
+ # row :a_transform , :snake , [:snake] , "", <<-'RUBY'
114
+ # tokenizer.parse(value, separator: '_', forced_separator: true)
115
+ # RUBY
116
+
117
+ # row :a_transform , :title , [:titleize] , "", <<-'RUBY'
118
+ # tokenizer.parse(value,
119
+ # separator: ' ',
120
+ # preserve_case: true,
121
+ # compress_prefix_numerals: false,
122
+ # compress_suffix_numerals: false)
123
+ # .titleize
124
+ # RUBY
125
+
126
+ # row :a_transform , :upper , [:upper_case, :upcase] , "", <<-'RUBY'
127
+ # return '' if value.nil?
128
+
129
+ # value.upcase
130
+ # RUBY
4
131
 
5
-
6
- log.error("Category '#{function.category}' not found") unless category
7
132
 
8
- OpenStruct.new(
9
- category: function.category,
10
- name: function.name,
11
- category_description: category.description,
12
- function_description: function.description,
13
- ruby: function.ruby,
14
- usecases: use_cases
15
- .select { |uc| uc.category == function.category && uc.function == function.name }
16
- .map { |uc|
17
- OpenStruct.new({
18
- category: uc.category,
19
- function: uc.function,
20
- inputs: uc.inputs,
21
- nice_inputs: nice_inputs(uc.inputs),
22
- expected_output: uc.expected_output
23
- })
24
- }
25
- )
133
+ # row :a_comparison , :and , [:all] , "", <<-'RUBY'
134
+ # values.all? { |value| value }
135
+ # RUBY
136
+
137
+ # # DEFAULT does not make sense in comparison
138
+ # row :a_comparison , :default , [:fallback] , "", <<-'RUBY'
139
+ # default_value = values[-1]
140
+
141
+ # find_value = values[0..-2].find { |value| !value.nil? }
142
+
143
+ # find_value || default_value
144
+ # RUBY
145
+
146
+ # row :a_comparison , :eq , [:equal] , "", <<-'RUBY'
147
+ # lhs = lhs.to_s if lhs.is_a?(Symbol)
148
+ # rhs = rhs.to_s if rhs.is_a?(Symbol)
149
+
150
+ # lhs == rhs
151
+ # RUBY
152
+
153
+ # row :a_comparison , :gt , [] , "", <<-'RUBY'
154
+ # lhs > rhs
155
+ # RUBY
156
+
157
+ # row :a_comparison , :gte , [] , "", <<-'RUBY'
158
+ # lhs >= rhs
159
+ # RUBY
160
+
161
+ # row :a_comparison , :lt , [:less_than] , "# Lt: (less than) Block helper that renders a block if `a` is **less than** `b`. If an inverse block is specified it will be rendered when falsy.", <<-'RUBY'
162
+ # lhs < rhs
163
+ # RUBY
164
+
165
+ # row :a_comparison , :lte , [:less_than_or_equal_to] , "# Lte: (less than or equal to) Block helper that renders a block if `a` is **less than or equal to** `b`. If an inverse block is specified it will be rendered when falsy.", <<-'RUBY'
166
+ # lhs <= rhs
167
+ # RUBY
168
+
169
+ # row :a_comparison , :ne , [:not_equal] , "# Ne: (not equal) Block helper that renders a block if `a` is **not equal to** `b`. If an inverse block is specified it will be rendered when falsy.", <<-'RUBY'
170
+ # lhs = lhs.to_s if lhs.is_a?(Symbol)
171
+ # rhs = rhs.to_s if rhs.is_a?(Symbol)
172
+
173
+ # lhs != rhs
174
+ # RUBY
175
+
176
+ # row :a_comparison , :or , [:any] , "", <<-'RUBY'
177
+ # values.any? { |value| value }
178
+ # RUBY
179
+
180
+
181
+
182
+ # row :a_inflection , :ordinal , [] , "The suffix that should be added to a number to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th", <<-RUBY
183
+ # return '' if value.nil?
184
+
185
+ # value = value.to_i if value.is_a? String
186
+
187
+ # value.ordinal
188
+ # RUBY
189
+
190
+ # row :a_inflection , :ordinalize , [] , "Turns a number into an ordinal string used to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th.", <<-RUBY
191
+ # return '' if value.nil?
192
+
193
+ # value = value.to_i if value.is_a? String
194
+
195
+ # value.ordinalize
196
+ # RUBY
197
+
198
+ # row :a_inflection , :pluralize , [] , "Returns the plural form of the word in the string", <<-RUBY
199
+ # return '' if value.nil?
200
+
201
+ # value = value.to_s if value.is_a?(Symbol)
202
+
203
+ # value.pluralize
204
+ # RUBY
205
+
206
+ # row :a_inflection , :pluralize_by_number , [] , "Uses both a word and number to decide if the plural or singular form should be used.", <<-'RUBY'
207
+ # return '' if value.nil?
208
+
209
+ # count = count.to_i if count.is_a? String
210
+ # format = :word if format.nil?
211
+
212
+ # case format.to_sym
213
+ # when :number_word, :number_and_word
214
+ # "#{count} #{value.pluralize(count)}"
215
+ # else # aka :word
216
+ # value.pluralize(count)
217
+ # end
218
+ # RUBY
219
+
220
+ # row :a_inflection , :singularize , [] , ""
221
+ end
26
222
  end
223
+
224
+ @commands = result.raw_data_struct.rows
27
225
  end
28
-
29
- def nice_inputs(values)
30
- values.map { |value| value.is_a?(String) ? "'#{value}'" : value }.join(', ')
31
- end
226
+ @commands = nil
@@ -0,0 +1,54 @@
1
+ KManager.action :commands do
2
+ action do
3
+
4
+ puts commands.first.function_description
5
+ # Ruby Gem Bootstrap
6
+ director = KDirector::Dsls::BasicDsl
7
+ .init(k_builder,
8
+ template_base_folder: '',
9
+ on_exist: :skip, # %i[skip write compare]
10
+ on_action: :queue # %i[queue execute]
11
+ )
12
+ .blueprint(
13
+ active: true,
14
+ name: :build_commands,
15
+ description: 'Build Commandlets',
16
+ on_exist: :write) do
17
+
18
+ cd(:lib)
19
+
20
+ # builder
21
+ # .add_file('FUNCTIONS.md',
22
+ # template_file: 'FUNCTIONS.md',
23
+ # categories: categories.sort_by { |r| r.name },
24
+ # functions: functions.sort_by { |r| [r.category, r.name] },
25
+ # on_exist: :write)
26
+
27
+ add('all_commands.rb',
28
+ template_file: 'all_commands.rb',
29
+ commands: commands.sort_by { |r| [r.category, r.name] },
30
+ on_exist: :write)
31
+
32
+ cmdlets.each do |cmdlet|
33
+
34
+ add("#{cmdlet.category}/#{cmdlet.name}.rb",
35
+ cmdlet: cmdlet,
36
+ template_file: 'command.rb',
37
+ on_exist: :write)
38
+ end
39
+
40
+ end
41
+
42
+ director.play_actions
43
+ # director.builder.logit
44
+ end
45
+ end
46
+
47
+ KManager.opts.app_name = 'commands'
48
+ KManager.opts.sleep = 2
49
+ KManager.opts.reboot_on_kill = 0
50
+ KManager.opts.reboot_sleep = 4
51
+ KManager.opts.exception_style = :short
52
+ KManager.opts.show.time_taken = true
53
+ KManager.opts.show.finished = true
54
+ KManager.opts.show.finished_message = 'FINISHED :)'
@@ -0,0 +1,20 @@
1
+ KManager.action :categories do
2
+ action do
3
+
4
+ CategoryDirector
5
+ .init(k_builder,
6
+ on_exist: :write, # %i[skip write compare]
7
+ on_action: :execute # %i[queue execute]
8
+ )
9
+ .category(:case , "Tokenize and apply case and/or separator")
10
+ .category(:comparison , "Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc.")
11
+ .category(:inflection , "Inflection handling routines, eg. pluralize, singular, ordinalize")
12
+ .category(:string , "String handling helpers")
13
+ .category(:a_array , "Array handling routines, eg. join, join_prefix, join_post")
14
+ .category(:a_transform , "Tokenize and apply case and/or separator")
15
+ .category(:a_comparison , "Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc.")
16
+ .category(:a_inflection , "Inflection handling routines, eg. pluralize, singular, ordinalize")
17
+ .save_categories
18
+ .category_file
19
+ end
20
+ end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [0.0.6](https://github.com/klueless-io/cmdlet/compare/v0.0.5...v0.0.6) (2022-07-08)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add tests for configuration ([59a764f](https://github.com/klueless-io/cmdlet/commit/59a764f99f84dbe1c5b1022e8fdc2386fcced92a))
7
+
1
8
  ## [0.0.5](https://github.com/klueless-io/cmdlet/compare/v0.0.4...v0.0.5) (2022-07-08)
2
9
 
3
10
 
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cmdlet/array/join'
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ # reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
4
+
5
+ module Cmdlet
6
+ # Array handling routines, eg. join, join_prefix, join_post
7
+ module Array
8
+ # Join: join an array of values with separator as a string
9
+ class Join < Funcky::BaseFunction
10
+ #
11
+ # @param [String|Int] value - numeric value
12
+ # @return [String] ordinal suffix that would be required for a number
13
+ def parse(value)
14
+ return '' if value.nil? || !value.is_a?(Array)
15
+
16
+ values = value.reject(&:blank?)
17
+ return '' if value.length.zero?
18
+
19
+ separator = ','
20
+ values.join(separator)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cmdlet
4
- VERSION = '0.0.6'
4
+ VERSION = '0.0.7'
5
5
  end
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "cmdlet",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "cmdlet",
9
- "version": "0.0.6",
9
+ "version": "0.0.7",
10
10
  "devDependencies": {
11
11
  "@klueless-js/semantic-release-rubygem": "github:klueless-js/semantic-release-rubygem",
12
12
  "@semantic-release/changelog": "^6.0.1",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cmdlet",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "Cmdlet provides a set of functions (wrapped in the command pattern) that perform simple actions",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cmdlet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-08 00:00:00.000000000 Z
11
+ date: 2022-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -46,15 +46,25 @@ executables: []
46
46
  extensions: []
47
47
  extra_rdoc_files: []
48
48
  files:
49
+ - ".builders/.templates/FUNCTIONS.MD"
50
+ - ".builders/.templates/all_commands.rb"
51
+ - ".builders/.templates/command.rb"
52
+ - ".builders/.templates/command_spec.rb"
49
53
  - ".builders/_.rb"
50
54
  - ".builders/boot.rb"
51
- - ".builders/documents/_.rb"
55
+ - ".builders/data/categories.json"
56
+ - ".builders/director/category_director.rb"
57
+ - ".builders/director/cmdlet_builder.rb"
58
+ - ".builders/director/cmdlet_child.rb"
59
+ - ".builders/director/cmdlet_director.rb"
52
60
  - ".builders/documents/categories.rb"
61
+ - ".builders/documents/cmdlets.rb"
53
62
  - ".builders/documents/commands.rb"
54
- - ".builders/documents/functions.rb"
55
63
  - ".builders/documents/use_cases.rb"
56
64
  - ".builders/documents/x_functions.rb"
57
65
  - ".builders/generators/01-bootstrap.rb"
66
+ - ".builders/generators/20-commands.rb"
67
+ - ".builders/generators/25-categories.rb"
58
68
  - ".releaserc.json"
59
69
  - ".rspec"
60
70
  - ".rubocop.yml"
@@ -68,6 +78,8 @@ files:
68
78
  - bin/console
69
79
  - bin/setup
70
80
  - lib/cmdlet.rb
81
+ - lib/cmdlet/all_commands.rb
82
+ - lib/cmdlet/array/join.rb
71
83
  - lib/cmdlet/configuration.rb
72
84
  - lib/cmdlet/string_tokenizer.rb
73
85
  - lib/cmdlet/version.rb
@@ -78,6 +90,9 @@ homepage: http://appydave.com/gems/cmdlet
78
90
  licenses:
79
91
  - MIT
80
92
  metadata:
93
+ homepage_uri: http://appydave.com/gems/cmdlet
94
+ source_code_uri: https://github.com/klueless-io/cmdlet
95
+ changelog_uri: https://github.com/klueless-io/cmdlet/blob/main/CHANGELOG.md
81
96
  rubygems_mfa_required: 'true'
82
97
  post_install_message:
83
98
  rdoc_options: []
@@ -1,4 +0,0 @@
1
- require_relative './categories'
2
- require_relative './functions'
3
- require_relative './use_cases'
4
- require_relative './commands'
@@ -1,226 +0,0 @@
1
- def functions
2
- return @functions unless @functions.nil?
3
-
4
- result = KDoc.model :document do
5
- table :rows do
6
- fields :category, :name, :alias, :description, :ruby # , f(name: :params, default: [:value])
7
-
8
- # context 'when array of string' do
9
- # let(:value) { %w[the quick fox] }
10
-
11
- # it { is_expected.to eq('the,quick,fox') }
12
- # end
13
-
14
- # context 'when array of numbers' do
15
- # let(:value) { [1, 2, 3] }
16
-
17
- # it { is_expected.to eq('1,2,3') }
18
- # end
19
-
20
- # context 'when array of symbol' do
21
- # let(:value) { %i[the quick fox] }
22
-
23
- # it { is_expected.to eq('the,quick,fox') }
24
- # end
25
-
26
- row :a_array , :join , [] , "join an array of values with separator as a string", <<-'RUBY'
27
- return '' if value.nil? || !value.is_a?(Array)
28
- values = value.reject(&:blank?)
29
- return '' if value.length.zero?
30
-
31
- separator = ','
32
- value.join(separator)
33
- RUBY
34
-
35
- row :a_array , :join_pre , [] , "join an array of values with separator as a string and using the separator at the beginning of string", <<-'RUBY'
36
- return '' if value.nil? || !value.is_a?(Array)
37
- values = value.reject(&:blank?)
38
- return '' if value.length.zero?
39
-
40
- separator = ','
41
- "#{separator}#{value.join(separator)}"
42
- RUBY
43
-
44
- row :a_array , :join_post , [] , "join an array of values with separator as a string and using the separator at the end of string", <<-'RUBY'
45
- return '' if value.nil? || !value.is_a?(Array)
46
- values = value.reject(&:blank?)
47
- return '' if value.length.zero?
48
-
49
- separator = ','
50
- "#{value.join(separator)}#{separator}"
51
- RUBY
52
-
53
- row :a_transform , :backslash , [:back_slash] , "convert to back slash notation", <<-'RUBY'
54
- tokenizer.parse(value, preserve_case: true, separator: '\\')
55
- RUBY
56
-
57
- row :a_transform , :camel , [:upper_camel, :pascal] , "convert to camel notation", <<-'RUBY'
58
- tokenizer.parse(value).underscore.camelize
59
- RUBY
60
-
61
- row :a_transform , :constant , [:constantize] , "", <<-'RUBY'
62
- tokenizer.parse(value, separator: '_').upcase
63
- RUBY
64
-
65
- row :a_transform , :dash , [:dasherize] , "convert to dash notation", <<-'RUBY'
66
- tokenizer.parse(value)
67
- RUBY
68
-
69
- row :a_transform , :dot , [:dotirize] , "", <<-'RUBY'
70
- tokenizer.parse(value, separator: '.')
71
- RUBY
72
-
73
- row :a_transform , :double_colon , [] , "", <<-'RUBY'
74
- tokenizer.parse(value, preserve_case: true, separator: '::')
75
- RUBY
76
-
77
- row :a_transform , :lower , [:lowercase, :downcase] , "", <<-'RUBY'
78
- return '' if value.nil?
79
-
80
- value.downcase
81
- RUBY
82
-
83
- # row :a_transform , :format_as , [] , "", <<-'RUBY'
84
-
85
- # RUBY
86
-
87
- row :a_transform , :proper , [] , "Proper case capitalizes the first letter of ALL words in a string", <<-'RUBY'
88
- tokenizer.parse(value,
89
- separator: ' ',
90
- preserve_case: true,
91
- compress_prefix_numerals: false,
92
- compress_suffix_numerals: false)
93
- .titleize
94
- RUBY
95
-
96
- row :a_transform , :sentence , [:human, :humanize] , "Upper case for first letter only. Numbers will maintain their spacing", <<-'RUBY'
97
- tokenizer.parse(value,
98
- separator: ' ',
99
- preserve_case: true,
100
- compress_prefix_numerals: false,
101
- compress_suffix_numerals: false)
102
- .humanize
103
- RUBY
104
-
105
- row :a_transform , :lamel , [:lower_camel] , "", <<-'RUBY'
106
- tokenizer.parse(value, separator: '_').camelize(:lower)
107
- RUBY
108
-
109
- row :a_transform , :slash , [:forwardslash, :forward_slash] , "", <<-'RUBY'
110
- tokenizer.parse(value, preserve_case: true, separator: '/')
111
- RUBY
112
-
113
- row :a_transform , :snake , [:snake] , "", <<-'RUBY'
114
- tokenizer.parse(value, separator: '_', forced_separator: true)
115
- RUBY
116
-
117
- row :a_transform , :title , [:titleize] , "", <<-'RUBY'
118
- tokenizer.parse(value,
119
- separator: ' ',
120
- preserve_case: true,
121
- compress_prefix_numerals: false,
122
- compress_suffix_numerals: false)
123
- .titleize
124
- RUBY
125
-
126
- row :a_transform , :upper , [:upper_case, :upcase] , "", <<-'RUBY'
127
- return '' if value.nil?
128
-
129
- value.upcase
130
- RUBY
131
-
132
-
133
- row :a_comparison , :and , [:all] , "", <<-'RUBY'
134
- values.all? { |value| value }
135
- RUBY
136
-
137
- # DEFAULT does not make sense in comparison
138
- row :a_comparison , :default , [:fallback] , "", <<-'RUBY'
139
- default_value = values[-1]
140
-
141
- find_value = values[0..-2].find { |value| !value.nil? }
142
-
143
- find_value || default_value
144
- RUBY
145
-
146
- row :a_comparison , :eq , [:equal] , "", <<-'RUBY'
147
- lhs = lhs.to_s if lhs.is_a?(Symbol)
148
- rhs = rhs.to_s if rhs.is_a?(Symbol)
149
-
150
- lhs == rhs
151
- RUBY
152
-
153
- row :a_comparison , :gt , [] , "", <<-'RUBY'
154
- lhs > rhs
155
- RUBY
156
-
157
- row :a_comparison , :gte , [] , "", <<-'RUBY'
158
- lhs >= rhs
159
- RUBY
160
-
161
- row :a_comparison , :lt , [:less_than] , "# Lt: (less than) Block helper that renders a block if `a` is **less than** `b`. If an inverse block is specified it will be rendered when falsy.", <<-'RUBY'
162
- lhs < rhs
163
- RUBY
164
-
165
- row :a_comparison , :lte , [:less_than_or_equal_to] , "# Lte: (less than or equal to) Block helper that renders a block if `a` is **less than or equal to** `b`. If an inverse block is specified it will be rendered when falsy.", <<-'RUBY'
166
- lhs <= rhs
167
- RUBY
168
-
169
- row :a_comparison , :ne , [:not_equal] , "# Ne: (not equal) Block helper that renders a block if `a` is **not equal to** `b`. If an inverse block is specified it will be rendered when falsy.", <<-'RUBY'
170
- lhs = lhs.to_s if lhs.is_a?(Symbol)
171
- rhs = rhs.to_s if rhs.is_a?(Symbol)
172
-
173
- lhs != rhs
174
- RUBY
175
-
176
- row :a_comparison , :or , [:any] , "", <<-'RUBY'
177
- values.any? { |value| value }
178
- RUBY
179
-
180
-
181
-
182
- row :a_inflection , :ordinal , [] , "The suffix that should be added to a number to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th", <<-RUBY
183
- return '' if value.nil?
184
-
185
- value = value.to_i if value.is_a? String
186
-
187
- value.ordinal
188
- RUBY
189
-
190
- row :a_inflection , :ordinalize , [] , "Turns a number into an ordinal string used to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th.", <<-RUBY
191
- return '' if value.nil?
192
-
193
- value = value.to_i if value.is_a? String
194
-
195
- value.ordinalize
196
- RUBY
197
-
198
- row :a_inflection , :pluralize , [] , "Returns the plural form of the word in the string", <<-RUBY
199
- return '' if value.nil?
200
-
201
- value = value.to_s if value.is_a?(Symbol)
202
-
203
- value.pluralize
204
- RUBY
205
-
206
- row :a_inflection , :pluralize_by_number , [] , "Uses both a word and number to decide if the plural or singular form should be used.", <<-'RUBY'
207
- return '' if value.nil?
208
-
209
- count = count.to_i if count.is_a? String
210
- format = :word if format.nil?
211
-
212
- case format.to_sym
213
- when :number_word, :number_and_word
214
- "#{count} #{value.pluralize(count)}"
215
- else # aka :word
216
- value.pluralize(count)
217
- end
218
- RUBY
219
-
220
- # row :a_inflection , :singularize , [] , ""
221
- end
222
- end
223
-
224
- @functions = result.raw_data_struct.rows
225
- end
226
- @functions = nil