k_director 0.6.1 → 0.7.2

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: 97d6905104f3f742383cd45344b303269a1d5ee6c2054d107c5b0be97c0406f9
4
- data.tar.gz: 60ad2bfd8f1dcc5693dcda4e46a307174143c4231825df818c523c41d4dfb08a
3
+ metadata.gz: 01c2703862b9bf79b4c341909d33799f83fc4b3db8a486f709061e8dcda1f795
4
+ data.tar.gz: '063359b7c3717c8c8512db963bae8ebd23e4339799a477893bd90964342b7800'
5
5
  SHA512:
6
- metadata.gz: 8db80227990301c8485f8d4ee1f95efc4275f2cf3dc648c3abb0899f3b7da2b260dc6ec2791d9f4b5be03261dc08987f9a33cf3576e184527278418eef59e104
7
- data.tar.gz: aa7df6cadc8a21e0a50d7998fc35596a24190e6cbd8045b2d7080b2352a7de97007afdfef7b55d9615c24317d9c03b6464f705b1f632c2f9b3e0af859ce3f366
6
+ metadata.gz: 58555b963f3cd67d9dc1097dacdbeabadeda3f9f258a769cd9bdfa623a5c2c5bf71fb37d28f6c33b4a2baae0ceff86b9f0f838e34624e81da2e6bfcd9efc9135
7
+ data.tar.gz: 5baf583a108004162cb990eb022f660d23bf260f7b0b6aa45c56fb102ed5f6cf1f9e72f489ae5f52560af03d0d37c56d3cf2fd8d0d71168f344df0d46c73878c
@@ -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,51 @@
1
+ ## [0.7.1](https://github.com/klueless-io/k_director/compare/v0.7.0...v0.7.1) (2022-02-03)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add support for github and blueprint to nuxt3 ([335befb](https://github.com/klueless-io/k_director/commit/335befbc427e156f9fe52407641fe720e22b2bb3))
7
+
8
+ # [0.7.0](https://github.com/klueless-io/k_director/compare/v0.6.2...v0.7.0) (2022-02-03)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * apply cops ([3ed749b](https://github.com/klueless-io/k_director/commit/3ed749b504264f93dfcfbc7c57fb10e91c1aca36))
14
+
15
+
16
+ ### Features
17
+
18
+ * add github dsll support and scenario tests ([ce9b0c8](https://github.com/klueless-io/k_director/commit/ce9b0c8ad6df9dc1154074e9e23c5310919bd112))
19
+
20
+ ## [0.6.2](https://github.com/klueless-io/k_director/compare/v0.6.1...v0.6.2) (2022-02-01)
21
+
22
+
23
+ ### Bug Fixes
24
+
25
+ * merge main and semver gha workflows ([5c3a9e4](https://github.com/klueless-io/k_director/commit/5c3a9e4a6f01129cc513760b86453a4201835765))
26
+ * merge main and semver gha workflows - final ([0c5eb76](https://github.com/klueless-io/k_director/commit/0c5eb76d8008d5ec869fdb9c9adcc306e6a51604))
27
+ * 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))
28
+ * 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))
29
+ * 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))
30
+ * 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))
31
+ * 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))
32
+ * 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))
33
+ * 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))
34
+ * 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))
35
+ * 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))
36
+ * 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))
37
+ * 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))
38
+ * 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))
39
+ * 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))
40
+ * 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))
41
+
42
+ ## [0.6.1](https://github.com/klueless-io/k_director/compare/v0.6.0...v0.6.1) (2022-01-31)
43
+
44
+
45
+ ### Bug Fixes
46
+
47
+ * add data to base (plus settings) to director ([bee18a1](https://github.com/klueless-io/k_director/commit/bee18a1eda36d802611c5cf354031963daa82c69))
48
+
1
49
  # [0.6.0](https://github.com/klueless-io/k_director/compare/v0.5.0...v0.6.0) (2022-01-31)
2
50
 
3
51
 
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
@@ -82,7 +82,7 @@ module KDirector
82
82
 
83
83
  def debug
84
84
  puts JSON.pretty_generate(actions)
85
- # puts JSON.pretty_generate(dom)
85
+ puts JSON.pretty_generate(dom)
86
86
  # log.structure(dom)
87
87
 
88
88
  self
@@ -124,6 +124,11 @@ module KDirector
124
124
  end
125
125
 
126
126
  def debug
127
+ debug_options
128
+ debug_dom
129
+ end
130
+
131
+ def debug_options
127
132
  log.section_heading director_name
128
133
 
129
134
  h = options.to_h.sort.to_h
@@ -131,6 +136,15 @@ module KDirector
131
136
  # requires k_funky
132
137
  log.kv(titleize.parse(key.to_s), h[key])
133
138
  end
139
+
140
+ nil
141
+ end
142
+
143
+ def debug_dom
144
+ log.section_heading 'DOM'
145
+
146
+ builder.debug
147
+
134
148
  nil
135
149
  end
136
150
 
@@ -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,281 @@
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 = KDirector::Dsls::Children::Github.new(self, **opts)
13
+ github.instance_eval(&block)
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)
21
+
22
+ self
23
+ end
24
+
25
+ # def app(**opts, &block)
26
+ # app = Dsl::Nuxt3App.new(self, **opts)
27
+ # app.instance_eval(&block)
28
+
29
+ # self
30
+ # end
31
+
32
+ # def layouts(**opts, &block)
33
+ # layouts = Dsl::Nuxt3Layout.new(self, **opts)
34
+ # layouts.instance_eval(&block)
35
+
36
+ # self
37
+ # end
38
+
39
+ # def pages(**opts, &block)
40
+ # pages = Dsl::Nuxt3Page.new(self, **opts)
41
+ # pages.instance_eval(&block)
42
+
43
+ # self
44
+ # end
45
+
46
+ # def components(**opts, &block)
47
+ # components = Dsl::Nuxt3Component.new(self, **opts)
48
+ # components.instance_eval(&block)
49
+
50
+ # self
51
+ # end
52
+
53
+ # def stories(**opts, &block)
54
+ # stories = Dsl::Nuxt3Story.new(self, **opts)
55
+ # stories.instance_eval(&block)
56
+
57
+ # self
58
+ # end
59
+
60
+ # def apis(**opts, &block)
61
+ # apis = Dsl::Nuxt3Api.new(self, **opts)
62
+ # apis.instance_eval(&block)
63
+
64
+ # self
65
+ # end
66
+ end
67
+
68
+ # class Nuxt3App < KDirector::Directors::ChildDirector
69
+
70
+ # def setup_tailwind
71
+ # run_command('yarn add -D tailwindcss@latest')
72
+ # run_command('yarn add -D postcss@^8.3.11') # @latest
73
+ # run_command('yarn add -D autoprefixer@latest')
74
+ # run_command('npx tailwindcss init -p')
75
+ # end
76
+
77
+ # def setup_storybook
78
+ # run_command('yarn add -D @storybook/vue3')
79
+ # run_command('yarn add -D @storybook/addon-docs')
80
+ # run_command('yarn add -D @storybook/addon-essentials')
81
+ # run_command('yarn add -D @storybook/addon-storysource')
82
+ # run_command('yarn add -D @storybook/addon-postcss')
83
+ # run_command('yarn add -D storybook-builder-vite')
84
+ # end
85
+ # # >> "postcss": "^8.4.5", // Post CSS 8.4.5 does not work with storybook
86
+ # end
87
+
88
+ # class Nuxt3Layout < KDirector::Directors::ChildDirector
89
+ # # @param [Hash] **opts The options
90
+ # # @option opts [String] :variant Template variant name
91
+ # # @option opts [String] :template_subfolder Template subfolder
92
+ # def layout(name, **opts)
93
+ # variant = opts[:variant] || name
94
+ # template_filename = "#{dasherize.parse(variant.to_s)}.vue"
95
+ # template_file = resolve_template_file("nuxt3/layouts", template_filename, **opts)
96
+ # output_filename = "#{dasherize.parse(name.to_s)}.vue"
97
+ # output_file = File.join('layouts', output_filename)
98
+
99
+ # opts = {
100
+ # template_file: template_file
101
+ # }.merge(opts)
102
+
103
+ # add_file(output_file, **opts)
104
+ # end
105
+
106
+ # def olayout(name, **opts); layout(name, **{ open: true }.merge(opts)); end
107
+ # def tlayout(name, **opts); layout(name, **{ open_template: true }.merge(opts)); end
108
+ # def flayout(name, **opts); layout(name, **{ on_exist: :write }.merge(opts)); end
109
+
110
+ # def sample_layout(name, **opts)
111
+ # layout(name, template_subfolder: 'samples', **opts)
112
+ # end
113
+
114
+ # def osample_layout(name, **opts); sample_layout(name, **{ open: true }.merge(opts)); end
115
+ # def tsample_layout(name, **opts); sample_layout(name, **{ open_template: true }.merge(opts)); end
116
+ # def fsample_layout(name, **opts); sample_layout(name, **{ on_exist: :write }.merge(opts)); end
117
+
118
+ # end
119
+
120
+ # class Nuxt3Page < KDirector::Directors::ChildDirector
121
+ # # @param [Hash] **opts The options
122
+ # # @option opts [String] :subfolder Output subfolder
123
+ # # @option opts [String] :variant Template variant name
124
+ # # @option opts [String] :template_subfolder Template subfolder
125
+ # def page(name, **opts)
126
+ # variant = opts[:variant] || name
127
+ # template_filename = "#{dasherize.parse(variant.to_s)}.vue"
128
+ # template_file = resolve_template_file("nuxt3/pages", template_filename, **opts)
129
+ # output_filename = "#{dasherize.parse(name.to_s)}.vue"
130
+ # parts = ['pages', opts[:subfolder], output_filename].reject(&:blank?).map(&:to_s)
131
+ # output_file = File.join(*parts)
132
+
133
+ # opts = {
134
+ # template_file: template_file,
135
+ # dom: {
136
+ # page_name: opts[:page_name] || name,
137
+ # main_key: opts[:main_key] || :sample
138
+ # }
139
+ # }.merge(opts)
140
+
141
+ # add_file(output_file, **opts)
142
+ # end
143
+ # def opage(name, **opts); page(name, **{ open: true }.merge(opts)); end
144
+ # def tpage(name, **opts); page(name, **{ open_template: true }.merge(opts)); end
145
+ # def fpage(name, **opts); page(name, **{ on_exist: :write }.merge(opts)); end
146
+
147
+ # def sample_page(name, **opts)
148
+ # page(name, template_subfolder: 'samples', **opts)
149
+ # end
150
+
151
+ # def osample_page(name, **opts); sample_page(name, **{ open: true }.merge(opts)); end
152
+ # def tsample_page(name, **opts); sample_page(name, **{ open_template: true }.merge(opts)); end
153
+ # def fsample_page(name, **opts); sample_page(name, **{ on_exist: :write }.merge(opts)); end
154
+
155
+ # def tw_page(name, element, element_name, **opts)
156
+ # options = {
157
+ # subfolder: "tailwind/#{element}",
158
+ # variant: 'one-component',
159
+ # dom: {
160
+ # page_name: "#{opts[:page_name] || name}",
161
+ # vue_component: "<#{camel.parse(element.to_s)}#{camel.parse(element_name.to_s)} />"
162
+ # }
163
+ # }.merge(opts)
164
+
165
+ # page(name, **options)
166
+ # end
167
+ # end
168
+
169
+ # class Nuxt3Component < KDirector::Directors::ChildDirector
170
+ # # @param [Hash] **opts The options
171
+ # # @option opts [String] :variant Template variant name
172
+ # # @option opts [String] :template_subfolder Template subfolder
173
+ # def component(name, **opts)
174
+ # variant = opts[:variant] || name
175
+ # template_filename = "#{camel.parse(variant.to_s)}.vue"
176
+ # template_file = resolve_template_file("nuxt3/components", template_filename, **opts)
177
+ # output_filename = "#{camel.parse(name.to_s)}.vue"
178
+ # parts = ['components', opts[:subfolder], output_filename].reject(&:blank?).map(&:to_s)
179
+ # output_file = File.join(*parts)
180
+
181
+ # opts = {
182
+ # template_file: template_file,
183
+ # dom: {
184
+ # component_name: opts[:component_name] || name
185
+ # }
186
+ # }.merge(opts)
187
+
188
+ # add_file(output_file, **opts)
189
+ # end
190
+ # def ocomponent(name, **opts); component(name, **{ open: true }.merge(opts)); end
191
+ # def tcomponent(name, **opts); component(name, **{ open_template: true }.merge(opts)); end
192
+ # def fcomponent(name, **opts); component(name, **{ on_exist: :write }.merge(opts)); end
193
+
194
+ # def sample_component(name, **opts)
195
+ # component(name, template_subfolder: 'samples', **opts)
196
+ # end
197
+
198
+ # def osample_component(name, **opts); sample_component(name, **{ open: true }.merge(opts)); end
199
+ # def tsample_component(name, **opts); sample_component(name, **{ open_template: true }.merge(opts)); end
200
+ # def fsample_component(name, **opts); sample_component(name, **{ on_exist: :write }.merge(opts)); end
201
+
202
+ # def tw_component(name, element, element_name, **opts)
203
+ # tw_element_file = k_builder.target_file(element.to_s, "#{element_name}.html", folder_key: :tailwind_elements)
204
+ # tw_element = File.exist?(tw_element_file) ? File.read(tw_element_file) : "element not found: #{tw_element_file}"
205
+
206
+ # options = {
207
+ # subfolder: element,
208
+ # variant: :tw_html_component,
209
+ # dom: {
210
+ # component_name: "#{opts[:component_name] || name}",
211
+ # tailwind_element: tw_element
212
+ # }
213
+ # }.merge(opts)
214
+
215
+ # component(name, **options)
216
+ # end
217
+ # end
218
+
219
+ # class Nuxt3Story < KDirector::Directors::ChildDirector
220
+ # # @param [Hash] **opts The options
221
+ # # @option opts [String] :variant Template variant name
222
+ # # @option opts [String] :template_subfolder Template subfolder
223
+ # def component_story(name, **opts)
224
+ # variant = opts[:variant] || name
225
+ # template_filename = "#{variant.to_s}.stories.js"
226
+ # template_file = resolve_template_file("nuxt3/stories", template_filename, **opts)
227
+ # output_filename = "#{camel.parse(name.to_s)}.stories.js"
228
+ # output_file = File.join('stories', output_filename)
229
+
230
+ # opts = {
231
+ # template_file: template_file,
232
+ # }.merge(opts)
233
+
234
+ # add_file(output_file, **opts)
235
+ # end
236
+
237
+ # def ocomponent_story(name, **opts); component_story(name, **{ open: true }.merge(opts)); end
238
+ # def tcomponent_story(name, **opts); component_story(name, **{ open_template: true }.merge(opts)); end
239
+ # def fcomponent_story(name, **opts); component_story(name, **{ on_exist: :write }.merge(opts)); end
240
+
241
+ # def sample_component_story(name, **opts)
242
+ # component_story(name, template_subfolder: 'samples', **opts)
243
+ # end
244
+
245
+ # def osample_component_story(name, **opts); component_story(name, **{ open: true }.merge(opts)); end
246
+ # def tsample_component_story(name, **opts); component_story(name, **{ open_template: true }.merge(opts)); end
247
+ # def fsample_component_story(name, **opts); component_story(name, **{ on_exist: :write }.merge(opts)); end
248
+ # end
249
+
250
+ # class Nuxt3Api < KDirector::Directors::ChildDirector
251
+ # # @param [Hash] **opts The options
252
+ # # @option opts [String] :variant Template variant name
253
+ # # @option opts [String] :template_subfolder Template subfolder
254
+ # def api(name, **opts)
255
+ # variant = opts[:variant] || name
256
+ # template_filename = "#{dasherize.parse(variant.to_s)}.ts"
257
+ # template_file = resolve_template_file("nuxt3/server/api", template_filename, **opts)
258
+ # output_filename = "#{dasherize.parse(name.to_s)}.ts"
259
+ # output_file = File.join('server/api', output_filename)
260
+
261
+ # opts = {
262
+ # template_file: template_file,
263
+ # }.merge(opts)
264
+
265
+ # add_file(output_file, **opts)
266
+ # end
267
+
268
+ # def oapi(name, **opts); api(name, **{ open: true }.merge(opts)); end
269
+ # def tapi(name, **opts); api(name, **{ open_template: true }.merge(opts)); end
270
+ # def fapi(name, **opts); api(name, **{ on_exist: :write }.merge(opts)); end
271
+
272
+ # def sample_api(name, **opts)
273
+ # api(name, template_subfolder: 'samples', **opts)
274
+ # end
275
+
276
+ # def osample_api(name, **opts); sample_api(name, **{ open: true }.merge(opts)); end
277
+ # def tsample_api(name, **opts); sample_api(name, **{ open_template: true }.merge(opts)); end
278
+ # def fsample_api(name, **opts); sample_api(name, **{ on_exist: :write }.merge(opts)); end
279
+ # end
280
+ end
281
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KDirector
4
- VERSION = '0.6.1'
4
+ VERSION = '0.7.2'
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.1",
3
+ "version": "0.7.2",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "k_director",
9
- "version": "0.6.1",
9
+ "version": "0.7.2",
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.1",
3
+ "version": "0.7.2",
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.1
4
+ version: 0.7.2
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 }}