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 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,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/algo_scaffold'
4
+
5
+ AlgoScaffold::CLI.start(ARGV)
@@ -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
@@ -0,0 +1,6 @@
1
+ require_relative 'algo_scaffold/cli'
2
+ require_relative 'algo_scaffold/generator'
3
+
4
+ module AlgoScaffold
5
+ class Error < StandardError; end
6
+ 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: []