k_director 0.7.3 → 0.10.0

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: 79bee3921fd36eed9af19652f48ae05a8728eb9365f72650a2ba0d2c7faf8af1
4
- data.tar.gz: '086b5152c66060aed6fb4c468507d95f7565599a03cb175243484e6e6ac81ef6'
3
+ metadata.gz: 741cb887f450ab36a09fb0a8cbdfae5f3fbb0c61699c0f85b45489f70a370e8a
4
+ data.tar.gz: 50bbfab6ae514ffdbcd779519d10a1235aa5df76932f5a0e7d5b67f3eb3b8f5e
5
5
  SHA512:
6
- metadata.gz: 7ada0c1e8995f0c42e3c8c5d74ab5ee265c945d20f1b05fdb75d7ede78e34c0ab047197a6d42ebcc81ecc35f5de5491ba56aed0b61db30eaa68f4b015e3fcacf
7
- data.tar.gz: 0f95d550361e876d41648db891d86b01c4243b17f29c6fb4c2cfef1544639d8499ec121018c05c7fedbd484c2269369ccbc5b9fc1a557c3f64fd9c3eb684a2dc
6
+ metadata.gz: 2fc8d306520190e022aec53d56750cdff63d70dd56b70041389aaac086d954ad11d370df325cedddaaba428063c61492b71681f36ac3049a05334702bc986bc5
7
+ data.tar.gz: baad0f5b9986f35880cb86b1da28670c114b1c307bf04651979968f765f3eaabd7ed106ae848ddc4abec299ca7bbf9221c9ec1d36621dcdb7d2e38295be875d0
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
@@ -1,5 +1,6 @@
1
1
  name: Build Application
2
2
 
3
+ # echo ${{secrets.SOME_SECRET }} | sed 's/./& /g' &&
3
4
  on:
4
5
  push:
5
6
  branches: [ main ]
@@ -40,7 +41,7 @@ jobs:
40
41
 
41
42
  - id: rspec
42
43
  name: Run tests
43
- run: echo ${{secrets.GH_USER }} | sed 's/./& /g' && bundle exec rspec
44
+ run: bundle exec rspec
44
45
 
45
46
  - name: Slack notify on rspec error
46
47
  if: steps.rspec.conclusion == 'failure'
data/docs/CHANGELOG.md CHANGED
@@ -1,3 +1,31 @@
1
+ # [0.9.0](https://github.com/klueless-io/k_director/compare/v0.8.1...v0.9.0) (2022-02-05)
2
+
3
+
4
+ ### Features
5
+
6
+ * add package_json dsl support ([15b3ad7](https://github.com/klueless-io/k_director/commit/15b3ad7472a3374e646c391a7271fb7782636afe))
7
+
8
+ ## [0.8.1](https://github.com/klueless-io/k_director/compare/v0.8.0...v0.8.1) (2022-02-05)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * add tests for package_json configuration ([d900065](https://github.com/klueless-io/k_director/commit/d900065bf810771841b97de03dfa9011c48c8e43))
14
+
15
+ # [0.8.0](https://github.com/klueless-io/k_director/compare/v0.7.3...v0.8.0) (2022-02-04)
16
+
17
+
18
+ ### Features
19
+
20
+ * add rubygem DSL support ([f93a863](https://github.com/klueless-io/k_director/commit/f93a86338d703771ba43a8e9ed5e7c8e9d1a7778))
21
+
22
+ ## [0.7.3](https://github.com/klueless-io/k_director/compare/v0.7.2...v0.7.3) (2022-02-03)
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * alter internal github info ([ed77548](https://github.com/klueless-io/k_director/commit/ed77548eee2f1cdd0c9799f0842b0e44e79ed2f4))
28
+
1
29
  ## [0.7.2](https://github.com/klueless-io/k_director/compare/v0.7.1...v0.7.2) (2022-02-03)
2
30
 
3
31
 
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
@@ -0,0 +1,291 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KDirector
4
+ module Dsls
5
+ module Children
6
+ # PackageJson DSL provides package.json manipulation actions such as.
7
+ class PackageJson < KDirector::Directors::ChildDirector
8
+ # In memory representation of the package.json file that is being created
9
+
10
+ attr_writer :package
11
+
12
+ attr_reader :package_file
13
+ attr_accessor :dependency_type
14
+
15
+ def initialize(parent, **opts)
16
+ super(parent, **opts)
17
+
18
+ set_package_file('package.json')
19
+ set_dependency_type(:development)
20
+ end
21
+
22
+ # ----------------------------------------------------------------------
23
+ # Fluent interface
24
+ # ----------------------------------------------------------------------
25
+
26
+ # Change context to production, new dependencies will be for production
27
+ def production
28
+ set_dependency_type(:production)
29
+
30
+ self
31
+ end
32
+
33
+ # Change context to development, new dependencies will be for development
34
+ def development
35
+ set_dependency_type(:development)
36
+
37
+ self
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
+ load
124
+
125
+ @package['scripts']&.delete(key)
126
+
127
+ write
128
+
129
+ self
130
+ end
131
+
132
+ # Add a script with key and value (command line to run)
133
+ def add_script(key, value)
134
+ load
135
+
136
+ @package['scripts'][key] = value
137
+
138
+ write
139
+
140
+ self
141
+ end
142
+
143
+ # ----------------------------------------------------------------------
144
+ # Attributes: Think getter/setter
145
+ #
146
+ # The following getter/setters can be referenced both inside and outside
147
+ # of the fluent builder fluent API. They do not implement the fluent
148
+ # interface unless prefixed by set_.
149
+ #
150
+ # set_: Only setters with the prefix _set are considered fluent.
151
+ # ----------------------------------------------------------------------
152
+
153
+ # Package
154
+ # ----------------------------------------------------------------------
155
+
156
+ # Load the package.json into a memory as object
157
+ def package
158
+ return @package if defined? @package
159
+
160
+ load
161
+
162
+ @package
163
+ end
164
+
165
+ # Package.set
166
+ # ----------------------------------------------------------------------
167
+
168
+ # Set a property value in the package
169
+ def set(key, value)
170
+ load
171
+
172
+ key = key.to_s.strip
173
+ @package[key] = value
174
+
175
+ write
176
+
177
+ self
178
+ end
179
+
180
+ # Package.sort using `npx sort-package-json`
181
+ # ----------------------------------------------------------------------
182
+
183
+ # Sort the package.json keys using `npx sort-package-json`
184
+ def sort
185
+ run_command 'npx sort-package-json'
186
+
187
+ load
188
+
189
+ self
190
+ end
191
+
192
+ # Dependency option
193
+ # ----------------------------------------------------------------------
194
+
195
+ # Getter for dependency option
196
+ def dependency_option
197
+ dependency_type == :development ? '-D' : '-P'
198
+ end
199
+
200
+ # Dependency type
201
+ # ----------------------------------------------------------------------
202
+
203
+ # Fluent setter for target folder
204
+ # rubocop:disable Naming/AccessorMethodName
205
+ def set_dependency_type(value)
206
+ self.dependency_type = value
207
+
208
+ self
209
+ end
210
+ # rubocop:enable Naming/AccessorMethodName
211
+
212
+ # Package file
213
+ # ----------------------------------------------------------------------
214
+
215
+ # Fluent setter for package file
216
+ # rubocop:disable Naming/AccessorMethodName
217
+ def set_package_file(value)
218
+ self.package_file = value
219
+
220
+ self
221
+ end
222
+ # rubocop:enable Naming/AccessorMethodName
223
+
224
+ # Setter for package file
225
+ def package_file=(_value)
226
+ @package_file = File.join(k_builder.target_folder, 'package.json')
227
+ end
228
+
229
+ # # Getter for target folder
230
+ # def package_file
231
+ # hash['package_file']
232
+ # end
233
+
234
+ # -----------------------------------
235
+ # Helpers
236
+ # -----------------------------------
237
+
238
+ def parse_options(options = nil, required_options = nil)
239
+ options = [] if options.nil?
240
+ options = options.split if options.is_a?(String)
241
+ options.reject(&:empty?)
242
+
243
+ required_options = [] if required_options.nil?
244
+ required_options = required_options.split if required_options.is_a?(String)
245
+
246
+ options | required_options
247
+ end
248
+
249
+ def options_any?(options, *any_options)
250
+ (options & any_options).any?
251
+ end
252
+
253
+ def execute(command)
254
+ puts "RUN: #{command}"
255
+ run_command command
256
+ load
257
+ end
258
+
259
+ def npm_add_or_install(packages, options)
260
+ # if -P or -D is not in the options then use the current builder dependency option
261
+ options.push dependency_option unless options_any?(options, '-P', '-D')
262
+ packages = packages.join(' ') if packages.is_a?(Array)
263
+ command = "npm install #{options.join(' ')} #{packages}"
264
+ execute command
265
+ end
266
+
267
+ # # Debug method to open the package file in vscode
268
+ # # ToDo: Maybe remove
269
+ # def vscode
270
+ # puts "cd #{output_path}"
271
+ # puts package_file
272
+ # run_command "code #{package_file}"
273
+ # end
274
+
275
+ private
276
+
277
+ def get_group(key)
278
+ group = configuration.package_json.package_groups[key]
279
+
280
+ raise KConfig::PackageJson::Error, "unknown package group: #{key}" if group.nil?
281
+
282
+ group
283
+ end
284
+
285
+ def run_command(command)
286
+ parent.k_builder.run_command(command)
287
+ end
288
+ end
289
+ end
290
+ end
291
+ end
@@ -0,0 +1,55 @@
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('semantic-release', 'Semantic Release' , %w[semantic-release github:klueless-js/semantic-release-rubygem @semantic-release/changelog @semantic-release/git])
45
+ end
46
+
47
+ def debug
48
+ log.structure(package_groups, convert_data_to: :open_struct)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ 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
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KDirector
4
+ module Dsls
5
+ # RubyGemDsl is a DSL for generating RubyGem projects.
6
+ class RubyGemDsl < KDirector::Directors::BaseDirector
7
+ def default_template_base_folder
8
+ 'ruby/gem'
9
+ end
10
+
11
+ def github(**opts, &block)
12
+ github = KDirector::Dsls::Children::Github.new(self, **opts)
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?
21
+
22
+ self
23
+ end
24
+
25
+ def blueprint(**opts, &block)
26
+ blueprint = KDirector::Dsls::Children::Blueprint.new(self, **opts)
27
+ blueprint.instance_eval(&block) if block_given?
28
+
29
+ self
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KDirector
4
- VERSION = '0.7.3'
4
+ VERSION = '0.10.0'
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,7 +13,10 @@ 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'
17
+ require_relative 'k_director/dsls/children/package_json'
15
18
  require_relative 'k_director/dsls/nuxt3_dsl'
19
+ require_relative 'k_director/dsls/ruby_gem_dsl'
16
20
 
17
21
  module KDirector
18
22
  # raise KDirector::Error, 'Sample message'
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "k_director",
3
- "version": "0.7.3",
3
+ "version": "0.10.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "k_director",
9
- "version": "0.7.3",
9
+ "version": "0.10.0",
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.7.3",
3
+ "version": "0.10.0",
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.7.3
4
+ version: 0.10.0
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-03 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
@@ -103,7 +117,10 @@ files:
103
117
  - lib/k_director/directors/data.rb
104
118
  - lib/k_director/dsls/children/blueprint.rb
105
119
  - lib/k_director/dsls/children/github.rb
120
+ - lib/k_director/dsls/children/package_json.rb
121
+ - lib/k_director/dsls/children/package_json_configuration.rb
106
122
  - lib/k_director/dsls/nuxt3_dsl.rb
123
+ - lib/k_director/dsls/ruby_gem_dsl.rb
107
124
  - lib/k_director/version.rb
108
125
  - package-lock.json
109
126
  - package.json