tailwind_dsl 0.0.28 → 0.0.30

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: ec90fa82ceee220d0a9cbe382e1a724dc8e3a616b6f2452174d60ef3eb6f12d6
4
- data.tar.gz: ef5f47eeedc68ba11d750bd9683b2ecdc311f2cc204541261b08d79c223e435c
3
+ metadata.gz: 3377172941fc6ad9c2db29fa772f5743714f73ac4b4ef69f911069cb00c4c9d8
4
+ data.tar.gz: e0204ff9d27587aedac8f33a84d1019eaffafdefb2a8793669d2cdf03f9ea9f8
5
5
  SHA512:
6
- metadata.gz: 1dd6c71477b385c209e06baa71348603f791d12a8af4246fead01dd1e33cc9e6cf10db17d066aeb54a95c745404e7223a3b986cad4d2e5be4f6cc28529d402d3
7
- data.tar.gz: efa06b0467b8d6bf5032b48ef1ef7091ce7b6c730a582060d56d9f55281a502810e9a82013a457bcca22f4da68106167f5ca9f1afd61abd44c85eb8e744be9d4
6
+ metadata.gz: cd678c918f7b5de5a6bc91c25988f12e0de6da89a5212aeb9f363ffcaa4b0b79fb21a937c7d2d9bf8b49ecc76d43c673b0f150eca91d0907b029b25a1ed1738e
7
+ data.tar.gz: a0e1be62691f5aff54e4326658048968eb222b9c8002348e37950961fecba68e4aa424daeb01fd7c4ae6d1ccbb0a92338638b124325596d4235addefece8ad9b
data/.builders/boot.rb CHANGED
@@ -6,7 +6,10 @@ CONFIG_KEY = :tailwind_dsl
6
6
 
7
7
  log.kv 'working folder', Dir.pwd
8
8
 
9
- require_relative '../lib/tailwind_dsl'
9
+ # require 'gpt3/builder'
10
+ # require '/Users/davidcruwys/.asdf/installs/ruby/2.7.6/lib/ruby/gems/2.7.0/gems/gpt3-builder-0.0.3/lib/gpt3/builder'
11
+
12
+ # require_relative '../lib/tailwind_dsl'
10
13
 
11
14
  KConfig.configure do |config|
12
15
  config.handlebars.defaults.add_all_defaults
@@ -1,3 +1,5 @@
1
+ require 'gpt3/builder'
2
+
1
3
  KManager.action :utilities do
2
4
  helpers = self
3
5
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [0.0.29](https://github.com/klueless-io/tailwind_dsl/compare/v0.0.28...v0.0.29) (2022-10-26)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * rename raw_component_query ([07b736e](https://github.com/klueless-io/tailwind_dsl/commit/07b736e1602f8be4507a4d1ec5da066c7673e797))
7
+
8
+ ## [0.0.28](https://github.com/klueless-io/tailwind_dsl/compare/v0.0.27...v0.0.28) (2022-10-24)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * remove sample specs from git hub actions ([2595490](https://github.com/klueless-io/tailwind_dsl/commit/2595490dc3e90d343c5e3e8f203ad4f71ba8dec4))
14
+
1
15
  ## [0.0.27](https://github.com/klueless-io/tailwind_dsl/compare/v0.0.26...v0.0.27) (2022-10-24)
2
16
 
3
17
 
@@ -0,0 +1,207 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This is Reusable across concerns, it should be in it's own folder or in the ETL root
4
+ # Rename to component_list or component_query
5
+
6
+ module TailwindDsl
7
+ module Etl
8
+ # Component Query will return a list of raw components that are available for processing
9
+ #
10
+ # The query requires a uikit to be passed in, this is used to flatten and filter the components
11
+ class ComponentQuery
12
+ DesignSystem = Struct.new(:name, :source_path, :target_path, keyword_init: true) do
13
+ def debug
14
+ puts format('%-30<key>s : %<value>s', key: 'Design system', value: name)
15
+ puts format('%-30<key>s : %<value>s', key: 'Source path', value: source_path)
16
+ puts format('%-30<key>s : %<value>s', key: 'Target path', value: target_path)
17
+ end
18
+ end
19
+
20
+ Group = Struct.new(:key, :type, :sub_keys, :folder, keyword_init: true) do
21
+ def debug
22
+ puts format('%-30<key>s : %<value>s', key: 'Group key', value: key)
23
+ puts format('%-30<key>s : %<value>s', key: 'Group type', value: type)
24
+ puts format('%-30<key>s : %<value>s', key: 'Group sub keys', value: sub_keys)
25
+ puts format('%-30<key>s : %<value>s', key: 'Group folder', value: folder)
26
+ end
27
+ end
28
+
29
+ FilePath = Struct.new(
30
+ :source_file,
31
+ :target_html_file,
32
+ :target_clean_html_file,
33
+ :target_tailwind_config_file,
34
+ :target_settings_file,
35
+ :target_data_file,
36
+ :target_model_file,
37
+ :target_astro_file,
38
+ keyword_init: true
39
+ ) do
40
+ # rubocop:disable Metrics/AbcSize
41
+ def debug
42
+ puts format('%-30<key>s : %<value>s', key: 'Source file', value: source_file)
43
+ puts format('%-30<key>s : %<value>s', key: 'Target html file', value: target_html_file)
44
+ puts format('%-30<key>s : %<value>s', key: 'Target clean html file', value: target_clean_html_file)
45
+ puts format('%-30<key>s : %<value>s', key: 'Target tailwind config file', value: target_tailwind_config_file)
46
+ puts format('%-30<key>s : %<value>s', key: 'Target settings file', value: target_settings_file)
47
+ puts format('%-30<key>s : %<value>s', key: 'Target data file', value: target_data_file)
48
+ puts format('%-30<key>s : %<value>s', key: 'Target model file', value: target_model_file)
49
+ puts format('%-30<key>s : %<value>s', key: 'Target astro file', value: target_astro_file)
50
+ end
51
+ # rubocop:enable Metrics/AbcSize
52
+ end
53
+
54
+ class Component
55
+ attr_reader :name
56
+ attr_reader :design_system
57
+ attr_reader :group
58
+ attr_reader :absolute
59
+ attr_reader :relative
60
+
61
+ # Storage buckets for data that is extracted from the source file
62
+ attr_accessor :captured_comment_text
63
+ attr_accessor :captured_comment_list
64
+ attr_accessor :captured_tailwind_config
65
+
66
+ def initialize(name:, design_system:, group:, absolute:, relative:)
67
+ @name = name
68
+ @design_system = design_system
69
+ @group = group
70
+ @absolute = absolute
71
+ @relative = relative
72
+ end
73
+
74
+ def to_h
75
+ {
76
+ name: name,
77
+ design_system: design_system.to_h,
78
+ group: group.to_h,
79
+ absolute: absolute.to_h,
80
+ relative: relative.to_h
81
+ }
82
+ end
83
+
84
+ def debug
85
+ puts format('%-30<key>s : %<value>s', key: 'Component', value: name)
86
+ design_system.debug
87
+ group.debug
88
+ puts ':: Absolute paths'
89
+ absolute.debug
90
+ puts '::Relative paths'
91
+ relative.debug
92
+ end
93
+ end
94
+
95
+ attr_reader :uikit
96
+ # Location for raw components
97
+ attr_reader :source_root_path
98
+ # Location for component structures
99
+ attr_reader :target_root_path
100
+ attr_reader :current_design_system
101
+ attr_reader :components
102
+
103
+ def initialize(uikit, **args)
104
+ @uikit = uikit
105
+ @source_root_path = args[:source_root_path] || raise(ArgumentError, 'Missing source_root_path')
106
+ @target_root_path = args[:target_root_path] || raise(ArgumentError, 'Missing target_root_path')
107
+ end
108
+
109
+ class << self
110
+ def query(uikit, source_root_path:, target_root_path:)
111
+ instance = new(uikit, source_root_path: source_root_path, target_root_path: target_root_path)
112
+ instance.call
113
+ end
114
+ end
115
+
116
+ def call
117
+ @components = build_components.sort_by { |component| [component.design_system.name, component.group.key, component.name] }
118
+
119
+ self
120
+ end
121
+
122
+ # Flattened list of components in hash format
123
+ # @return [Array<Hash>] list
124
+ def to_h
125
+ components.map(&:to_h)
126
+ end
127
+
128
+ private
129
+
130
+ # rubocop:disable Metrics/AbcSize
131
+ def build_components
132
+ uikit.design_systems.flat_map do |design_system|
133
+ @current_design_system = design_system
134
+ design_system.groups.flat_map do |group|
135
+ group.files.map do |file|
136
+ Component.new(
137
+ name: file.file_name_only,
138
+ design_system: DesignSystem.new(**map_design_system),
139
+ group: Group.new(**map_group(group)),
140
+ absolute: FilePath.new(**map_absolute_file(file)),
141
+ relative: FilePath.new(**map_relative_file(file))
142
+ )
143
+ end
144
+ end
145
+ end
146
+ end
147
+ # rubocop:enable Metrics/AbcSize
148
+
149
+ def design_system_name
150
+ current_design_system.name
151
+ end
152
+
153
+ def source_path
154
+ File.join(source_root_path, design_system_name)
155
+ end
156
+
157
+ def target_path
158
+ File.join(target_root_path, design_system_name)
159
+ end
160
+
161
+ def map_design_system
162
+ {
163
+ name: design_system_name,
164
+ source_path: source_path,
165
+ target_path: target_path
166
+ }
167
+ end
168
+
169
+ def map_group(group)
170
+ {
171
+ key: group.key,
172
+ type: group.type,
173
+ sub_keys: group.sub_keys,
174
+ folder: group.folder
175
+ }
176
+ end
177
+
178
+ def map_relative_file(file)
179
+ {
180
+ source_file: file.file,
181
+ target_html_file: file.target.html_file,
182
+ target_clean_html_file: file.target.clean_html_file,
183
+ target_tailwind_config_file: file.target.tailwind_config_file,
184
+ target_settings_file: file.target.settings_file,
185
+ target_data_file: file.target.data_file,
186
+ target_model_file: file.target.model_file,
187
+ target_astro_file: file.target.astro_file
188
+ }
189
+ end
190
+
191
+ # rubocop:disable Metrics/AbcSize
192
+ def map_absolute_file(file)
193
+ {
194
+ source_file: File.join(source_path, file.file),
195
+ target_html_file: File.join(target_path, file.target.html_file),
196
+ target_clean_html_file: File.join(target_path, file.target.clean_html_file),
197
+ target_tailwind_config_file: File.join(target_path, file.target.tailwind_config_file),
198
+ target_settings_file: File.join(target_path, file.target.settings_file),
199
+ target_data_file: File.join(target_path, file.target.data_file),
200
+ target_model_file: File.join(target_path, file.target.model_file),
201
+ target_astro_file: File.join(target_path, file.target.astro_file)
202
+ }
203
+ end
204
+ # rubocop:enable Metrics/AbcSize
205
+ end
206
+ end
207
+ end
@@ -54,10 +54,10 @@ module TailwindDsl
54
54
  end
55
55
 
56
56
  def query_components
57
- RawComponentQuery.query(uikit,
58
- source_root_path: source_root_path,
59
- target_root_path: target_root_path)
60
- .components
57
+ ComponentQuery.query(uikit,
58
+ source_root_path: source_root_path,
59
+ target_root_path: target_root_path)
60
+ .components
61
61
  end
62
62
 
63
63
  def process_components
@@ -9,8 +9,7 @@ module TailwindDsl
9
9
  attr_reader :components
10
10
  attr_reader :target_root_path
11
11
  attr_reader :batch_size
12
- attr_reader :use_prompt
13
- attr_reader :filter_design_system # this should be renamed and reshaped to a complex filter object
12
+ attr_reader :filter
14
13
 
15
14
  # Create comment for this initialize method
16
15
 
@@ -18,56 +17,38 @@ module TailwindDsl
18
17
  # @param [String] target_root_path root directory where the extracted data will be written to, this is the root path for all design systems and groups
19
18
  # @param [Hash] args
20
19
  # @option args [Integer] :batch_size number of components to process, default is 1
21
- # @option args [Boolean] :use_prompt console based prompt so the user can guide the extractor, default is false
22
- # @option args [String] :filter_design_system name of the design system to filter on, default is nil meaning all
20
+ # @option args [Hash] :filter filter components before processing
21
+ # design_system: name of the design system to filter on, default is nil meaning all
23
22
  # @option args [Class] :extract_handler class that implements an extract method
24
23
  def initialize(components, target_root_path, **args)
25
24
  @components = components
26
25
  @target_root_path = target_root_path
27
26
  @batch_size = args[:batch_size] || 1
28
- @use_prompt = args[:use_prompt] || false
29
- @filter_design_system = args[:filter_design_system] || nil
27
+ @filter = args[:filter] || nil
30
28
  @extract_handler = args[:extract_handler]
31
29
  end
32
30
 
33
- # Goal: Extract the next (batch_size) component models using GPT3 and save them to target_root_path
34
- # Create a data file at: design_system.name -> group-hierarchy -> component-name.data.json
35
- # Create a model file at: design_system.name -> group-hierarchy -> component-name.model.rb
36
-
37
- # Process: Collect all components and optionally filter them by design system name.
38
- # Also filter by other keys (to be determined)
39
- # Only process files that have not been processed before.
40
- # Look for the next component to be processed, if it does not exist in the target folder then process it.
41
- # decrement the batch_left counter and continue until batch_left is 0.
42
- # if :use_prompt is true then display the input/output files and ask if you wish to process the component or skip.
43
- # process the component by calling the GPT3 API and save the results to the target folder.
44
-
31
+ # rubocop:disable Metrics/AbcSize
45
32
  def extract
46
33
  raise "Batch size must be greater than 0, got: #{batch_size}" if batch_size <= 0
47
34
 
48
35
  remaining = batch_size
49
36
 
50
37
  filter_components.each do |component|
51
- # puts "Processing: #{component.design_system.name} -> #{component.group.key} -> #{component.name} -> remaining#: #{remaining}"
52
-
53
38
  component_guard(component)
39
+
54
40
  extractor.component = component
55
41
 
56
42
  next if File.exist?(extractor.target_file)
57
43
 
58
- # if use_prompt
59
- # puts "Input: #{component.cleansed_html_path}"
60
- # puts "Output: #{component_model_path}"
61
- # puts 'Process? (y/n)'
62
- # next unless STDIN.gets.chomp == 'y'
63
- # end
64
-
44
+ component.debug
65
45
  extractor.extract
66
46
 
67
47
  remaining -= 1
68
48
  break if remaining.zero?
69
49
  end
70
50
  end
51
+ # rubocop:enable Metrics/AbcSize
71
52
 
72
53
  def extractor
73
54
  return @extractor if defined? @extractor
@@ -89,15 +70,19 @@ module TailwindDsl
89
70
  raise "Folder does not exist: '#{path}', make sure you run component structure generator first." unless File.exist?(path)
90
71
  end
91
72
 
73
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
92
74
  def filter_components
93
- return components unless filter_design_system
94
-
95
- components.select { |component| component.design_system.name == filter_design_system }
75
+ return components unless filter
76
+
77
+ result = components
78
+ # inclusions
79
+ result = result.select { |component| component.design_system.name == filter[:design_system] } if filter[:design_system]
80
+ result = result.select { |component| component.group.key == filter[:group_key] } if filter[:group_key]
81
+ # exclusions
82
+ result = result.reject { |component| component.group.key == filter[:exclude_group_key] } if filter[:exclude_group_key]
83
+ result
96
84
  end
97
-
98
- # def target_file(component)
99
- # raise NotImplementedError, 'target_file is not implemented'
100
- # end
85
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
101
86
  end
102
87
  end
103
88
  end
@@ -11,12 +11,27 @@ module TailwindDsl
11
11
  component.absolute.target_data_file
12
12
  end
13
13
 
14
+ # rubocop:disable Metrics/AbcSize
14
15
  def extract
15
- puts 'do some magic and write to target_file'
16
- puts "target_file: #{target_file}"
17
- File.write(target_file, 'GTP3 data')
18
- # do some GPT3 magic
16
+ builder = Gpt3::Builder::Gpt3Builder.init
17
+
18
+ tokens = 250
19
+
20
+ source_file = component.absolute.target_clean_html_file
21
+ source = File.read(source_file)
22
+
23
+ target_file = component.absolute.target_data_file
24
+ component_type = component.group.sub_keys.last
25
+
26
+ builder
27
+ .start("Extract JSON data from '#{component_type}' HTML component")
28
+ .message('HTML:')
29
+ .example(source)
30
+ .message('JSON:')
31
+ .complete(engine: 'code-davinci-002', max_tokens: tokens, suffix: "\n")
32
+ .write_result(target_file)
19
33
  end
34
+ # rubocop:enable Metrics/AbcSize
20
35
  end
21
36
  end
22
37
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TailwindDsl
4
- VERSION = '0.0.28'
4
+ VERSION = '0.0.30'
5
5
  end
data/lib/tailwind_dsl.rb CHANGED
@@ -1,10 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'cmdlet'
4
+ require 'gpt3/builder'
4
5
 
5
6
  require_relative 'tailwind_dsl/version'
6
7
  # require_relative '_'
7
8
 
9
+ require_relative 'tailwind_dsl/etl/component_query'
10
+
8
11
  require_relative 'tailwind_dsl/etl/raw_components/load'
9
12
  require_relative 'tailwind_dsl/etl/raw_components/transformer'
10
13
 
@@ -15,7 +18,6 @@ require_relative 'tailwind_dsl/etl/raw_components/schema/group'
15
18
  require_relative 'tailwind_dsl/etl/raw_components/schema/design_system'
16
19
  require_relative 'tailwind_dsl/etl/raw_components/schema/uikit'
17
20
 
18
- require_relative 'tailwind_dsl/etl/component_structures/raw_component_query'
19
21
  require_relative 'tailwind_dsl/etl/component_structures/generator'
20
22
 
21
23
  require_relative 'tailwind_dsl/etl/extractors/base_extractor'
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "tailwind_dsl",
3
- "version": "0.0.28",
3
+ "version": "0.0.30",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "tailwind_dsl",
9
- "version": "0.0.28",
9
+ "version": "0.0.30",
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": "tailwind_dsl",
3
- "version": "0.0.28",
3
+ "version": "0.0.30",
4
4
  "description": "Tailwind DSL will build tailwind websites useing Domain Specific Language conventions",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tailwind_dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.28
4
+ version: 0.0.30
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-10-24 00:00:00.000000000 Z
11
+ date: 2022-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cmdlet
@@ -2174,8 +2174,8 @@ files:
2174
2174
  - lib/_.rb
2175
2175
  - lib/tailwind_dsl.rb
2176
2176
  - lib/tailwind_dsl/astro_demo/generate_astro_page_data.rb
2177
+ - lib/tailwind_dsl/etl/component_query.rb
2177
2178
  - lib/tailwind_dsl/etl/component_structures/generator.rb
2178
- - lib/tailwind_dsl/etl/component_structures/raw_component_query.rb
2179
2179
  - lib/tailwind_dsl/etl/element.rb
2180
2180
  - lib/tailwind_dsl/etl/extractors/base_extractor.rb
2181
2181
  - lib/tailwind_dsl/etl/extractors/batch_extraction.rb
@@ -1,215 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # This is Reusable across concerns, it should be in it's own folder or in the ETL root
4
- # Rename to component_list or component_query
5
-
6
- module TailwindDsl
7
- module Etl
8
- module ComponentStructures
9
- # Raw Component Query will return a list of raw components that are available for processing
10
- #
11
- # This is a two pass process:
12
- # 1. Query the raw component folder for all files that match the pattern and build up a graph with required information
13
-
14
- # puts '%-20s %s' % ['name', name]
15
- # puts '%-20s %s' % ['source_path', source_path]
16
- # puts '%-20s %s' % ['target_path', target_path]
17
- # 2. Flatten the graph into a list of rows
18
- class RawComponentQuery
19
- DesignSystem = Struct.new(:name, :source_path, :target_path, keyword_init: true) do
20
- def debug
21
- puts format('%-30<key>s : %<value>s', key: 'Design system', value: name)
22
- puts format('%-30<key>s : %<value>s', key: 'Source path', value: source_path)
23
- puts format('%-30<key>s : %<value>s', key: 'Target path', value: target_path)
24
- end
25
- end
26
-
27
- Group = Struct.new(:key, :type, :sub_keys, :folder, keyword_init: true) do
28
- def debug
29
- puts format('%-30<key>s : %<value>s', key: 'Group key', value: key)
30
- puts format('%-30<key>s : %<value>s', key: 'Group type', value: type)
31
- puts format('%-30<key>s : %<value>s', key: 'Group sub keys', value: sub_keys)
32
- puts format('%-30<key>s : %<value>s', key: 'Group folder', value: folder)
33
- end
34
- end
35
-
36
- FilePath = Struct.new(
37
- :source_file,
38
- :target_html_file,
39
- :target_clean_html_file,
40
- :target_tailwind_config_file,
41
- :target_settings_file,
42
- :target_data_file,
43
- :target_model_file,
44
- :target_astro_file,
45
- keyword_init: true
46
- ) do
47
- # rubocop:disable Metrics/AbcSize
48
- def debug
49
- puts format('%-30<key>s : %<value>s', key: 'Source file', value: source_file)
50
- puts format('%-30<key>s : %<value>s', key: 'Target html file', value: target_html_file)
51
- puts format('%-30<key>s : %<value>s', key: 'Target clean html file', value: target_clean_html_file)
52
- puts format('%-30<key>s : %<value>s', key: 'Target tailwind config file', value: target_tailwind_config_file)
53
- puts format('%-30<key>s : %<value>s', key: 'Target settings file', value: target_settings_file)
54
- puts format('%-30<key>s : %<value>s', key: 'Target data file', value: target_data_file)
55
- puts format('%-30<key>s : %<value>s', key: 'Target model file', value: target_model_file)
56
- puts format('%-30<key>s : %<value>s', key: 'Target astro file', value: target_astro_file)
57
- end
58
- # rubocop:enable Metrics/AbcSize
59
- end
60
-
61
- class Component
62
- attr_reader :name
63
- attr_reader :design_system
64
- attr_reader :group
65
- attr_reader :absolute
66
- attr_reader :relative
67
-
68
- # Storage buckets for data that is extracted from the source file
69
- attr_accessor :captured_comment_text
70
- attr_accessor :captured_comment_list
71
- attr_accessor :captured_tailwind_config
72
-
73
- def initialize(name:, design_system:, group:, absolute:, relative:)
74
- @name = name
75
- @design_system = design_system
76
- @group = group
77
- @absolute = absolute
78
- @relative = relative
79
- end
80
-
81
- def to_h
82
- {
83
- name: name,
84
- design_system: design_system.to_h,
85
- group: group.to_h,
86
- absolute: absolute.to_h,
87
- relative: relative.to_h
88
- }
89
- end
90
-
91
- def debug
92
- puts format('%-30<key>s : %<value>s', key: 'Component', value: name)
93
- design_system.debug
94
- group.debug
95
- puts ':: Absolute paths'
96
- absolute.debug
97
- puts '::Relative paths'
98
- relative.debug
99
- end
100
- end
101
-
102
- attr_reader :uikit
103
- # Location for raw components
104
- attr_reader :source_root_path
105
- # Location for component structures
106
- attr_reader :target_root_path
107
- attr_reader :current_design_system
108
- attr_reader :components
109
-
110
- def initialize(uikit, **args)
111
- @uikit = uikit
112
- @source_root_path = args[:source_root_path] || raise(ArgumentError, 'Missing source_root_path')
113
- @target_root_path = args[:target_root_path] || raise(ArgumentError, 'Missing target_root_path')
114
- end
115
-
116
- class << self
117
- def query(uikit, source_root_path:, target_root_path:)
118
- instance = new(uikit, source_root_path: source_root_path, target_root_path: target_root_path)
119
- instance.call
120
- end
121
- end
122
-
123
- def call
124
- @components = build_components.sort_by { |component| [component.design_system.name, component.group.key, component.name] }
125
-
126
- self
127
- end
128
-
129
- # Flattened list of components in hash format
130
- # @return [Array<Hash>] list
131
- def to_h
132
- components.map(&:to_h)
133
- end
134
-
135
- private
136
-
137
- # rubocop:disable Metrics/AbcSize
138
- def build_components
139
- uikit.design_systems.flat_map do |design_system|
140
- @current_design_system = design_system
141
- design_system.groups.flat_map do |group|
142
- group.files.map do |file|
143
- Component.new(
144
- name: file.file_name_only,
145
- design_system: DesignSystem.new(**map_design_system),
146
- group: Group.new(**map_group(group)),
147
- absolute: FilePath.new(**map_absolute_file(file)),
148
- relative: FilePath.new(**map_relative_file(file))
149
- )
150
- end
151
- end
152
- end
153
- end
154
- # rubocop:enable Metrics/AbcSize
155
-
156
- def design_system_name
157
- current_design_system.name
158
- end
159
-
160
- def source_path
161
- File.join(source_root_path, design_system_name)
162
- end
163
-
164
- def target_path
165
- File.join(target_root_path, design_system_name)
166
- end
167
-
168
- def map_design_system
169
- {
170
- name: design_system_name,
171
- source_path: source_path,
172
- target_path: target_path
173
- }
174
- end
175
-
176
- def map_group(group)
177
- {
178
- key: group.key,
179
- type: group.type,
180
- sub_keys: group.sub_keys,
181
- folder: group.folder
182
- }
183
- end
184
-
185
- def map_relative_file(file)
186
- {
187
- source_file: file.file,
188
- target_html_file: file.target.html_file,
189
- target_clean_html_file: file.target.clean_html_file,
190
- target_tailwind_config_file: file.target.tailwind_config_file,
191
- target_settings_file: file.target.settings_file,
192
- target_data_file: file.target.data_file,
193
- target_model_file: file.target.model_file,
194
- target_astro_file: file.target.astro_file
195
- }
196
- end
197
-
198
- # rubocop:disable Metrics/AbcSize
199
- def map_absolute_file(file)
200
- {
201
- source_file: File.join(source_path, file.file),
202
- target_html_file: File.join(target_path, file.target.html_file),
203
- target_clean_html_file: File.join(target_path, file.target.clean_html_file),
204
- target_tailwind_config_file: File.join(target_path, file.target.tailwind_config_file),
205
- target_settings_file: File.join(target_path, file.target.settings_file),
206
- target_data_file: File.join(target_path, file.target.data_file),
207
- target_model_file: File.join(target_path, file.target.model_file),
208
- target_astro_file: File.join(target_path, file.target.astro_file)
209
- }
210
- end
211
- # rubocop:enable Metrics/AbcSize
212
- end
213
- end
214
- end
215
- end