singer 0.4.0 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23ff6172f3189c234f2b95c1aaee2a67e5b91ffd10c88375c54e37cb4417abb5
4
- data.tar.gz: 037ff1bd0e545efd4156ad9ff84cb2934070f0e704e05156acbff1fd7d787cfb
3
+ metadata.gz: 8d116f657ac1b8d3b57e540ae37bf0d74c21fe357938fbb6aa33309663b9add5
4
+ data.tar.gz: 7854c981adfd45a2989647f6302022ff0b40e66b47960c2fc536cd428dc99c93
5
5
  SHA512:
6
- metadata.gz: 494f03f90b0584d1c0ba3ae4b72454151e8379591082e51fa61cbaae3ad65c50b91463ef52ba56208a7ef6f63d6c8b75f4c4f3c99430a9b367284e337f77cf59
7
- data.tar.gz: 55646990590d66996705547ed95ff21b21a6a19609db53231c6f416d91fc37d84f0d1fc1c12189b932ade10a479ebef2f619cd5e1a0c8d3b07eb8a1f58f89d4a
6
+ metadata.gz: 933cc4b306f621d57598f0b1d5f72993fd6c25afea2496aa89f088847b42374b8a01bf68d709a2c3f154455b02b6158f2072677ec23b55ff1b359020c24cfbe5
7
+ data.tar.gz: 0ed47b046d03641227f28faa499d9ea50cd80901ddf7efa75f5c1da4df07a54b5ad435bb338158047438175862c17b310e92d19ee94ecfafdf135d9810dce468
data/README.md CHANGED
@@ -8,7 +8,14 @@ Run `gem install singer`.
8
8
 
9
9
  ## Usage
10
10
 
11
- TODO: Write usage instructions here
11
+ ```bash
12
+ singer [OPTION]... [TEMPLATE_NAME] PROJECT_NAME
13
+ ```
14
+
15
+ Run `singer --help` to see up-to-date list of options.
16
+ Run `singer --list-templates` to see available templates' names, both shipped with the gem and found on current system.
17
+
18
+ For `PROJECT_NAME`, using `snake_case` is best, although an attempt will be made to understand `CamelCase`, too.
12
19
 
13
20
  ## Development
14
21
 
data/exe/singer CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  require 'singer'
4
4
 
5
- Singer.configure(ARGV)
5
+ Singer::OptionParsing.configure(ARGV)
6
6
  Singer.generate
@@ -0,0 +1,40 @@
1
+ module Singer
2
+ # extracts what we need from ARGV
3
+ class OptionParsing
4
+ DEFAULT_TEMPLATE_NAME = 'tdd'.freeze
5
+
6
+ def self.configure(argvies) # rubocop:disable Metrics/MethodLength
7
+ options = {}
8
+ OptionParser.new do |parser|
9
+ parser.banner = <<~USAGE
10
+ Usage: #{$PROGRAM_NAME} [OPTION]... [TEMPLATE_NAME] PROJECT_NAME
11
+ Generates a project from a multi-file template.
12
+ PROJECT_NAME can be in snake_case or CamelCase.
13
+
14
+ Options:
15
+ USAGE
16
+ parser.on('--list-templates', 'list all available templates') do
17
+ list_all_templates
18
+ Kernel.exit
19
+ end
20
+ end.parse!(argvies, into: options)
21
+
22
+ raise NameMissingError, 'Missing mandatory argument PROJECT_NAME' if argvies.empty?
23
+
24
+ encase_name(argvies.pop)
25
+ CONFIGURATION.template_name = argvies.shift || DEFAULT_TEMPLATE_NAME
26
+ end
27
+
28
+ def self.list_all_templates
29
+ name_column_width = Template.all.keys.map(&:length).max
30
+ Template.all.each do |name, template|
31
+ puts "#{name.to_s.ljust(name_column_width)} #{template.path}"
32
+ end
33
+ end
34
+
35
+ def self.encase_name(name)
36
+ CONFIGURATION.snakecase_name = name.gsub(/(\w)([A-Z])/){ "#{$1}_#{$2}" }.gsub(/_+/, '_').downcase
37
+ CONFIGURATION.camelcase_name = CONFIGURATION.snakecase_name.split('_').map(&:capitalize).join
38
+ end
39
+ end
40
+ end
data/lib/singer/paths.rb CHANGED
@@ -1,6 +1,18 @@
1
1
  module Singer
2
2
  # helps find files
3
3
  class Paths
4
+ def self.xdg_config_dir
5
+ @xdg_config_dir ||= ENV.fetch('XDG_CONFIG_DIR', File.join(Dir.home, '.config'))
6
+ end
7
+
8
+ def self.singer_config_dir
9
+ @singer_config_dir ||= File.join(xdg_config_dir, 'singer')
10
+ end
11
+
12
+ def self.templates_from_user
13
+ @templates_from_user ||= File.join(singer_config_dir, 'templates')
14
+ end
15
+
4
16
  def self.templates_from_gem
5
17
  @templates_from_gem ||= File.expand_path('../../templates', __dir__)
6
18
  end
@@ -8,7 +8,13 @@ module Singer
8
8
  end
9
9
 
10
10
  def self.load_all
11
- Dir[File.join(Paths.templates_from_gem, '*')].to_h do |template_dir|
11
+ [Paths.templates_from_gem, Paths.templates_from_user]
12
+ .map{ load_from_directory(_1) }
13
+ .reduce(&:merge)
14
+ end
15
+
16
+ def self.load_from_directory(dir)
17
+ Dir[File.join(dir, '*')].to_h do |template_dir|
12
18
  [File.basename(template_dir), new(template_dir)]
13
19
  end
14
20
  end
@@ -1,3 +1,3 @@
1
1
  module Singer
2
- VERSION = '0.4.0'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  end
data/lib/singer.rb CHANGED
@@ -1,29 +1,18 @@
1
1
  require_relative 'singer/version'
2
2
  require_relative 'singer/configuration'
3
+ require_relative 'singer/option_parsing'
3
4
  require_relative 'singer/paths'
4
5
  require_relative 'singer/template'
5
6
  require_relative 'singer/templating_methods'
6
7
 
8
+ require 'optparse'
9
+
7
10
  # Singer, which generates Sinatra apps etc. from templates
8
11
  module Singer
9
12
  class Error < StandardError; end
10
13
  class NameMissingError < StandardError; end
11
14
  class TemplateUnknown < StandardError; end
12
15
 
13
- DEFAULT_TEMPLATE_NAME = 'tdd'.freeze
14
-
15
- def self.configure(argvies)
16
- raise NameMissingError, 'Missing mandatory argument NAME' if argvies.empty?
17
-
18
- encase_name(argvies.pop)
19
- CONFIGURATION.template_name = argvies.shift || DEFAULT_TEMPLATE_NAME
20
- end
21
-
22
- def self.encase_name(name)
23
- CONFIGURATION.snakecase_name = name.gsub(/(\w)([A-Z])/){ "#{$1}_#{$2}" }.gsub(/_+/, '_').downcase
24
- CONFIGURATION.camelcase_name = CONFIGURATION.snakecase_name.split('_').map(&:capitalize).join
25
- end
26
-
27
16
  def self.generate
28
17
  unless Template.all.key?(CONFIGURATION.template_name)
29
18
  raise TemplateUnknown, "Template #{CONFIGURATION.template_name.inspect} not found"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: singer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emil Chludziński
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-01-26 00:00:00.000000000 Z
10
+ date: 2025-01-29 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: erb
@@ -38,6 +38,7 @@ files:
38
38
  - exe/singer
39
39
  - lib/singer.rb
40
40
  - lib/singer/configuration.rb
41
+ - lib/singer/option_parsing.rb
41
42
  - lib/singer/paths.rb
42
43
  - lib/singer/template.rb
43
44
  - lib/singer/templating_methods.rb