k_director 0.7.2 → 0.9.0

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: 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