algo_scaffold 0.1.0
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 +7 -0
- data/bin/algo_scaffold +5 -0
- data/lib/algo_scaffold/cli.rb +53 -0
- data/lib/algo_scaffold/generator.rb +90 -0
- data/lib/algo_scaffold.rb +6 -0
- metadata +80 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ac38dfbee85131564ad37b5642a8705eee27cda2e4e6b9f780f0bc1b20c42df9
|
4
|
+
data.tar.gz: 4ab3fb9bfe399c547aaa5b6cbf0f155e48d3c2727d13fc6c249cf8c2afddbbb6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ecd51b3a64f702754241b57080670b1d3c1dd3e5f28ba0f9be66c58189bf91bab5cf57c5ee9f0d5bf7789514616a29b749958869d5d89d460e3576e57b3cb513
|
7
|
+
data.tar.gz: 9f2266390ccbe26b876ed82dde49e68b79fd1542b237d5a9b62bf208c89fddca41be111f6ef8aef9e392274cf7b00662b2c9db6a4f42159d6f1c8ebf5a82e004
|
data/bin/algo_scaffold
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'colorize'
|
3
|
+
|
4
|
+
module AlgoScaffold
|
5
|
+
class CLI < Thor
|
6
|
+
desc "generate PROBLEM_NAME URL METHOD_NAME [ARGS...]", "Generate algorithm scaffolding files"
|
7
|
+
|
8
|
+
def generate(problem_name, url, method_name, *method_args)
|
9
|
+
generator = Generator.new(
|
10
|
+
problem_name: problem_name,
|
11
|
+
url: url,
|
12
|
+
method_name: method_name,
|
13
|
+
method_args: method_args,
|
14
|
+
)
|
15
|
+
|
16
|
+
generator.generate!
|
17
|
+
|
18
|
+
puts "\nā Successfully generated files:".green
|
19
|
+
puts " š src/#{problem_name}.rb".cyan
|
20
|
+
puts " š spec/#{problem_name}_spec.rb".cyan
|
21
|
+
|
22
|
+
puts "\nš” Next steps:".yellow
|
23
|
+
puts " 1. Implement the #{method_name} method in src/#{problem_name}.rb"
|
24
|
+
puts " 2. Add test cases in spec/#{problem_name}_spec.rb"
|
25
|
+
puts " 3. Run tests with: rspec spec/#{problem_name}_spec.rb"
|
26
|
+
rescue Generator::ValidationError => e
|
27
|
+
puts "ā #{e.message}".red
|
28
|
+
exit 1
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "list", "List all generated algorithm files"
|
32
|
+
def list
|
33
|
+
src_files = Dir.glob("src/*.rb").map { |f| File.basename(f, '.rb') }
|
34
|
+
|
35
|
+
if src_files.empty?
|
36
|
+
puts "No algorithm files found.".yellow
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
puts "š Generated algorithms:".green
|
41
|
+
src_files.each do |file|
|
42
|
+
spec_exists = File.exist?("spec/#{file}_spec.rb")
|
43
|
+
status = spec_exists ? "ā".green : "ā".red
|
44
|
+
puts " #{status} #{file}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "version", "Show version"
|
49
|
+
def version
|
50
|
+
puts AlgoScaffold::VERSION
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module AlgoScaffold
|
4
|
+
class Generator
|
5
|
+
class ValidationError < StandardError; end
|
6
|
+
|
7
|
+
def initialize(problem_name:, url:, method_name:, method_args:)
|
8
|
+
@problem_name = problem_name
|
9
|
+
@url = url
|
10
|
+
@method_name = method_name
|
11
|
+
@method_args = method_args
|
12
|
+
|
13
|
+
validate!
|
14
|
+
end
|
15
|
+
|
16
|
+
def generate!
|
17
|
+
create_directories
|
18
|
+
generate_source_file
|
19
|
+
generate_spec_file
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :problem_name, :url, :method_name, :method_args
|
25
|
+
|
26
|
+
def validate!
|
27
|
+
errors = []
|
28
|
+
|
29
|
+
errors << "Problem name is required" if problem_name.nil? || problem_name.empty?
|
30
|
+
errors << "URL is required" if url.nil? || url.empty?
|
31
|
+
errors << "Method name is required" if method_name.nil? || method_name.empty?
|
32
|
+
errors << "At least one method argument is required" if method_args.empty?
|
33
|
+
|
34
|
+
unless errors.empty?
|
35
|
+
raise ValidationError, errors.map { |e| "⢠#{e}" }.join("\n")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def create_directories
|
40
|
+
FileUtils.mkdir_p('src')
|
41
|
+
FileUtils.mkdir_p('spec')
|
42
|
+
end
|
43
|
+
|
44
|
+
def generate_source_file
|
45
|
+
class_name = snake_to_camel(problem_name)
|
46
|
+
content = basic_source_template(class_name)
|
47
|
+
|
48
|
+
File.write("src/#{problem_name}.rb", content)
|
49
|
+
end
|
50
|
+
|
51
|
+
def generate_spec_file
|
52
|
+
class_name = snake_to_camel(problem_name)
|
53
|
+
content = basic_spec_template(class_name)
|
54
|
+
|
55
|
+
File.write("spec/#{problem_name}_spec.rb", content)
|
56
|
+
end
|
57
|
+
|
58
|
+
def basic_source_template(class_name)
|
59
|
+
<<~RUBY
|
60
|
+
# #{url}
|
61
|
+
|
62
|
+
class #{class_name}
|
63
|
+
class << self
|
64
|
+
|
65
|
+
def #{method_name}(#{method_args.join(', ')})
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
RUBY
|
70
|
+
end
|
71
|
+
|
72
|
+
def basic_spec_template(class_name)
|
73
|
+
<<~RUBY
|
74
|
+
require 'rspec'
|
75
|
+
require_relative '../src/#{problem_name}.rb'
|
76
|
+
|
77
|
+
RSpec.describe #{class_name} do
|
78
|
+
subject(:output) { described_class.#{method_name}(#{method_args.join(', ')}) }
|
79
|
+
|
80
|
+
context 'TODO - implement test cases' do
|
81
|
+
end
|
82
|
+
end
|
83
|
+
RUBY
|
84
|
+
end
|
85
|
+
|
86
|
+
def snake_to_camel(snake_str)
|
87
|
+
snake_str.split('_').map(&:capitalize).join
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: algo_scaffold
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Molly Huerster
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2025-08-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: colorize
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.1'
|
41
|
+
description: A command-line tool to quickly generate Ruby class and RSpec test files
|
42
|
+
for algorithm practice problems from various sources. Mostly implemented by Claude.
|
43
|
+
email:
|
44
|
+
- molly.huerster@gmail.com
|
45
|
+
executables:
|
46
|
+
- algo_scaffold
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- bin/algo_scaffold
|
51
|
+
- lib/algo_scaffold.rb
|
52
|
+
- lib/algo_scaffold/cli.rb
|
53
|
+
- lib/algo_scaffold/generator.rb
|
54
|
+
homepage: https://github.com/mhuerster/algo_scaffold
|
55
|
+
licenses:
|
56
|
+
- MIT
|
57
|
+
metadata:
|
58
|
+
allowed_push_host: https://rubygems.org
|
59
|
+
homepage_uri: https://github.com/mhuerster/algo_scaffold
|
60
|
+
source_code_uri: https://github.com/mhuerster/algo_scaffold
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.7.0
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubygems_version: 3.5.22
|
77
|
+
signing_key:
|
78
|
+
specification_version: 4
|
79
|
+
summary: Generate scaffolding for algorithm practice problems
|
80
|
+
test_files: []
|