k_director 0.8.0 → 0.10.1

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
2
  SHA256:
3
- metadata.gz: a815561b5b1396f42cb9a229c9f596505dfc9aa7e4806e52c5e9561fe3b4ee8b
4
- data.tar.gz: 55e7a341a190c4e022d8041b520d79f7d30007a644a277b5a0b761a3054f9843
3
+ metadata.gz: 431e5c6f071221fcdea319010b83bb17bba62187f835ae595a5453eaffd30956
4
+ data.tar.gz: ebcfe2cda7f2538f0511cd5e6df7bbf9d53bb29834b43286f34054d51521eecd
5
5
  SHA512:
6
- metadata.gz: 51b5a5b3c460a6b2f5059f3e99348697184d10710ff128797db01a0684d06667432802fc986e363cdea19610c6e5b23ed71679bcac530b14b8baa347b83d4c1b
7
- data.tar.gz: 179bc109bb350c5be224c52b0c3b5f9115dc719a92a2f071a1df27307fa94a0c5e494b4c7388d658183de7ab5536af122a638e1fdae98591495b414f5ed0c15c
6
+ metadata.gz: 725a68f629da441807038726a8899bf19004c0dec43b7e41ac11fccb9124bd2bbcb3dd6babd10938287c9b00394aba3e7588af91cbf5be99f5d8523c29459381
7
+ data.tar.gz: aeca07e40f162c470767a7590865cf7cb41f48c5ffa605dc37cb1f71b538acff734963321b0bd9a7e05d03d716a476cd485baaff595070f5f72b718963384621
data/.builders/boot.rb CHANGED
@@ -40,10 +40,10 @@ def dasherize
40
40
  end
41
41
 
42
42
  def k_builder
43
- @k_builder ||= KBuilder::BaseBuilder.init(KBuilder.configuration(CONFIG_KEY))
43
+ @k_builder ||= KBuilder::BaseBuilder.init(KConfig.configuration(CONFIG_KEY))
44
44
  end
45
45
 
46
- KBuilder.configure(CONFIG_KEY) do |config|
46
+ KConfig.configure(CONFIG_KEY) do |config|
47
47
  builder_folder = Dir.pwd
48
48
  base_folder = File.expand_path('../', builder_folder)
49
49
  global_template = File.expand_path('~/dev/kgems/k_templates/templates')
@@ -58,7 +58,7 @@ KBuilder.configure(CONFIG_KEY) do |config|
58
58
  # config.target_folders.add(:database , :data, 'database')
59
59
  end
60
60
 
61
- KBuilder.configuration(CONFIG_KEY).debug
61
+ KConfig.configuration(CONFIG_KEY).debug
62
62
 
63
63
  area = KManager.add_area(CONFIG_KEY)
64
64
  resource_manager = area.resource_manager
@@ -0,0 +1,5 @@
1
+ {
2
+ "cSpell.words": [
3
+ "postcss"
4
+ ]
5
+ }
data/docs/CHANGELOG.md CHANGED
@@ -1,3 +1,37 @@
1
+ # [0.10.0](https://github.com/klueless-io/k_director/compare/v0.9.0...v0.10.0) (2022-02-06)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * package_json set key converted to string and stripped ([784b33d](https://github.com/klueless-io/k_director/commit/784b33db2a045e8273e4e5a30747f0b05cc50cfd))
7
+
8
+
9
+ ### Features
10
+
11
+ * add package_json dsl support to nuxt3 and rubygem ([9b4650d](https://github.com/klueless-io/k_director/commit/9b4650d48deaeb158ef25300b12f9de5725bf2c0))
12
+ * add sort package json keys to package_json dsl ([90e2041](https://github.com/klueless-io/k_director/commit/90e2041759714faa1333c51226102e7ab8041a0a))
13
+
14
+ # [0.9.0](https://github.com/klueless-io/k_director/compare/v0.8.1...v0.9.0) (2022-02-05)
15
+
16
+
17
+ ### Features
18
+
19
+ * add package_json dsl support ([15b3ad7](https://github.com/klueless-io/k_director/commit/15b3ad7472a3374e646c391a7271fb7782636afe))
20
+
21
+ ## [0.8.1](https://github.com/klueless-io/k_director/compare/v0.8.0...v0.8.1) (2022-02-05)
22
+
23
+
24
+ ### Bug Fixes
25
+
26
+ * add tests for package_json configuration ([d900065](https://github.com/klueless-io/k_director/commit/d900065bf810771841b97de03dfa9011c48c8e43))
27
+
28
+ # [0.8.0](https://github.com/klueless-io/k_director/compare/v0.7.3...v0.8.0) (2022-02-04)
29
+
30
+
31
+ ### Features
32
+
33
+ * add rubygem DSL support ([f93a863](https://github.com/klueless-io/k_director/commit/f93a86338d703771ba43a8e9ed5e7c8e9d1a7778))
34
+
1
35
  ## [0.7.3](https://github.com/klueless-io/k_director/compare/v0.7.2...v0.7.3) (2022-02-03)
2
36
 
3
37
 
data/k_director.gemspec CHANGED
@@ -41,6 +41,7 @@ Gem::Specification.new do |spec|
41
41
  'rubygems_mfa_required' => 'true'
42
42
  }
43
43
 
44
+ spec.add_dependency 'k_config', '~> 0.0.0'
44
45
  spec.add_dependency 'k_log', '~> 0.0.0'
45
46
  # spec.add_dependency 'k_type', '~> 0.0.0'
46
47
  spec.add_dependency 'k_builder', '~> 0.0.0'
@@ -59,6 +59,10 @@ module KDirector
59
59
  }.merge(opts)
60
60
  end
61
61
 
62
+ def configuration
63
+ k_builder.configuration
64
+ end
65
+
62
66
  def director_name
63
67
  @options.director_name
64
68
  end
@@ -17,14 +17,6 @@ module KDirector
17
17
 
18
18
  set_package_file('package.json')
19
19
  set_dependency_type(:development)
20
-
21
- # defaults = {
22
- # repo_name: opts[:repo_name], # || parent.builder.dom&[:PackageJson]&[:repo_name]
23
- # username: opts[:username] || default_PackageJson_username, # || parent.builder.dom&[:PackageJson]&[:username]
24
- # organization: opts[:organization] # || parent.builder.dom&[:PackageJson]&[:organization]
25
- # }
26
-
27
- # parent.builder.group_set(:PackageJson, **repo_info_hash(**defaults))
28
20
  end
29
21
 
30
22
  # ----------------------------------------------------------------------
@@ -44,6 +36,278 @@ module KDirector
44
36
 
45
37
  self
46
38
  end
39
+
40
+ # Init an NPN package
41
+ #
42
+ # run npm init -y
43
+ #
44
+ # Note: npm init does not support --silent operation
45
+ def npm_init
46
+ run_command 'npm init -y'
47
+
48
+ load
49
+
50
+ self
51
+ end
52
+
53
+ # Space separated list of packages
54
+ def npm_install(packages, options: nil)
55
+ npm_add_or_install(packages, parse_options(options))
56
+
57
+ self
58
+ end
59
+ alias npm_i npm_install
60
+
61
+ def npm_add(packages, options: nil)
62
+ npm_add_or_install(packages, parse_options(options, '--package-lock-only --no-package-lock'))
63
+
64
+ self
65
+ end
66
+ alias npm_a npm_add
67
+
68
+ def npm_add_group(key, options: nil)
69
+ group = get_group(key)
70
+
71
+ puts "Adding #{group.description}"
72
+
73
+ npm_add(group.package_names, options: options)
74
+
75
+ self
76
+ end
77
+ alias npm_ag npm_add_group
78
+
79
+ # Add a group of NPN packages which get defined in configuration
80
+ def npm_install_group(key, options: nil)
81
+ group = get_group(key)
82
+
83
+ puts "Installing #{group.description}"
84
+
85
+ npm_install(group.package_names, options: options)
86
+
87
+ self
88
+ end
89
+
90
+ # Load the existing package.json into memory
91
+ #
92
+ # ToDo: Would be useful to record the update timestamp on the package
93
+ # so that we only load if the in memory package is not the latest.
94
+ #
95
+ # The reason this can happen, is because external tools such are
96
+ # npm install are updating the package.json and after this happens
97
+ # we need to call load, but if there is any bug in the code we may
98
+ # for get to load, or we may load multiple times.
99
+ def load
100
+ raise KDirector::Error, 'package.json does not exist' unless File.exist?(package_file)
101
+
102
+ # puts 'loading...'
103
+
104
+ content = File.read(package_file)
105
+ @package = JSON.parse(content)
106
+
107
+ self
108
+ end
109
+
110
+ # Write the package.json file
111
+ def write
112
+ # puts 'writing...'
113
+
114
+ content = JSON.pretty_generate(@package)
115
+
116
+ File.write(package_file, content)
117
+
118
+ self
119
+ end
120
+
121
+ # Remove a script reference by key
122
+ def remove_script(key)
123
+ remove(key, group: 'scripts')
124
+ # load
125
+
126
+ # @package['scripts']&.delete(key)
127
+
128
+ # write
129
+
130
+ self
131
+ end
132
+
133
+ # Add a script with key and value (command line to run)
134
+ def add_script(key, value)
135
+ set(key, value, group: 'scripts')
136
+
137
+ self
138
+ end
139
+
140
+ # ----------------------------------------------------------------------
141
+ # Attributes: Think getter/setter
142
+ #
143
+ # The following getter/setters can be referenced both inside and outside
144
+ # of the fluent builder fluent API. They do not implement the fluent
145
+ # interface unless prefixed by set_.
146
+ #
147
+ # set_: Only setters with the prefix _set are considered fluent.
148
+ # ----------------------------------------------------------------------
149
+
150
+ # Package
151
+ # ----------------------------------------------------------------------
152
+
153
+ # Load the package.json into a memory as object
154
+ def package
155
+ return @package if defined? @package
156
+
157
+ load
158
+
159
+ @package
160
+ end
161
+
162
+ # Package.set
163
+ # ----------------------------------------------------------------------
164
+
165
+ # Set a property value in the package
166
+ def set(key, value, group: nil)
167
+ load
168
+
169
+ key = key.to_s.strip
170
+
171
+ if group.nil?
172
+ @package[key] = value
173
+ else
174
+ group = group.to_s.strip
175
+ @package[group] = {} unless @package[group]
176
+ @package[group][key] = value
177
+ end
178
+
179
+ write
180
+
181
+ self
182
+ end
183
+
184
+ def remove(key, group: nil)
185
+ load
186
+
187
+ key = key.to_s.strip
188
+
189
+ if group.nil?
190
+ @package.delete(key)
191
+ else
192
+ group = group.to_s.strip
193
+ @package[group]&.delete(key)
194
+ end
195
+
196
+ @package['scripts']&.delete(key)
197
+
198
+ write
199
+
200
+ self
201
+ end
202
+
203
+ # Package.sort using `npx sort-package-json`
204
+ # ----------------------------------------------------------------------
205
+
206
+ # Sort the package.json keys using `npx sort-package-json`
207
+ def sort
208
+ run_command 'npx sort-package-json'
209
+
210
+ load
211
+
212
+ self
213
+ end
214
+
215
+ # Dependency option
216
+ # ----------------------------------------------------------------------
217
+
218
+ # Getter for dependency option
219
+ def dependency_option
220
+ dependency_type == :development ? '-D' : '-P'
221
+ end
222
+
223
+ # Dependency type
224
+ # ----------------------------------------------------------------------
225
+
226
+ # Fluent setter for target folder
227
+ # rubocop:disable Naming/AccessorMethodName
228
+ def set_dependency_type(value)
229
+ self.dependency_type = value
230
+
231
+ self
232
+ end
233
+ # rubocop:enable Naming/AccessorMethodName
234
+
235
+ # Package file
236
+ # ----------------------------------------------------------------------
237
+
238
+ # Fluent setter for package file
239
+ # rubocop:disable Naming/AccessorMethodName
240
+ def set_package_file(value)
241
+ self.package_file = value
242
+
243
+ self
244
+ end
245
+ # rubocop:enable Naming/AccessorMethodName
246
+
247
+ # Setter for package file
248
+ def package_file=(_value)
249
+ @package_file = File.join(k_builder.target_folder, 'package.json')
250
+ end
251
+
252
+ # # Getter for target folder
253
+ # def package_file
254
+ # hash['package_file']
255
+ # end
256
+
257
+ # -----------------------------------
258
+ # Helpers
259
+ # -----------------------------------
260
+
261
+ def parse_options(options = nil, required_options = nil)
262
+ options = [] if options.nil?
263
+ options = options.split if options.is_a?(String)
264
+ options.reject(&:empty?)
265
+
266
+ required_options = [] if required_options.nil?
267
+ required_options = required_options.split if required_options.is_a?(String)
268
+
269
+ options | required_options
270
+ end
271
+
272
+ def options_any?(options, *any_options)
273
+ (options & any_options).any?
274
+ end
275
+
276
+ def execute(command)
277
+ puts "RUN: #{command}"
278
+ run_command command
279
+ load
280
+ end
281
+
282
+ def npm_add_or_install(packages, options)
283
+ # if -P or -D is not in the options then use the current builder dependency option
284
+ options.push dependency_option unless options_any?(options, '-P', '-D')
285
+ packages = packages.join(' ') if packages.is_a?(Array)
286
+ command = "npm install #{options.join(' ')} #{packages}"
287
+ execute command
288
+ end
289
+
290
+ # # Debug method to open the package file in vscode
291
+ # # ToDo: Maybe remove
292
+ # def vscode
293
+ # puts "cd #{output_path}"
294
+ # puts package_file
295
+ # run_command "code #{package_file}"
296
+ # end
297
+
298
+ private
299
+
300
+ def get_group(key)
301
+ group = configuration.package_json.package_groups[key]
302
+
303
+ raise KConfig::PackageJson::Error, "unknown package group: #{key}" if group.nil?
304
+
305
+ group
306
+ end
307
+
308
+ def run_command(command)
309
+ parent.k_builder.run_command(command)
310
+ end
47
311
  end
48
312
  end
49
313
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Attach configuration to the KBuilder module
4
+ module KDirector
5
+ module Dsls
6
+ module Children
7
+ # PackageJson configuration extension for attachment to KConfig::Configuration
8
+ module PackageJsonConfigurationExtension
9
+ def package_json
10
+ return @package_json if defined? @package_json
11
+
12
+ @package_json = PackageJsonConfiguration.new
13
+ @package_json.set_default_package_groups
14
+ @package_json
15
+ end
16
+
17
+ def package_json_debug
18
+ package_json.debug
19
+ end
20
+ end
21
+
22
+ # PackageJson Configuration
23
+ class PackageJsonConfiguration
24
+ include KLog::Logging
25
+
26
+ PackageGroup = Struct.new(:key, :description, :package_names)
27
+
28
+ attr_accessor :package_groups
29
+
30
+ def initialize
31
+ @package_groups = {}
32
+ end
33
+
34
+ def set_package_group(key, description, package_names)
35
+ package_groups[key] = PackageGroup.new(key, description, package_names)
36
+ end
37
+
38
+ # Setup the default package groups
39
+ def set_default_package_groups
40
+ set_package_group('webpack' , 'Webpack V5' , %w[webpack webpack-cli webpack-dev-server])
41
+ set_package_group('swc' , 'SWC Transpiler' , %w[@swc/cli @swc/core swc-loader])
42
+ set_package_group('babel' , 'Babel Transpiler' , %w[@babel/core @babel/cli @babel/preset-env babel-loader])
43
+ set_package_group('typescript' , 'Typescript' , %w[typescript ts-loader])
44
+ set_package_group('semver-ruby' , 'Semantic Release for Ruby' , %w[semantic-release github:klueless-js/semantic-release-rubygem @semantic-release/changelog @semantic-release/git])
45
+
46
+ set_package_group('semver-nuxt' , 'Semantic Release for Nuxt' , %w[
47
+ semantic-release
48
+ @semantic-release/changelog
49
+ @semantic-release/git
50
+ ])
51
+
52
+ set_package_group('tailwind-nuxt' , 'TailwindCSS for Nuxt' , %w[
53
+ tailwindcss@latest
54
+ postcss@latest
55
+ autoprefixer@latest
56
+ ])
57
+
58
+ # this does not work yet
59
+ set_package_group('storybook-nuxt' , 'Storybook for (Vite/Nuxt)' , %w[
60
+ @storybook/vue3@6.4.18
61
+ @storybook/addon-docs@6.4.18
62
+ @storybook/addon-essentials@6.4.18
63
+ @storybook/addon-postcss@2.0.0
64
+ @storybook/addon-storysource@6.4.18
65
+ storybook-builder-vite
66
+ ])
67
+ # @storybook/addon-docs
68
+ end
69
+
70
+ def debug
71
+ log.structure(package_groups, convert_data_to: :open_struct)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ KConfig::Configuration.register(:package_json, KDirector::Dsls::Children::PackageJsonConfigurationExtension)
@@ -10,14 +10,21 @@ module KDirector
10
10
 
11
11
  def github(**opts, &block)
12
12
  github = KDirector::Dsls::Children::Github.new(self, **opts)
13
- github.instance_eval(&block)
13
+ github.instance_eval(&block) if block_given?
14
+
15
+ self
16
+ end
17
+
18
+ def package_json(**opts, &block)
19
+ package_json = KDirector::Dsls::Children::PackageJson.new(self, **opts)
20
+ package_json.instance_eval(&block) if block_given?
14
21
 
15
22
  self
16
23
  end
17
24
 
18
25
  def blueprint(**opts, &block)
19
26
  blueprint = KDirector::Dsls::Children::Blueprint.new(self, **opts)
20
- blueprint.instance_eval(&block)
27
+ blueprint.instance_eval(&block) if block_given?
21
28
 
22
29
  self
23
30
  end
@@ -15,6 +15,13 @@ module KDirector
15
15
  self
16
16
  end
17
17
 
18
+ def package_json(**opts, &block)
19
+ package_json = KDirector::Dsls::Children::PackageJson.new(self, **opts)
20
+ package_json.instance_eval(&block) if block_given?
21
+
22
+ self
23
+ end
24
+
18
25
  def blueprint(**opts, &block)
19
26
  blueprint = KDirector::Dsls::Children::Blueprint.new(self, **opts)
20
27
  blueprint.instance_eval(&block) if block_given?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KDirector
4
- VERSION = '0.8.0'
4
+ VERSION = '0.10.1'
5
5
  end
data/lib/k_director.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'k_config'
3
4
  require 'k_log'
4
5
  require 'k_util'
5
6
  require 'k_builder'
@@ -12,6 +13,7 @@ require_relative 'k_director/directors/child_director'
12
13
  require_relative 'k_director/directors/data'
13
14
  require_relative 'k_director/dsls/children/blueprint'
14
15
  require_relative 'k_director/dsls/children/github'
16
+ require_relative 'k_director/dsls/children/package_json_configuration'
15
17
  require_relative 'k_director/dsls/children/package_json'
16
18
  require_relative 'k_director/dsls/nuxt3_dsl'
17
19
  require_relative 'k_director/dsls/ruby_gem_dsl'
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "k_director",
3
- "version": "0.8.0",
3
+ "version": "0.10.1",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "k_director",
9
- "version": "0.8.0",
9
+ "version": "0.10.1",
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": "k_director",
3
- "version": "0.8.0",
3
+ "version": "0.10.1",
4
4
  "description": "Command line and CI/CD tools for k_director",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: k_director
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.10.1
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-02-04 00:00:00.000000000 Z
11
+ date: 2022-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: k_config
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: k_log
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +100,7 @@ files:
86
100
  - ".releaserc.json"
87
101
  - ".rspec"
88
102
  - ".rubocop.yml"
103
+ - ".vscode/settings.json"
89
104
  - Gemfile
90
105
  - Guardfile
91
106
  - README.md
@@ -104,6 +119,7 @@ files:
104
119
  - lib/k_director/dsls/children/blueprint.rb
105
120
  - lib/k_director/dsls/children/github.rb
106
121
  - lib/k_director/dsls/children/package_json.rb
122
+ - lib/k_director/dsls/children/package_json_configuration.rb
107
123
  - lib/k_director/dsls/nuxt3_dsl.rb
108
124
  - lib/k_director/dsls/ruby_gem_dsl.rb
109
125
  - lib/k_director/version.rb