k_director 0.6.0 → 0.7.1

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: f18b4641c3f5638987c5e9d8922b51fd9ec509df88012d2408393ddcdf1353b6
4
- data.tar.gz: 7d38f50be00a404f176c3817228208eb980ebb158ea87f9966374e703c23d627
3
+ metadata.gz: 5939eff40d316d1567818484e3d6bed5ebea38b6252e6f8413773fb3b6237483
4
+ data.tar.gz: f1ac410aab5054420f5d1ed8231167b9a7c3f5fbb7f3c6e921f1e3a585e3bcc7
5
5
  SHA512:
6
- metadata.gz: c9c4659dddb2c5b32a1e665ac633eb975711aee4e5f924d7ae26b97c63f4b0bcd6f406f4248a93dbf5c22c60cd3a03a099446aaa577168e053ba2bf1b61c71cd
7
- data.tar.gz: 6ba9e757263833a14582d315d5dab1bb7b828b8f674486db65f566005386d2eeaa1f5d81d69540a75ba5ab14c7e6b69e67582f0ea7b61dcaa6efcd9788d09851
6
+ metadata.gz: d22685499a5845dfe933e4d8f9bc2c6d8c4905c18f8e66cdae2c20a5c4fa9d57138c234dde2fe5a41d3ece4a874e1f0d18fe47159e17a623dcab8a7b435c18fe
7
+ data.tar.gz: 7eb329e8211d8fe6ea1eafdc4c52ee4da1b0fdfde538744625c2327379dd04c28bb346ec5fa3cb234f9efd314e1f53f209f64d522596e65de16e048f84a352b5
@@ -35,6 +35,7 @@ KManager.action :bootstrap do
35
35
  # list_repositories
36
36
  # open_repository # (:k_director)
37
37
  # run_command('git init')
38
+ # k_director git:(main) gh repo edit -d "KDirector provides domain specific language (DSL) implementations for code generation"
38
39
  end
39
40
  .blueprint(
40
41
  name: :bin_hook,
@@ -7,7 +7,7 @@ on:
7
7
  branches: [ main ]
8
8
 
9
9
  jobs:
10
- test:
10
+ build:
11
11
  runs-on: ubuntu-latest
12
12
  name: Ruby ${{ matrix.ruby }}
13
13
  strategy:
@@ -22,32 +22,70 @@ jobs:
22
22
  ruby-version: ${{ matrix.ruby }}
23
23
  bundler-cache: true
24
24
 
25
- - name: Run tests
26
- run: bundle exec rspec
25
+ - id: lint
26
+ name: Run rubocop
27
+ run: bundle exec rubocop
27
28
 
28
- - name: Slack notify on rspec error
29
- if: failure()
29
+ - name: Slack notification on rubocop error
30
+ if: steps.lint.conclusion == 'failure'
30
31
  uses: rtCamp/action-slack-notify@v2
31
32
  env:
32
33
  SLACK_CHANNEL: klueless-repos
33
34
  SLACK_COLOR: '#ff0000'
34
35
  SLACK_ICON: https://avatars.githubusercontent.com/u/2956762?s=64&v=4
35
- SLACK_TITLE: 'RSpec failure on ${{github.repository}} - try:'
36
- SLACK_MESSAGE: 'rspec'
36
+ SLACK_TITLE: 'Rubocop failure on $ - try:'
37
+ SLACK_MESSAGE: 'cop -a'
37
38
  SLACK_USERNAME: klueless-io
38
- SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
39
+ SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
39
40
 
40
- - name: Run rubocop
41
- run: bundle exec rubocop
41
+ - id: rspec
42
+ name: Run tests
43
+ run: bundle exec rspec
42
44
 
43
- - name: Slack notification on rubocop error
44
- if: failure()
45
+ - name: Slack notify on rspec error
46
+ if: steps.rspec.conclusion == 'failure'
45
47
  uses: rtCamp/action-slack-notify@v2
46
48
  env:
47
49
  SLACK_CHANNEL: klueless-repos
48
50
  SLACK_COLOR: '#ff0000'
49
51
  SLACK_ICON: https://avatars.githubusercontent.com/u/2956762?s=64&v=4
50
- SLACK_TITLE: 'Rubocop failure on $ - try:'
51
- SLACK_MESSAGE: 'cop -a'
52
+ SLACK_TITLE: 'RSpec failure on ${{github.repository}} - try:'
53
+ SLACK_MESSAGE: 'rspec'
52
54
  SLACK_USERNAME: klueless-io
53
55
  SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
56
+
57
+ release:
58
+ needs: build
59
+ name: Update version and publish to RubyGems
60
+ runs-on: ubuntu-latest
61
+ steps:
62
+ - uses: actions/checkout@v2
63
+ - uses: actions/setup-node@v2
64
+ with:
65
+ node-version: '16'
66
+
67
+ # - uses: hmarr/debug-action@v2 # TURN on ENV DEBUG
68
+
69
+ - name: Cache node modules
70
+ uses: actions/cache@v2
71
+ id: cache-node-modules
72
+ env:
73
+ cache-name: cache-node-modules
74
+ with:
75
+ path: ~/.npm
76
+ key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
77
+ restore-keys: |
78
+ ${{ runner.os }}-build-${{ env.cache-name }}-
79
+ ${{ runner.os }}-build-
80
+ ${{ runner.os }}-
81
+
82
+ - name: Install semantic-release dependencies
83
+ if: steps.cache.outputs.cache-hit != 'true'
84
+ run: npm ci
85
+
86
+ # SEE MORE: https://github.com/semantic-release/semantic-release/issues/753
87
+ - name: Run SemVer
88
+ run: npm run release
89
+ env:
90
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
91
+ GEM_HOST_API_KEY: ${{ secrets.GEM_HOST_API_KEY }}
data/docs/CHANGELOG.md CHANGED
@@ -1,3 +1,56 @@
1
+ # [0.7.0](https://github.com/klueless-io/k_director/compare/v0.6.2...v0.7.0) (2022-02-03)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * apply cops ([3ed749b](https://github.com/klueless-io/k_director/commit/3ed749b504264f93dfcfbc7c57fb10e91c1aca36))
7
+
8
+
9
+ ### Features
10
+
11
+ * add github dsll support and scenario tests ([ce9b0c8](https://github.com/klueless-io/k_director/commit/ce9b0c8ad6df9dc1154074e9e23c5310919bd112))
12
+
13
+ ## [0.6.2](https://github.com/klueless-io/k_director/compare/v0.6.1...v0.6.2) (2022-02-01)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * merge main and semver gha workflows ([5c3a9e4](https://github.com/klueless-io/k_director/commit/5c3a9e4a6f01129cc513760b86453a4201835765))
19
+ * merge main and semver gha workflows - final ([0c5eb76](https://github.com/klueless-io/k_director/commit/0c5eb76d8008d5ec869fdb9c9adcc306e6a51604))
20
+ * merge main and semver gha workflows [#2](https://github.com/klueless-io/k_director/issues/2) ([f20f719](https://github.com/klueless-io/k_director/commit/f20f719f5f82d5761b9886b1d294750a761a7376))
21
+ * merge main and semver gha workflows [#2](https://github.com/klueless-io/k_director/issues/2) ([2102bca](https://github.com/klueless-io/k_director/commit/2102bca3ebe67d75e4d8d6c12cf962420371264c))
22
+ * merge main and semver gha workflows [#2](https://github.com/klueless-io/k_director/issues/2) ([9f384fd](https://github.com/klueless-io/k_director/commit/9f384fd88ab7ec39fd15b256b61c146e113f4a8d))
23
+ * merge main and semver gha workflows [#2](https://github.com/klueless-io/k_director/issues/2) ([bd4dbcd](https://github.com/klueless-io/k_director/commit/bd4dbcd842f5dee4dabc7eb9495a6f143a02d3ef))
24
+ * merge main and semver gha workflows [#2](https://github.com/klueless-io/k_director/issues/2) ([79c793d](https://github.com/klueless-io/k_director/commit/79c793d46accb10dc81a0bc0b9f8bbc451f03df7))
25
+ * merge main and semver gha workflows [#2](https://github.com/klueless-io/k_director/issues/2) ([353bc81](https://github.com/klueless-io/k_director/commit/353bc81eab7759fba7be3d12ca73293699c70146))
26
+ * merge main and semver gha workflows [#2](https://github.com/klueless-io/k_director/issues/2) ([61f4772](https://github.com/klueless-io/k_director/commit/61f4772cac5400b0085f9081a46f8fbc68471534))
27
+ * merge main and semver gha workflows [#3](https://github.com/klueless-io/k_director/issues/3) ([ee13161](https://github.com/klueless-io/k_director/commit/ee131618a66dea1a0996f4be897bcfe6b902482f))
28
+ * merge main and semver gha workflows [#3](https://github.com/klueless-io/k_director/issues/3) ([074b65c](https://github.com/klueless-io/k_director/commit/074b65cfd95d1e6fc355f8ec0d47f03ec6c9b867))
29
+ * merge main and semver gha workflows [#4](https://github.com/klueless-io/k_director/issues/4) ([8001aa5](https://github.com/klueless-io/k_director/commit/8001aa5be830197baaa5e956c6b5bd010479fd60))
30
+ * merge main and semver gha workflows [#5](https://github.com/klueless-io/k_director/issues/5) ([6ba2432](https://github.com/klueless-io/k_director/commit/6ba2432126c8c1fe5e157d470e6c8609cea174d6))
31
+ * merge main and semver gha workflows [#6](https://github.com/klueless-io/k_director/issues/6) ([62eb60e](https://github.com/klueless-io/k_director/commit/62eb60e55dbfed3aa16faf17e137b39505e2e8a8))
32
+ * merge main and semver gha workflows [#7](https://github.com/klueless-io/k_director/issues/7) ([30fba4b](https://github.com/klueless-io/k_director/commit/30fba4b7da6aced100dfd68a750e051f6ddc0da8))
33
+ * merge main and semver gha workflows [#8](https://github.com/klueless-io/k_director/issues/8) ([e6a55f7](https://github.com/klueless-io/k_director/commit/e6a55f73235a556861140358592f6b5d031dec24))
34
+
35
+ ## [0.6.1](https://github.com/klueless-io/k_director/compare/v0.6.0...v0.6.1) (2022-01-31)
36
+
37
+
38
+ ### Bug Fixes
39
+
40
+ * add data to base (plus settings) to director ([bee18a1](https://github.com/klueless-io/k_director/commit/bee18a1eda36d802611c5cf354031963daa82c69))
41
+
42
+ # [0.6.0](https://github.com/klueless-io/k_director/compare/v0.5.0...v0.6.0) (2022-01-31)
43
+
44
+
45
+ ### Bug Fixes
46
+
47
+ * add improve group_set on action_builder ([b11ff25](https://github.com/klueless-io/k_director/commit/b11ff25475d48c07af67f3e82bff58ab903ae4a5))
48
+
49
+
50
+ ### Features
51
+
52
+ * add data director class ([510d970](https://github.com/klueless-io/k_director/commit/510d9701480a57580b0cc4f4a58398ce7752a431))
53
+
1
54
  # [0.5.0](https://github.com/klueless-io/k_director/compare/v0.4.1...v0.5.0) (2022-01-31)
2
55
 
3
56
 
data/k_director.gemspec CHANGED
@@ -44,5 +44,6 @@ Gem::Specification.new do |spec|
44
44
  spec.add_dependency 'k_log', '~> 0.0.0'
45
45
  # spec.add_dependency 'k_type', '~> 0.0.0'
46
46
  spec.add_dependency 'k_builder', '~> 0.0.0'
47
+ spec.add_dependency 'k_ext-github', '~> 0.0.0'
47
48
  spec.add_dependency 'k_util', '~> 0.0.0'
48
49
  end
@@ -34,8 +34,14 @@ module KDirector
34
34
  @options.on_action ||= :queue # %i[queue execute]
35
35
  end
36
36
 
37
- def data(**opts)
38
- KDirector::Dsls::Children::Data.new(self, **opts)
37
+ def data(name = nil, **opts)
38
+ KDirector::Directors::Data.new(self, name, **opts)
39
+
40
+ self
41
+ end
42
+
43
+ def settings(**opts)
44
+ KDirector::Directors::Data.new(self, :settings, **opts)
39
45
 
40
46
  self
41
47
  end
@@ -12,22 +12,146 @@ module KDirector
12
12
  def initialize(parent, **opts)
13
13
  super(parent, **opts)
14
14
 
15
- @options.repo_name ||= parent.options.repo_name
16
- @options.repo_organization ||= parent.options.repo_organization
17
- end
15
+ defaults = {
16
+ repo_name: opts[:repo_name], # || parent.builder.dom&[:github]&[:repo_name]
17
+ user: opts[:user] || default_github_user, # || parent.builder.dom&[:github]&[:user]
18
+ organization: opts[:organization] # || parent.builder.dom&[:github]&[:organization]
19
+ }
18
20
 
19
- def repo
20
- return parent.options.repo if defined? parent.options.repo
21
+ parent.builder.group_set(:github, **defaults)
22
+ end
21
23
 
22
- parent.options.repo = OpenStruct.new(name: nil, organization: nil)
24
+ def repo_name
25
+ parent.builder.dom[:github][:repo_name]
23
26
  end
24
27
 
25
- def name
26
- repo.repo_name
28
+ def user
29
+ parent.builder.dom[:github][:user]
27
30
  end
28
31
 
29
32
  def organization
30
- repo.repo_organization
33
+ parent.builder.dom[:github][:organization]
34
+ end
35
+
36
+ def list_repositories
37
+ repos = create_api.all_repositories
38
+
39
+ KExt::Github::Printer.repositories_as_table repos
40
+
41
+ log.kv 'Repository count', repos.length
42
+ rescue StandardError => e
43
+ log.exception(e)
44
+ end
45
+
46
+ def open_repository(**opts)
47
+ info = repo_info(**opts)
48
+
49
+ system("open -a 'Google Chrome' #{info.link}")
50
+ end
51
+
52
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
53
+ def create_repository(**opts)
54
+ info = repo_info(**opts)
55
+
56
+ if info.repo_name.blank?
57
+ log.error 'Repository name is required'
58
+ return
59
+ end
60
+
61
+ repo = create_api.all_repositories.find { |r| r.full_name == info.full_name }
62
+
63
+ if repo.nil?
64
+ log.heading 'Repository create'
65
+ log.kv 'Repository Name', info.repo_name
66
+ log.kv 'Repository Full Name', info.full_name
67
+ log.kv 'Organization Name', info.organization if info.organization
68
+ success = create_api.create_repository(info.repo_name, organization: info.organization)
69
+ log.info "Repository: #{info.full_name} created" if success
70
+ log.error "Repository: #{info.full_name} was not created" unless success
71
+
72
+ system("open -a 'Google Chrome' #{info.link}") if opts[:open]
73
+ else
74
+ log.warn 'Repository already exists, nothing to create'
75
+ end
76
+
77
+ log_repo_info(info)
78
+ rescue StandardError => e
79
+ log.exception(e)
80
+ end
81
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
82
+
83
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
84
+ def delete_repository(**opts)
85
+ info = repo_info(**opts)
86
+
87
+ if info.repo_name.blank?
88
+ log.error 'Repository name is required'
89
+ return
90
+ end
91
+
92
+ repo = create_api.all_repositories.find { |r| r.full_name == info.full_name }
93
+
94
+ if repo.present?
95
+ log.heading 'Repository delete'
96
+ log.kv 'Repository Name', info.repo_name
97
+ log.kv 'Repository Full Name', info.full_name
98
+ log.kv 'Organization Name', info.organization if info.organization
99
+ success = delete_api.delete_repository(info.full_name, organization: info.organization)
100
+ log.info "Repository: #{info.full_name} deleted" if success
101
+ log.error "Repository: #{info.full_name} was not deleted" unless success
102
+ # system("open -a 'Google Chrome' #{info.link}") if opts[:open]
103
+ else
104
+ log.warn 'Repository does not exist, nothing to delete'
105
+ end
106
+
107
+ log_repo_info(info)
108
+ rescue StandardError => e
109
+ log.exception(e)
110
+ end
111
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
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
117
+ organization = opts[:organization] || self.organization
118
+ account = organization || username
119
+ full_name = [account, repo_name].compact.join('/')
120
+ link = "https://github.com/#{full_name}"
121
+ ssh_link = "git@github.com:#{full_name}.git"
122
+
123
+ OpenStruct.new(
124
+ repo_name: repo_name,
125
+ full_name: full_name,
126
+ link: link,
127
+ ssh_link: ssh_link,
128
+ username: username,
129
+ organization: organization
130
+ )
131
+ end
132
+
133
+ private
134
+
135
+ def default_github_user
136
+ KExt::Github.configuration.user
137
+ end
138
+
139
+ def create_api
140
+ token = KExt::Github.configuration.personal_access_token
141
+ KExt::Github::Api.instance(token)
142
+ end
143
+
144
+ def delete_api
145
+ token = KExt::Github.configuration.personal_access_token_delete
146
+ KExt::Github::Api.instance(token)
147
+ end
148
+
149
+ def log_repo_info(info)
150
+ log.kv 'SSH', info.ssh_link
151
+ log.kv 'HTTPS', info.git_link
152
+ log.kv 'GITHUB', KUtil.console.hyperlink(info.link, info.link)
153
+
154
+ # log.json repo.to_h
31
155
  end
32
156
  end
33
157
  end
@@ -0,0 +1,288 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KDirector
4
+ module Dsls
5
+ # Nuxt3Dsl is a DSL for generating Nuxt3.x projects.
6
+ class Nuxt3Dsl < KDirector::Directors::BaseDirector
7
+ def default_template_base_folder
8
+ 'nuxt3'
9
+ end
10
+
11
+ def github(**opts, &block)
12
+ github = Dsl::Github.new(self, **opts)
13
+ github.instance_eval(&block)
14
+
15
+ self
16
+ end
17
+
18
+ def blueprint(**opts, &block)
19
+ blueprint = Dsl::RubyGemBlueprint.new(self, **opts)
20
+ blueprint.instance_eval(&block)
21
+
22
+ self
23
+ end
24
+
25
+ # def blueprint(**opts, &block)
26
+ # blueprint = Dsl::Blueprint.new(self, **opts)
27
+ # blueprint.instance_eval(&block)
28
+
29
+ # self
30
+ # end
31
+
32
+ # def app(**opts, &block)
33
+ # app = Dsl::Nuxt3App.new(self, **opts)
34
+ # app.instance_eval(&block)
35
+
36
+ # self
37
+ # end
38
+
39
+ # def layouts(**opts, &block)
40
+ # layouts = Dsl::Nuxt3Layout.new(self, **opts)
41
+ # layouts.instance_eval(&block)
42
+
43
+ # self
44
+ # end
45
+
46
+ # def pages(**opts, &block)
47
+ # pages = Dsl::Nuxt3Page.new(self, **opts)
48
+ # pages.instance_eval(&block)
49
+
50
+ # self
51
+ # end
52
+
53
+ # def components(**opts, &block)
54
+ # components = Dsl::Nuxt3Component.new(self, **opts)
55
+ # components.instance_eval(&block)
56
+
57
+ # self
58
+ # end
59
+
60
+ # def stories(**opts, &block)
61
+ # stories = Dsl::Nuxt3Story.new(self, **opts)
62
+ # stories.instance_eval(&block)
63
+
64
+ # self
65
+ # end
66
+
67
+ # def apis(**opts, &block)
68
+ # apis = Dsl::Nuxt3Api.new(self, **opts)
69
+ # apis.instance_eval(&block)
70
+
71
+ # self
72
+ # end
73
+ end
74
+
75
+ # class Nuxt3App < KDirector::Directors::ChildDirector
76
+
77
+ # def setup_tailwind
78
+ # run_command('yarn add -D tailwindcss@latest')
79
+ # run_command('yarn add -D postcss@^8.3.11') # @latest
80
+ # run_command('yarn add -D autoprefixer@latest')
81
+ # run_command('npx tailwindcss init -p')
82
+ # end
83
+
84
+ # def setup_storybook
85
+ # run_command('yarn add -D @storybook/vue3')
86
+ # run_command('yarn add -D @storybook/addon-docs')
87
+ # run_command('yarn add -D @storybook/addon-essentials')
88
+ # run_command('yarn add -D @storybook/addon-storysource')
89
+ # run_command('yarn add -D @storybook/addon-postcss')
90
+ # run_command('yarn add -D storybook-builder-vite')
91
+ # end
92
+ # # >> "postcss": "^8.4.5", // Post CSS 8.4.5 does not work with storybook
93
+ # end
94
+
95
+ # class Nuxt3Layout < KDirector::Directors::ChildDirector
96
+ # # @param [Hash] **opts The options
97
+ # # @option opts [String] :variant Template variant name
98
+ # # @option opts [String] :template_subfolder Template subfolder
99
+ # def layout(name, **opts)
100
+ # variant = opts[:variant] || name
101
+ # template_filename = "#{dasherize.parse(variant.to_s)}.vue"
102
+ # template_file = resolve_template_file("nuxt3/layouts", template_filename, **opts)
103
+ # output_filename = "#{dasherize.parse(name.to_s)}.vue"
104
+ # output_file = File.join('layouts', output_filename)
105
+
106
+ # opts = {
107
+ # template_file: template_file
108
+ # }.merge(opts)
109
+
110
+ # add_file(output_file, **opts)
111
+ # end
112
+
113
+ # def olayout(name, **opts); layout(name, **{ open: true }.merge(opts)); end
114
+ # def tlayout(name, **opts); layout(name, **{ open_template: true }.merge(opts)); end
115
+ # def flayout(name, **opts); layout(name, **{ on_exist: :write }.merge(opts)); end
116
+
117
+ # def sample_layout(name, **opts)
118
+ # layout(name, template_subfolder: 'samples', **opts)
119
+ # end
120
+
121
+ # def osample_layout(name, **opts); sample_layout(name, **{ open: true }.merge(opts)); end
122
+ # def tsample_layout(name, **opts); sample_layout(name, **{ open_template: true }.merge(opts)); end
123
+ # def fsample_layout(name, **opts); sample_layout(name, **{ on_exist: :write }.merge(opts)); end
124
+
125
+ # end
126
+
127
+ # class Nuxt3Page < KDirector::Directors::ChildDirector
128
+ # # @param [Hash] **opts The options
129
+ # # @option opts [String] :subfolder Output subfolder
130
+ # # @option opts [String] :variant Template variant name
131
+ # # @option opts [String] :template_subfolder Template subfolder
132
+ # def page(name, **opts)
133
+ # variant = opts[:variant] || name
134
+ # template_filename = "#{dasherize.parse(variant.to_s)}.vue"
135
+ # template_file = resolve_template_file("nuxt3/pages", template_filename, **opts)
136
+ # output_filename = "#{dasherize.parse(name.to_s)}.vue"
137
+ # parts = ['pages', opts[:subfolder], output_filename].reject(&:blank?).map(&:to_s)
138
+ # output_file = File.join(*parts)
139
+
140
+ # opts = {
141
+ # template_file: template_file,
142
+ # dom: {
143
+ # page_name: opts[:page_name] || name,
144
+ # main_key: opts[:main_key] || :sample
145
+ # }
146
+ # }.merge(opts)
147
+
148
+ # add_file(output_file, **opts)
149
+ # end
150
+ # def opage(name, **opts); page(name, **{ open: true }.merge(opts)); end
151
+ # def tpage(name, **opts); page(name, **{ open_template: true }.merge(opts)); end
152
+ # def fpage(name, **opts); page(name, **{ on_exist: :write }.merge(opts)); end
153
+
154
+ # def sample_page(name, **opts)
155
+ # page(name, template_subfolder: 'samples', **opts)
156
+ # end
157
+
158
+ # def osample_page(name, **opts); sample_page(name, **{ open: true }.merge(opts)); end
159
+ # def tsample_page(name, **opts); sample_page(name, **{ open_template: true }.merge(opts)); end
160
+ # def fsample_page(name, **opts); sample_page(name, **{ on_exist: :write }.merge(opts)); end
161
+
162
+ # def tw_page(name, element, element_name, **opts)
163
+ # options = {
164
+ # subfolder: "tailwind/#{element}",
165
+ # variant: 'one-component',
166
+ # dom: {
167
+ # page_name: "#{opts[:page_name] || name}",
168
+ # vue_component: "<#{camel.parse(element.to_s)}#{camel.parse(element_name.to_s)} />"
169
+ # }
170
+ # }.merge(opts)
171
+
172
+ # page(name, **options)
173
+ # end
174
+ # end
175
+
176
+ # class Nuxt3Component < KDirector::Directors::ChildDirector
177
+ # # @param [Hash] **opts The options
178
+ # # @option opts [String] :variant Template variant name
179
+ # # @option opts [String] :template_subfolder Template subfolder
180
+ # def component(name, **opts)
181
+ # variant = opts[:variant] || name
182
+ # template_filename = "#{camel.parse(variant.to_s)}.vue"
183
+ # template_file = resolve_template_file("nuxt3/components", template_filename, **opts)
184
+ # output_filename = "#{camel.parse(name.to_s)}.vue"
185
+ # parts = ['components', opts[:subfolder], output_filename].reject(&:blank?).map(&:to_s)
186
+ # output_file = File.join(*parts)
187
+
188
+ # opts = {
189
+ # template_file: template_file,
190
+ # dom: {
191
+ # component_name: opts[:component_name] || name
192
+ # }
193
+ # }.merge(opts)
194
+
195
+ # add_file(output_file, **opts)
196
+ # end
197
+ # def ocomponent(name, **opts); component(name, **{ open: true }.merge(opts)); end
198
+ # def tcomponent(name, **opts); component(name, **{ open_template: true }.merge(opts)); end
199
+ # def fcomponent(name, **opts); component(name, **{ on_exist: :write }.merge(opts)); end
200
+
201
+ # def sample_component(name, **opts)
202
+ # component(name, template_subfolder: 'samples', **opts)
203
+ # end
204
+
205
+ # def osample_component(name, **opts); sample_component(name, **{ open: true }.merge(opts)); end
206
+ # def tsample_component(name, **opts); sample_component(name, **{ open_template: true }.merge(opts)); end
207
+ # def fsample_component(name, **opts); sample_component(name, **{ on_exist: :write }.merge(opts)); end
208
+
209
+ # def tw_component(name, element, element_name, **opts)
210
+ # tw_element_file = k_builder.target_file(element.to_s, "#{element_name}.html", folder_key: :tailwind_elements)
211
+ # tw_element = File.exist?(tw_element_file) ? File.read(tw_element_file) : "element not found: #{tw_element_file}"
212
+
213
+ # options = {
214
+ # subfolder: element,
215
+ # variant: :tw_html_component,
216
+ # dom: {
217
+ # component_name: "#{opts[:component_name] || name}",
218
+ # tailwind_element: tw_element
219
+ # }
220
+ # }.merge(opts)
221
+
222
+ # component(name, **options)
223
+ # end
224
+ # end
225
+
226
+ # class Nuxt3Story < KDirector::Directors::ChildDirector
227
+ # # @param [Hash] **opts The options
228
+ # # @option opts [String] :variant Template variant name
229
+ # # @option opts [String] :template_subfolder Template subfolder
230
+ # def component_story(name, **opts)
231
+ # variant = opts[:variant] || name
232
+ # template_filename = "#{variant.to_s}.stories.js"
233
+ # template_file = resolve_template_file("nuxt3/stories", template_filename, **opts)
234
+ # output_filename = "#{camel.parse(name.to_s)}.stories.js"
235
+ # output_file = File.join('stories', output_filename)
236
+
237
+ # opts = {
238
+ # template_file: template_file,
239
+ # }.merge(opts)
240
+
241
+ # add_file(output_file, **opts)
242
+ # end
243
+
244
+ # def ocomponent_story(name, **opts); component_story(name, **{ open: true }.merge(opts)); end
245
+ # def tcomponent_story(name, **opts); component_story(name, **{ open_template: true }.merge(opts)); end
246
+ # def fcomponent_story(name, **opts); component_story(name, **{ on_exist: :write }.merge(opts)); end
247
+
248
+ # def sample_component_story(name, **opts)
249
+ # component_story(name, template_subfolder: 'samples', **opts)
250
+ # end
251
+
252
+ # def osample_component_story(name, **opts); component_story(name, **{ open: true }.merge(opts)); end
253
+ # def tsample_component_story(name, **opts); component_story(name, **{ open_template: true }.merge(opts)); end
254
+ # def fsample_component_story(name, **opts); component_story(name, **{ on_exist: :write }.merge(opts)); end
255
+ # end
256
+
257
+ # class Nuxt3Api < KDirector::Directors::ChildDirector
258
+ # # @param [Hash] **opts The options
259
+ # # @option opts [String] :variant Template variant name
260
+ # # @option opts [String] :template_subfolder Template subfolder
261
+ # def api(name, **opts)
262
+ # variant = opts[:variant] || name
263
+ # template_filename = "#{dasherize.parse(variant.to_s)}.ts"
264
+ # template_file = resolve_template_file("nuxt3/server/api", template_filename, **opts)
265
+ # output_filename = "#{dasherize.parse(name.to_s)}.ts"
266
+ # output_file = File.join('server/api', output_filename)
267
+
268
+ # opts = {
269
+ # template_file: template_file,
270
+ # }.merge(opts)
271
+
272
+ # add_file(output_file, **opts)
273
+ # end
274
+
275
+ # def oapi(name, **opts); api(name, **{ open: true }.merge(opts)); end
276
+ # def tapi(name, **opts); api(name, **{ open_template: true }.merge(opts)); end
277
+ # def fapi(name, **opts); api(name, **{ on_exist: :write }.merge(opts)); end
278
+
279
+ # def sample_api(name, **opts)
280
+ # api(name, template_subfolder: 'samples', **opts)
281
+ # end
282
+
283
+ # def osample_api(name, **opts); sample_api(name, **{ open: true }.merge(opts)); end
284
+ # def tsample_api(name, **opts); sample_api(name, **{ open_template: true }.merge(opts)); end
285
+ # def fsample_api(name, **opts); sample_api(name, **{ on_exist: :write }.merge(opts)); end
286
+ # end
287
+ end
288
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KDirector
4
- VERSION = '0.6.0'
4
+ VERSION = '0.7.1'
5
5
  end
data/lib/k_director.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'k_log'
4
4
  require 'k_util'
5
5
  require 'k_builder'
6
+ require 'k_ext/github'
6
7
 
7
8
  require_relative 'k_director/version'
8
9
  require_relative 'k_director/builders/actions_builder'
@@ -11,6 +12,7 @@ require_relative 'k_director/directors/child_director'
11
12
  require_relative 'k_director/directors/data'
12
13
  require_relative 'k_director/dsls/children/blueprint'
13
14
  require_relative 'k_director/dsls/children/github'
15
+ require_relative 'k_director/dsls/nuxt3_dsl'
14
16
 
15
17
  module KDirector
16
18
  # raise KDirector::Error, 'Sample message'
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "k_director",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "k_director",
9
- "version": "0.6.0",
9
+ "version": "0.7.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.6.0",
3
+ "version": "0.7.1",
4
4
  "description": "Command line and CI/CD tools for k_director",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: k_director
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.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-01-31 00:00:00.000000000 Z
11
+ date: 2022-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: k_log
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: k_ext-github
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: k_util
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -62,14 +76,12 @@ extra_rdoc_files: []
62
76
  files:
63
77
  - ".builders/_.rb"
64
78
  - ".builders/boot.rb"
65
- - ".builders/dsl/github_dsl.rb"
66
79
  - ".builders/dsl/ruby_gem_dsl.rb"
67
80
  - ".builders/generators/01-bootstrap.rb"
68
81
  - ".builders/run.rb"
69
82
  - ".githooks/commit-msg"
70
83
  - ".githooks/pre-commit"
71
84
  - ".github/workflows/main.yml"
72
- - ".github/workflows/semver.yml"
73
85
  - ".gitignore"
74
86
  - ".releaserc.json"
75
87
  - ".rspec"
@@ -91,6 +103,7 @@ files:
91
103
  - lib/k_director/directors/data.rb
92
104
  - lib/k_director/dsls/children/blueprint.rb
93
105
  - lib/k_director/dsls/children/github.rb
106
+ - lib/k_director/dsls/nuxt3_dsl.rb
94
107
  - lib/k_director/version.rb
95
108
  - package-lock.json
96
109
  - package.json
@@ -1,129 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Dsl
4
- class Github < Dsl::Directors::ChildDirector
5
- def initialize(parent, **opts)
6
- super(parent, **opts)
7
-
8
- @options.repo_name ||= parent.options.repo_name
9
- @options.repo_organization ||= parent.options.repo_organization
10
- end
11
-
12
- def repo_name
13
- @options.repo_name
14
- end
15
-
16
- def repo_organization
17
- @options.repo_organization
18
- end
19
-
20
- def list_repositories
21
- repos = api.all_repositories
22
-
23
- KExt::Github::Printer::repositories_as_table repos
24
-
25
- log.kv 'Repository count', repos.length
26
- rescue StandardError => error
27
- log.exception(error)
28
- end
29
-
30
- def open_repository(**opts)
31
- info = repo_info(**opts)
32
-
33
- system("open -a 'Google Chrome' #{info.link}")
34
- end
35
-
36
- def create_repository(**opts)
37
- info = repo_info(**opts)
38
-
39
- repo = api.all_repositories.find { |r| r.full_name == info.full_name }
40
-
41
- if repo.nil?
42
- log.heading 'Repository create'
43
- log.kv 'Repository Name', info.name
44
- log.kv 'Repository Full Name', info.full_name
45
- log.kv 'Organization Name', info.organization if info.organization
46
- success = api.create_repository(info.name, organization: info.organization)
47
- log.info "Repository: #{info.full_name} created" if success
48
- log.error "Repository: #{info.full_name} was not created" unless success
49
-
50
- system("open -a 'Google Chrome' #{info.link}") if opts[:open]
51
- else
52
- log.warn 'Repository already exists, nothing to create'
53
- end
54
-
55
- log_repo_info(info)
56
- rescue StandardError => error
57
- log.exception(error)
58
- end
59
-
60
- def delete_repository(**opts)
61
- info = repo_info(**opts)
62
-
63
- repo = api.all_repositories.find { |r| r.full_name == info.full_name }
64
-
65
- if repo.present?
66
- log.heading 'Repository delete'
67
- log.kv 'Repository Name', info.name
68
- log.kv 'Repository Full Name', info.full_name
69
- log.kv 'Organization Name', info.organization if info.organization
70
- success = delete_api.delete_repository(info.full_name, organization: info.organization)
71
- log.info "Repository: #{info.full_name} deleted" if success
72
- log.error "Repository: #{info.full_name} was not deleted" unless success
73
- # system("open -a 'Google Chrome' #{info.link}") if opts[:open]
74
- else
75
- log.warn 'Repository does not exist, nothing to delete'
76
- end
77
-
78
- log_repo_info(info)
79
- rescue StandardError => error
80
- log.exception(error)
81
- end
82
-
83
- def repo_info(**opts)
84
- name = opts[:name] || self.repo_name
85
- name = name.to_s
86
- username = opts[:username] || self.username
87
- organization = opts[:organization] || self.repo_organization
88
- account = organization || username
89
- full_name = [account, name].compact.join("/")
90
- link = "https://github.com/#{full_name}"
91
- ssh_link = "git@github.com:#{full_name}.git"
92
-
93
- OpenStruct.new(
94
- name: name,
95
- full_name: full_name,
96
- link: link,
97
- ssh_link: ssh_link,
98
- username: username,
99
- organization: organization
100
- )
101
- end
102
-
103
- private
104
-
105
-
106
- def username
107
- KExt::Github.configuration.user
108
- end
109
-
110
- def api
111
- token = KExt::Github.configuration.personal_access_token
112
- KExt::Github::Api.instance(token)
113
- end
114
-
115
- def delete_api
116
- token = KExt::Github.configuration.personal_access_token_delete
117
- KExt::Github::Api.instance(token)
118
- end
119
-
120
- def log_repo_info(info)
121
- log.kv 'SSH', info.ssh_link
122
- log.kv 'HTTPS', info.git_link
123
- log.kv 'GITHUB', KUtil.console.hyperlink(info.link, info.link)
124
-
125
- # log.json repo.to_h
126
- end
127
-
128
- end
129
- end
@@ -1,54 +0,0 @@
1
- name: SemVer
2
- on:
3
- workflow_run:
4
- workflows: ["Build Application"]
5
- branches: [main]
6
- types:
7
- - completed
8
- jobs:
9
- release:
10
- runs-on: ubuntu-latest
11
- if: ${{ github.event.workflow_run.conclusion == 'success' }}
12
- steps:
13
- - uses: actions/checkout@v2
14
- - uses: actions/setup-node@v2
15
- with:
16
- node-version: '16'
17
-
18
- # - uses: hmarr/debug-action@v2 # TURN on ENV DEBUG
19
-
20
- - name: Cache node modules
21
- uses: actions/cache@v2
22
- id: cache-node-modules
23
- env:
24
- cache-name: cache-node-modules
25
- with:
26
- path: ~/.npm
27
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
28
- restore-keys: |
29
- ${{ runner.os }}-build-${{ env.cache-name }}-
30
- ${{ runner.os }}-build-
31
- ${{ runner.os }}-
32
-
33
- - name: Install semantic-release dependencies
34
- if: steps.cache.outputs.cache-hit != 'true'
35
- run: npm ci
36
-
37
- # SEE MORE: https://github.com/semantic-release/semantic-release/issues/753
38
- - name: Run SemVer
39
- run: npm run release
40
- env:
41
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
42
- GEM_HOST_API_KEY: ${{ secrets.GEM_HOST_API_KEY }}
43
-
44
- # - name: Slack notify new version created
45
- # if: success()
46
- # uses: rtCamp/action-slack-notify@v2
47
- # env:
48
- # SLACK_CHANNEL: klueless-repos
49
- # SLACK_COLOR: '#00ff00'
50
- # SLACK_ICON: https://avatars.githubusercontent.com/u/2956762?s=64&v=4
51
- # SLACK_TITLE: 'New version released on ${{github.repository}}'
52
- # SLACK_MESSAGE: 'git pull'
53
- # SLACK_USERNAME: klueless-io
54
- # SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}