k_director 0.6.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 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 }}