k_director 0.7.2 → 0.9.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: 01c2703862b9bf79b4c341909d33799f83fc4b3db8a486f709061e8dcda1f795
4
- data.tar.gz: '063359b7c3717c8c8512db963bae8ebd23e4339799a477893bd90964342b7800'
3
+ metadata.gz: 4a7a7b652cc348b24d223f9c0df0d39443a61699e6b7221eaa65499d517f155b
4
+ data.tar.gz: 7b196d138fa1953a54562e0e381aee32754b55f43eada1981ac45db973c55209
5
5
  SHA512:
6
- metadata.gz: 58555b963f3cd67d9dc1097dacdbeabadeda3f9f258a769cd9bdfa623a5c2c5bf71fb37d28f6c33b4a2baae0ceff86b9f0f838e34624e81da2e6bfcd9efc9135
7
- data.tar.gz: 5baf583a108004162cb990eb022f660d23bf260f7b0b6aa45c56fb102ed5f6cf1f9e72f489ae5f52560af03d0d37c56d3cf2fd8d0d71168f344df0d46c73878c
6
+ metadata.gz: 03cb460ca47b4c4c5ef5f355ef13882ffd1b38b9590ecba60eb4c49551efe91d067029c79c02b9e5526a12677b23cbd87accf473650c62daa1ca91de4b71be8c
7
+ data.tar.gz: 14294acc2367c38f19f7c1ccb5dcecdcbf58bd86fc754bce974de4bb75ad635a8b21b36d698362d08d5eb584e0da23c4475c81d7938f697cf30f9de0d704dc51
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 ]
@@ -64,8 +65,6 @@ jobs:
64
65
  with:
65
66
  node-version: '16'
66
67
 
67
- # - uses: hmarr/debug-action@v2 # TURN on ENV DEBUG
68
-
69
68
  - name: Cache node modules
70
69
  uses: actions/cache@v2
71
70
  id: cache-node-modules
data/docs/CHANGELOG.md CHANGED
@@ -1,3 +1,31 @@
1
+ ## [0.8.1](https://github.com/klueless-io/k_director/compare/v0.8.0...v0.8.1) (2022-02-05)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add tests for package_json configuration ([d900065](https://github.com/klueless-io/k_director/commit/d900065bf810771841b97de03dfa9011c48c8e43))
7
+
8
+ # [0.8.0](https://github.com/klueless-io/k_director/compare/v0.7.3...v0.8.0) (2022-02-04)
9
+
10
+
11
+ ### Features
12
+
13
+ * add rubygem DSL support ([f93a863](https://github.com/klueless-io/k_director/commit/f93a86338d703771ba43a8e9ed5e7c8e9d1a7778))
14
+
15
+ ## [0.7.3](https://github.com/klueless-io/k_director/compare/v0.7.2...v0.7.3) (2022-02-03)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * alter internal github info ([ed77548](https://github.com/klueless-io/k_director/commit/ed77548eee2f1cdd0c9799f0842b0e44e79ed2f4))
21
+
22
+ ## [0.7.2](https://github.com/klueless-io/k_director/compare/v0.7.1...v0.7.2) (2022-02-03)
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * improve debug support ([6edb583](https://github.com/klueless-io/k_director/commit/6edb583e3aa467fbd77f4b30f2250dca9a170c7a))
28
+
1
29
  ## [0.7.1](https://github.com/klueless-io/k_director/compare/v0.7.0...v0.7.1) (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
@@ -13,6 +13,12 @@ module KDirector
13
13
 
14
14
  super(parent.k_builder, parent.builder, **@parent.inherited_opts(**opts))
15
15
  end
16
+
17
+ def debug
18
+ parent.debug_options
19
+ debug_options
20
+ debug_dom
21
+ end
16
22
  end
17
23
  end
18
24
  end
@@ -14,23 +14,23 @@ module KDirector
14
14
 
15
15
  defaults = {
16
16
  repo_name: opts[:repo_name], # || parent.builder.dom&[:github]&[:repo_name]
17
- user: opts[:user] || default_github_user, # || parent.builder.dom&[:github]&[:user]
17
+ username: opts[:username] || default_github_username, # || parent.builder.dom&[:github]&[:username]
18
18
  organization: opts[:organization] # || parent.builder.dom&[:github]&[:organization]
19
19
  }
20
20
 
21
- parent.builder.group_set(:github, **defaults)
21
+ parent.builder.group_set(:github, **repo_info_hash(**defaults))
22
22
  end
23
23
 
24
24
  def repo_name
25
- parent.builder.dom[:github][:repo_name]
25
+ parent.builder.dom.dig(:github, :repo_name)
26
26
  end
27
27
 
28
- def user
29
- parent.builder.dom[:github][:user]
28
+ def username
29
+ parent.builder.dom.dig(:github, :username)
30
30
  end
31
31
 
32
32
  def organization
33
- parent.builder.dom[:github][:organization]
33
+ parent.builder.dom.dig(:github, :organization)
34
34
  end
35
35
 
36
36
  def list_repositories
@@ -110,29 +110,32 @@ module KDirector
110
110
  end
111
111
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
112
112
 
113
- def repo_info(**opts)
114
- repo_name = opts[:name] || self.repo_name
115
- repo_name = repo_name.to_s
116
- username = opts[:username] || user
113
+ def repo_info_hash(**opts)
114
+ repo_name = (opts[:repo_name] || self.repo_name).to_s
115
+ username = opts[:username] || self.username
117
116
  organization = opts[:organization] || self.organization
118
117
  account = organization || username
119
118
  full_name = [account, repo_name].compact.join('/')
120
119
  link = "https://github.com/#{full_name}"
121
120
  ssh_link = "git@github.com:#{full_name}.git"
122
121
 
123
- OpenStruct.new(
122
+ {
124
123
  repo_name: repo_name,
125
124
  full_name: full_name,
126
125
  link: link,
127
126
  ssh_link: ssh_link,
128
127
  username: username,
129
128
  organization: organization
130
- )
129
+ }
130
+ end
131
+
132
+ def repo_info(**opts)
133
+ OpenStruct.new(**repo_info_hash(**opts))
131
134
  end
132
135
 
133
136
  private
134
137
 
135
- def default_github_user
138
+ def default_github_username
136
139
  KExt::Github.configuration.user
137
140
  end
138
141
 
@@ -0,0 +1,278 @@
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
+ @package[key] = value
173
+
174
+ write
175
+
176
+ self
177
+ end
178
+
179
+ # Dependency option
180
+ # ----------------------------------------------------------------------
181
+
182
+ # Getter for dependency option
183
+ def dependency_option
184
+ dependency_type == :development ? '-D' : '-P'
185
+ end
186
+
187
+ # Dependency type
188
+ # ----------------------------------------------------------------------
189
+
190
+ # Fluent setter for target folder
191
+ # rubocop:disable Naming/AccessorMethodName
192
+ def set_dependency_type(value)
193
+ self.dependency_type = value
194
+
195
+ self
196
+ end
197
+ # rubocop:enable Naming/AccessorMethodName
198
+
199
+ # Package file
200
+ # ----------------------------------------------------------------------
201
+
202
+ # Fluent setter for package file
203
+ # rubocop:disable Naming/AccessorMethodName
204
+ def set_package_file(value)
205
+ self.package_file = value
206
+
207
+ self
208
+ end
209
+ # rubocop:enable Naming/AccessorMethodName
210
+
211
+ # Setter for package file
212
+ def package_file=(_value)
213
+ @package_file = File.join(k_builder.target_folder, 'package.json')
214
+ end
215
+
216
+ # # Getter for target folder
217
+ # def package_file
218
+ # hash['package_file']
219
+ # end
220
+
221
+ # -----------------------------------
222
+ # Helpers
223
+ # -----------------------------------
224
+
225
+ def parse_options(options = nil, required_options = nil)
226
+ options = [] if options.nil?
227
+ options = options.split if options.is_a?(String)
228
+ options.reject(&:empty?)
229
+
230
+ required_options = [] if required_options.nil?
231
+ required_options = required_options.split if required_options.is_a?(String)
232
+
233
+ options | required_options
234
+ end
235
+
236
+ def options_any?(options, *any_options)
237
+ (options & any_options).any?
238
+ end
239
+
240
+ def execute(command)
241
+ puts "RUN: #{command}"
242
+ run_command command
243
+ load
244
+ end
245
+
246
+ def npm_add_or_install(packages, options)
247
+ # if -P or -D is not in the options then use the current builder dependency option
248
+ options.push dependency_option unless options_any?(options, '-P', '-D')
249
+ packages = packages.join(' ') if packages.is_a?(Array)
250
+ command = "npm install #{options.join(' ')} #{packages}"
251
+ execute command
252
+ end
253
+
254
+ # # Debug method to open the package file in vscode
255
+ # # ToDo: Maybe remove
256
+ # def vscode
257
+ # puts "cd #{output_path}"
258
+ # puts package_file
259
+ # run_command "code #{package_file}"
260
+ # end
261
+
262
+ # private
263
+
264
+ def get_group(key)
265
+ group = configuration.package_json.package_groups[key]
266
+
267
+ raise KConfig::PackageJson::Error, "unknown package group: #{key}" if group.nil?
268
+
269
+ group
270
+ end
271
+
272
+ def run_command(command)
273
+ parent.k_builder.run_command(command)
274
+ end
275
+ end
276
+ end
277
+ end
278
+ 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)
@@ -0,0 +1,26 @@
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 blueprint(**opts, &block)
19
+ blueprint = KDirector::Dsls::Children::Blueprint.new(self, **opts)
20
+ blueprint.instance_eval(&block) if block_given?
21
+
22
+ self
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KDirector
4
- VERSION = '0.7.2'
4
+ VERSION = '0.9.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.2",
3
+ "version": "0.9.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "k_director",
9
- "version": "0.7.2",
9
+ "version": "0.9.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.2",
3
+ "version": "0.9.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.2
4
+ version: 0.9.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-05 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