lex-codegen 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Codegen
8
+ module Runners
9
+ module Validate
10
+ extend self
11
+
12
+ REQUIRED_FILES = %w[
13
+ Gemfile
14
+ .rubocop.yml
15
+ spec/spec_helper.rb
16
+ ].freeze
17
+
18
+ REQUIRED_RUBOCOP_KEYS = %w[
19
+ AllCops
20
+ Layout/LineLength
21
+ Metrics/MethodLength
22
+ Style/FrozenStringLiteralComment
23
+ ].freeze
24
+
25
+ REQUIRED_GEMSPEC_FIELDS = %w[name version authors email summary description homepage license].freeze
26
+
27
+ def validate_structure(path:, **)
28
+ raise ArgumentError, 'Path must be a string' unless path.is_a?(String)
29
+
30
+ present = []
31
+ missing = []
32
+
33
+ REQUIRED_FILES.each do |rel|
34
+ full = ::File.join(path, rel)
35
+ if ::File.exist?(full)
36
+ present << rel
37
+ else
38
+ missing << rel
39
+ end
40
+ end
41
+
42
+ gemspec = ::Dir.glob(::File.join(path, '*.gemspec')).first
43
+ if gemspec
44
+ present << '*.gemspec'
45
+ else
46
+ missing << '*.gemspec'
47
+ end
48
+
49
+ entry = entry_point_path(path)
50
+ if entry && ::File.exist?(entry)
51
+ present << 'lib/legion/extensions/<name>.rb'
52
+ else
53
+ missing << 'lib/legion/extensions/<name>.rb'
54
+ end
55
+
56
+ version = version_path(path)
57
+ if version && ::File.exist?(version)
58
+ present << 'lib/legion/extensions/<name>/version.rb'
59
+ else
60
+ missing << 'lib/legion/extensions/<name>/version.rb'
61
+ end
62
+
63
+ { valid: missing.empty?, missing: missing, present: present }
64
+ rescue ArgumentError => e
65
+ { valid: false, missing: [], present: [], error: e.message }
66
+ end
67
+
68
+ def validate_rubocop_config(path:, **)
69
+ rubocop_path = ::File.join(path, '.rubocop.yml')
70
+ return { valid: false, issues: ['.rubocop.yml not found'] } unless ::File.exist?(rubocop_path)
71
+
72
+ config = YAML.safe_load_file(rubocop_path) || {}
73
+ issues = []
74
+
75
+ REQUIRED_RUBOCOP_KEYS.each do |key|
76
+ issues << "Missing key: #{key}" unless config.key?(key)
77
+ end
78
+
79
+ target = config.dig('AllCops', 'TargetRubyVersion')&.to_s
80
+ unless target == Helpers::Constants::DEFAULT_RUBY_VERSION
81
+ issues << "AllCops/TargetRubyVersion should be #{Helpers::Constants::DEFAULT_RUBY_VERSION}"
82
+ end
83
+
84
+ { valid: issues.empty?, issues: issues }
85
+ rescue ArgumentError => e
86
+ { valid: false, issues: [e.message] }
87
+ end
88
+
89
+ def validate_gemspec(path:, **)
90
+ gemspec_path = ::Dir.glob(::File.join(path, '*.gemspec')).first
91
+ return { valid: false, issues: ['No .gemspec file found'] } unless gemspec_path
92
+
93
+ content = ::File.read(gemspec_path)
94
+ issues = []
95
+
96
+ REQUIRED_GEMSPEC_FIELDS.each do |field|
97
+ issues << "Missing gemspec field: #{field}" unless content.include?(field)
98
+ end
99
+
100
+ issues << 'Missing rubygems_mfa_required metadata' unless content.include?('rubygems_mfa_required')
101
+ issues << 'Missing required_ruby_version' unless content.include?('required_ruby_version')
102
+
103
+ { valid: issues.empty?, issues: issues, path: gemspec_path }
104
+ rescue ArgumentError => e
105
+ { valid: false, issues: [e.message] }
106
+ end
107
+
108
+ private
109
+
110
+ def entry_point_path(path)
111
+ candidates = ::Dir.glob(::File.join(path, 'lib/legion/extensions/*.rb'))
112
+ candidates.reject { |f| f.include?('/extensions/') && f.split('/').last.include?('/') }.first
113
+ end
114
+
115
+ def version_path(path)
116
+ candidates = ::Dir.glob(::File.join(path, 'lib/legion/extensions/*/version.rb'))
117
+ candidates.first
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Codegen
6
+ VERSION = '0.1.1'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require_relative 'codegen/version'
5
+ require_relative 'codegen/helpers/constants'
6
+ require_relative 'codegen/helpers/template_engine'
7
+ require_relative 'codegen/helpers/spec_generator'
8
+ require_relative 'codegen/helpers/file_writer'
9
+ require_relative 'codegen/runners/generate'
10
+ require_relative 'codegen/runners/template'
11
+ require_relative 'codegen/runners/validate'
12
+ require_relative 'codegen/client'
13
+
14
+ module Legion
15
+ module Extensions
16
+ module Codegen
17
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
18
+ end
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-codegen
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Esity
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: erb
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rake
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rspec
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.13'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.13'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rspec_junit_formatter
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rubocop
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.75'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.75'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rubocop-rspec
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: simplecov
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: Code generation engine for LegionIO extensions
111
+ email:
112
+ - matthewdiverson@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - ".github/workflows/ci.yml"
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".rubocop.yml"
121
+ - CHANGELOG.md
122
+ - CLAUDE.md
123
+ - Gemfile
124
+ - LICENSE
125
+ - README.md
126
+ - lex-codegen.gemspec
127
+ - lib/legion/extensions/codegen.rb
128
+ - lib/legion/extensions/codegen/client.rb
129
+ - lib/legion/extensions/codegen/helpers/constants.rb
130
+ - lib/legion/extensions/codegen/helpers/file_writer.rb
131
+ - lib/legion/extensions/codegen/helpers/spec_generator.rb
132
+ - lib/legion/extensions/codegen/helpers/template_engine.rb
133
+ - lib/legion/extensions/codegen/runners/generate.rb
134
+ - lib/legion/extensions/codegen/runners/template.rb
135
+ - lib/legion/extensions/codegen/runners/validate.rb
136
+ - lib/legion/extensions/codegen/version.rb
137
+ homepage: https://github.com/LegionIO/lex-codegen
138
+ licenses:
139
+ - MIT
140
+ metadata:
141
+ homepage_uri: https://github.com/LegionIO/lex-codegen
142
+ source_code_uri: https://github.com/LegionIO/lex-codegen
143
+ changelog_uri: https://github.com/LegionIO/lex-codegen
144
+ documentation_uri: https://github.com/LegionIO/lex-codegen
145
+ bug_tracker_uri: https://github.com/LegionIO/lex-codegen/issues
146
+ rubygems_mfa_required: 'true'
147
+ rdoc_options: []
148
+ require_paths:
149
+ - lib
150
+ required_ruby_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '3.4'
155
+ required_rubygems_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ requirements: []
161
+ rubygems_version: 3.6.9
162
+ specification_version: 4
163
+ summary: Legion::Extensions::Codegen
164
+ test_files: []