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 +4 -4
- data/README.md +8 -1
- data/exe/singer +1 -1
- data/lib/singer/option_parsing.rb +40 -0
- data/lib/singer/paths.rb +12 -0
- data/lib/singer/template.rb +7 -1
- data/lib/singer/version.rb +1 -1
- data/lib/singer.rb +3 -14
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d116f657ac1b8d3b57e540ae37bf0d74c21fe357938fbb6aa33309663b9add5
|
4
|
+
data.tar.gz: 7854c981adfd45a2989647f6302022ff0b40e66b47960c2fc536cd428dc99c93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
@@ -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
|
data/lib/singer/template.rb
CHANGED
@@ -8,7 +8,13 @@ module Singer
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.load_all
|
11
|
-
|
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
|
data/lib/singer/version.rb
CHANGED
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
|
+
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-
|
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
|