angus 0.0.7 → 0.0.8
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.
- data/bin/angus +8 -2
- data/lib/angus/commands/angus_command.rb +11 -0
- data/lib/angus/commands/command_processor.rb +28 -0
- data/lib/angus/commands/demo_command.rb +26 -0
- data/lib/angus/commands/help_command.rb +21 -0
- data/lib/angus/commands/new_service_command.rb +18 -0
- data/lib/angus/commands/resource_command.rb +19 -0
- data/lib/angus/commands/scaffold_command.rb +20 -0
- data/lib/angus/commands/server_command.rb +17 -0
- data/lib/angus/generator/templates/definitions/messages.yml.erb +6 -0
- data/lib/angus/generator/templates/definitions/operations.yml.erb +16 -13
- data/lib/angus/generator/templates/definitions/representations.yml.erb +11 -0
- data/lib/angus/generator/templates/resources/resource.rb.erb +7 -2
- data/lib/angus/generator/thor/file_handler.rb +36 -0
- data/lib/angus/generator/thor/helper_methods.rb +65 -0
- data/lib/angus/generator/thor/new_project.rb +92 -0
- data/lib/angus/generator/thor/resource.rb +141 -0
- data/lib/angus/version.rb +2 -2
- metadata +16 -6
- data/lib/angus/command.rb +0 -27
- data/lib/angus/generator/templates/definitions/messages.yml +0 -0
- data/lib/angus/generator/templates/definitions/representations.yml +0 -0
- data/lib/angus/generator.rb +0 -141
data/bin/angus
CHANGED
@@ -8,6 +8,12 @@ bin_file = Pathname.new(__FILE__).realpath
|
|
8
8
|
# add self to libpath
|
9
9
|
$:.unshift File.expand_path('../../lib', bin_file)
|
10
10
|
|
11
|
-
require 'angus/
|
11
|
+
require 'angus/commands/angus_command'
|
12
|
+
require 'angus/commands/demo_command'
|
13
|
+
require 'angus/commands/help_command'
|
14
|
+
require 'angus/commands/new_service_command'
|
15
|
+
require 'angus/commands/resource_command'
|
16
|
+
require 'angus/commands/scaffold_command'
|
17
|
+
require 'angus/commands/server_command'
|
12
18
|
|
13
|
-
Angus::
|
19
|
+
Angus::AngusCommand.start
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'thor'
|
3
|
+
require 'thor/actions'
|
4
|
+
require_relative '../generator/thor/new_project'
|
5
|
+
require_relative '../generator/thor/resource'
|
6
|
+
|
7
|
+
module Angus
|
8
|
+
class CommandProcessor < Thor
|
9
|
+
include Thor::Actions
|
10
|
+
|
11
|
+
RESOURCES_DIR = 'resources'
|
12
|
+
DEFINITIONS_DIR = 'definitions'
|
13
|
+
SERVICES_DIR = 'services'
|
14
|
+
|
15
|
+
no_tasks do
|
16
|
+
def new_service(name, config = {})
|
17
|
+
new_project(name, config)
|
18
|
+
end
|
19
|
+
|
20
|
+
def new_resource(name, actions, config = {})
|
21
|
+
resource(name, actions, config)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Angus::CommandProcessor.source_root(File.join(File.dirname(File.expand_path(__FILE__)), '..', 'generator', 'templates'))
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative 'angus_command'
|
2
|
+
|
3
|
+
module Angus
|
4
|
+
class DemoCommand < Thor::Group
|
5
|
+
|
6
|
+
def demo
|
7
|
+
project_name = 'demo'
|
8
|
+
|
9
|
+
command_processor.new_service(project_name, {demo: true})
|
10
|
+
|
11
|
+
command_processor.run("cd #{project_name}")
|
12
|
+
Dir.chdir(File.join(Dir.pwd, project_name))
|
13
|
+
|
14
|
+
command_processor.resource('user', ['index'], {demo: true})
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def command_processor
|
20
|
+
@command_processor ||= Angus::CommandProcessor.new
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Angus::AngusCommand.register(Angus::DemoCommand, 'demo', 'demo [NAME]', 'Generate an empty angus project')
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Angus
|
2
|
+
class HelpCommand < Thor::Group
|
3
|
+
|
4
|
+
def help
|
5
|
+
puts <<-HELP
|
6
|
+
Usages:
|
7
|
+
angus new [API NAME] # This generate an empty angus project.
|
8
|
+
|
9
|
+
angus demo # This generate an demo angus project.
|
10
|
+
|
11
|
+
Examples:
|
12
|
+
angus new great-api
|
13
|
+
|
14
|
+
This generates a skeletal angus installation in great-api.
|
15
|
+
HELP
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Angus::AngusCommand.register(Angus::HelpCommand, 'help', 'help', 'Help using the angus command')
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Angus
|
2
|
+
class NewServiceCommand < Thor::Group
|
3
|
+
|
4
|
+
argument :name, desc: 'Name of the resource', type: :string
|
5
|
+
def new
|
6
|
+
command_processor.new_service(self.name)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def command_processor
|
12
|
+
@command_processor ||= Angus::CommandProcessor.new
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Angus::AngusCommand.register(Angus::NewServiceCommand, 'new', 'new', 'Generate a new service')
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Angus
|
2
|
+
class ResourceCommand < Thor::Group
|
3
|
+
|
4
|
+
argument :name, desc: 'Name of the resource', type: :string
|
5
|
+
argument :actions, desc: 'Actions to be generated', type: :array, optional: true
|
6
|
+
def resource
|
7
|
+
command_processor.new_resource(self.name, self.actions)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def command_processor
|
13
|
+
@command_processor ||= Angus::CommandProcessor.new
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Angus::AngusCommand.register(Angus::ResourceCommand, 'resource', 'resource [NAME] [ACTIONS]', 'Generate a new resource')
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'angus_command'
|
2
|
+
|
3
|
+
module Angus
|
4
|
+
class ScaffoldCommand < Thor::Group
|
5
|
+
|
6
|
+
argument :name, desc: 'Name of the resource', type: :string
|
7
|
+
def scaffold
|
8
|
+
command_processor.resource(self.name, %w(create update destroy show index), {scaffold: true})
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def command_processor
|
14
|
+
@command_processor ||= Angus::CommandProcessor.new
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Angus::AngusCommand.register(Angus::ScaffoldCommand, 'scaffold', 'scaffold [NAME]', 'Generate a scaffold of a given model')
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Angus
|
2
|
+
class ServerCommand < Thor::Group
|
3
|
+
|
4
|
+
def server
|
5
|
+
command_processor.run('rackup', verbose: false)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def command_processor
|
11
|
+
@command_processor ||= Angus::CommandProcessor.new
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Angus::AngusCommand.register(Angus::ServerCommand, 'server', 'server', 'Run the angus server')
|
@@ -1,21 +1,24 @@
|
|
1
|
-
<%
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
path:
|
7
|
-
method:
|
1
|
+
<% unless actions.nil? %>
|
2
|
+
<% actions.each do |action_name| %>
|
3
|
+
<%= action_name %>:
|
4
|
+
name: '<%= action_name %>'
|
5
|
+
description: '<%= action_description(action_name) %>'
|
6
|
+
path: '<%= action_path(action_name) %>'
|
7
|
+
method: '<%= action_method(action_name) %>'
|
8
|
+
<% unless is_demo? %>
|
8
9
|
uri:
|
9
10
|
- element:
|
10
11
|
description:
|
12
|
+
<% end %>
|
11
13
|
|
12
14
|
response:
|
13
|
-
- element:
|
14
|
-
description:
|
15
|
-
required:
|
16
|
-
type:
|
15
|
+
- element: '<%= response_element(action_name) %>'
|
16
|
+
description: '<%= response_description(action_name) %>'
|
17
|
+
required: <%= response_required(action_name) %>
|
18
|
+
type: <%= response_type(action_name) %>
|
17
19
|
|
18
20
|
messages:
|
19
|
-
- key:
|
20
|
-
description:
|
21
|
+
- key: <%= message_key(action_name) %>
|
22
|
+
description: '<%= message_description(action_name) %>'
|
23
|
+
<% end %>
|
21
24
|
<% end %>
|
@@ -1,6 +1,11 @@
|
|
1
1
|
class <%= classify(resource_name) %> < Angus::BaseResource
|
2
|
-
<%
|
3
|
-
|
2
|
+
<% unless actions.nil? %>
|
3
|
+
<% actions.each do |action_name| %>
|
4
|
+
def
|
5
|
+
|
6
|
+
{users: [{id: 1, name: 'User one'}, {id: 2, name: 'User two'}]}
|
7
|
+
<% end %>
|
4
8
|
end
|
5
9
|
<% end %>
|
10
|
+
<% end %>
|
6
11
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Angus
|
2
|
+
module FileHandler
|
3
|
+
|
4
|
+
# Override if you want a custom file mapping.
|
5
|
+
def mapping
|
6
|
+
{}
|
7
|
+
end
|
8
|
+
|
9
|
+
def is_erb?(file)
|
10
|
+
file.end_with?('.erb')
|
11
|
+
end
|
12
|
+
|
13
|
+
def copy_erb_file(file, name, base_path = nil)
|
14
|
+
base_path = name if base_path.nil?
|
15
|
+
|
16
|
+
tmp_file = Tempfile.new(File.basename(file))
|
17
|
+
|
18
|
+
source = File.expand_path(base.find_in_source_paths(file.to_s))
|
19
|
+
content = ERB.new(File.binread(source)).result(binding)
|
20
|
+
|
21
|
+
File.open(tmp_file.path, 'w') { |f| f << content }
|
22
|
+
tmp_file.close
|
23
|
+
|
24
|
+
base.copy_file(tmp_file.path, File.join(base_path, filename_resolver(file, name)))
|
25
|
+
end
|
26
|
+
|
27
|
+
def filename_resolver(file, app_name)
|
28
|
+
if mapping[file].nil?
|
29
|
+
file.gsub('.erb', '')
|
30
|
+
else
|
31
|
+
mapping[file].call(self, app_name)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Angus
|
2
|
+
module HelperMethods
|
3
|
+
|
4
|
+
def pluralize(word)
|
5
|
+
uncountable = %w(equipment information rice money species series fish sheep)
|
6
|
+
rules = []
|
7
|
+
|
8
|
+
irregular = {
|
9
|
+
'person' => 'people',
|
10
|
+
'man' => 'men',
|
11
|
+
'child' => 'children',
|
12
|
+
'sex' => 'sexes',
|
13
|
+
'move' => 'moves'
|
14
|
+
}
|
15
|
+
|
16
|
+
irregular.each do |word, replacement|
|
17
|
+
rules << [word, replacement]
|
18
|
+
rules << [replacement, replacement]
|
19
|
+
end
|
20
|
+
|
21
|
+
rules << [/^(ox)$/i , '\1en' ]
|
22
|
+
rules << [/(quiz)$/i , '\1zes' ]
|
23
|
+
rules << [/([m|l])ouse$/i , '\1ice' ]
|
24
|
+
rules << [/(matr|vert|ind)ix|ex$/i, '\1ices' ]
|
25
|
+
rules << [/(x|ch|ss|sh)$/i , '\1es' ]
|
26
|
+
rules << [/([^aeiouy]|qu)ies$/i , '\1y' ]
|
27
|
+
rules << [/([^aeiouy]|qu)y$/i , '\1ies' ]
|
28
|
+
rules << [/(hive)$/i , '\1s' ]
|
29
|
+
rules << [/(?:([^f])fe|([lr])f)$/i, '\1\2ves']
|
30
|
+
rules << [/sis$/i , 'ses' ]
|
31
|
+
rules << [/([ti])um$/i , '\1a' ]
|
32
|
+
rules << [/(buffal|tomat)o$/i , '\1oes' ]
|
33
|
+
rules << [/(bu)s$/i , '\1ses' ]
|
34
|
+
rules << [/(alias|status)$/i , '\1es' ]
|
35
|
+
rules << [/(octop|vir)us$/i , '\1i' ]
|
36
|
+
rules << [/(ax|test)is$/i , '\1es' ]
|
37
|
+
rules << [/s$/i , 's' ]
|
38
|
+
rules << [/$/ , 's' ]
|
39
|
+
|
40
|
+
result = word.to_s.dup
|
41
|
+
|
42
|
+
if word.empty? || uncountable.include?(result.downcase[/\b\w+\Z/])
|
43
|
+
result
|
44
|
+
else
|
45
|
+
rules.each { |(rule, replacement)| break if result.sub!(rule, replacement) }
|
46
|
+
result
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def classify(string)
|
51
|
+
string.sub(/^[a-z\d]*/) { $&.capitalize }.gsub(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
|
52
|
+
end
|
53
|
+
|
54
|
+
def underscore(camel_cased_word)
|
55
|
+
word = camel_cased_word.to_s.dup
|
56
|
+
word.gsub!(/::/, '/')
|
57
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
58
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
59
|
+
word.tr!('-', '_')
|
60
|
+
word.downcase!
|
61
|
+
word
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require_relative 'helper_methods'
|
2
|
+
require_relative 'file_handler'
|
3
|
+
|
4
|
+
class Thor
|
5
|
+
module Actions
|
6
|
+
|
7
|
+
# Creates a new project.
|
8
|
+
#
|
9
|
+
# @param [String] name The name of the resource.
|
10
|
+
# @param [Hash] config
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
#
|
14
|
+
# new_project 'great-api'
|
15
|
+
#
|
16
|
+
def new_project(name, config = {})
|
17
|
+
action NewProject.new(self, name, config)
|
18
|
+
end
|
19
|
+
|
20
|
+
class NewProject #:nodoc:
|
21
|
+
include Angus::HelperMethods
|
22
|
+
include Angus::FileHandler
|
23
|
+
|
24
|
+
FILE_MAPPINGS = {
|
25
|
+
'services/service.rb.erb' => -> command, app_name { File.join(Angus::CommandProcessor::SERVICES_DIR, "#{command.underscore(command.classify(app_name))}.rb") },
|
26
|
+
'resources/resource.rb.erb' => -> command, name { "#{command.underscore(command.classify(name))}.rb" },
|
27
|
+
'definitions/operations.yml.erb' => -> command, _ { File.join(command.resource_name, 'operations.yml') }
|
28
|
+
}
|
29
|
+
|
30
|
+
attr_accessor :base, :config, :app_name
|
31
|
+
|
32
|
+
# Creates a new project.
|
33
|
+
#
|
34
|
+
# @param [Thor::Base] base A Thor::Base instance
|
35
|
+
def initialize(base, name, config)
|
36
|
+
@base, @config = base, { :verbose => true }.merge(config)
|
37
|
+
|
38
|
+
self.app_name = name
|
39
|
+
end
|
40
|
+
|
41
|
+
def invoke!
|
42
|
+
base.empty_directory(app_name)
|
43
|
+
|
44
|
+
new_app_directories.each do |directory|
|
45
|
+
base.empty_directory(File.join(app_name, directory))
|
46
|
+
end
|
47
|
+
|
48
|
+
new_app_files.each do |file|
|
49
|
+
if is_erb?(file)
|
50
|
+
copy_erb_file(file, app_name)
|
51
|
+
else
|
52
|
+
base.copy_file(file, File.join(app_name, file))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def revoke!
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
def mapping
|
62
|
+
FILE_MAPPINGS
|
63
|
+
end
|
64
|
+
|
65
|
+
protected
|
66
|
+
|
67
|
+
def is_generating_demo?
|
68
|
+
@config[:demo]
|
69
|
+
end
|
70
|
+
|
71
|
+
def new_app_directories
|
72
|
+
[
|
73
|
+
Angus::CommandProcessor::DEFINITIONS_DIR,
|
74
|
+
Angus::CommandProcessor::RESOURCES_DIR,
|
75
|
+
Angus::CommandProcessor::SERVICES_DIR
|
76
|
+
]
|
77
|
+
end
|
78
|
+
|
79
|
+
def new_app_files
|
80
|
+
%w(
|
81
|
+
Gemfile.erb
|
82
|
+
config.ru.erb
|
83
|
+
services/service.rb.erb
|
84
|
+
definitions/messages.yml.erb
|
85
|
+
definitions/representations.yml.erb
|
86
|
+
definitions/service.yml.erb
|
87
|
+
)
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require_relative 'helper_methods'
|
2
|
+
require_relative 'file_handler'
|
3
|
+
|
4
|
+
class Thor
|
5
|
+
module Actions
|
6
|
+
|
7
|
+
# Creates a new resource.
|
8
|
+
#
|
9
|
+
# @param [String] name The name of the resource.
|
10
|
+
# @param [Hash] config
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
#
|
14
|
+
# resource 'user', 'resouces', 'definitions'
|
15
|
+
#
|
16
|
+
def resource(name, actions, config = {})
|
17
|
+
action Resource.new(self, name, actions, config)
|
18
|
+
end
|
19
|
+
|
20
|
+
class Resource #:nodoc:
|
21
|
+
include Angus::HelperMethods
|
22
|
+
include Angus::FileHandler
|
23
|
+
|
24
|
+
FILE_MAPPINGS = {
|
25
|
+
'resources/resource.rb.erb' => -> command, name { "#{command.underscore(command.classify(name))}.rb" },
|
26
|
+
'definitions/operations.yml.erb' => -> command, _ { File.join(command.underscore(command.resource_name), 'operations.yml') }
|
27
|
+
}
|
28
|
+
|
29
|
+
attr_accessor :base, :config, :resource_name, :actions,
|
30
|
+
:resource_directory, :definition_directory, :service_directory
|
31
|
+
|
32
|
+
# Creates a new resource.
|
33
|
+
#
|
34
|
+
# @param [Thor::Base] base A Thor::Base instance
|
35
|
+
def initialize(base, name, actions, config)
|
36
|
+
@base, @config = base, { :verbose => true }.merge(config)
|
37
|
+
|
38
|
+
self.resource_name = pluralize(name)
|
39
|
+
self.actions = actions
|
40
|
+
self.resource_directory = File.join(Dir.pwd, Angus::CommandProcessor::RESOURCES_DIR)
|
41
|
+
self.definition_directory = File.join(Dir.pwd, Angus::CommandProcessor::DEFINITIONS_DIR)
|
42
|
+
self.service_directory = File.join(Dir.pwd, Angus::CommandProcessor::SERVICES_DIR)
|
43
|
+
end
|
44
|
+
|
45
|
+
def invoke!
|
46
|
+
base.empty_directory(resource_directory)
|
47
|
+
base.empty_directory(definition_directory)
|
48
|
+
|
49
|
+
copy_erb_file('resources/resource.rb.erb', underscore(resource_name), resource_directory)
|
50
|
+
copy_erb_file('definitions/operations.yml.erb', underscore(resource_name), definition_directory)
|
51
|
+
insert_into_services(" register :#{underscore(resource_name)}\n")
|
52
|
+
end
|
53
|
+
|
54
|
+
def revoke!
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
def action_description(action_name)
|
61
|
+
action_name if is_demo?
|
62
|
+
end
|
63
|
+
|
64
|
+
def action_path(action_name)
|
65
|
+
if is_demo?
|
66
|
+
'/users'
|
67
|
+
elsif is_scaffold?
|
68
|
+
case action_name
|
69
|
+
when 'show', 'update', 'destroy'
|
70
|
+
"#{underscore(resource_name)}/:id"
|
71
|
+
else
|
72
|
+
"#{underscore(resource_name)}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def action_method(action_name)
|
78
|
+
if is_demo?
|
79
|
+
'get'
|
80
|
+
elsif is_scaffold?
|
81
|
+
case action_name
|
82
|
+
when 'create'
|
83
|
+
'post'
|
84
|
+
when 'update'
|
85
|
+
'put'
|
86
|
+
when 'destroy'
|
87
|
+
'delete'
|
88
|
+
else
|
89
|
+
'get'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def response_element(action_name)
|
95
|
+
'users' if is_demo?
|
96
|
+
end
|
97
|
+
|
98
|
+
def response_description(action_name)
|
99
|
+
'Users profiles' if is_demo?
|
100
|
+
end
|
101
|
+
|
102
|
+
def response_required(action_name)
|
103
|
+
true if is_demo?
|
104
|
+
end
|
105
|
+
|
106
|
+
def response_type(action_name)
|
107
|
+
'user_profile' if is_demo?
|
108
|
+
end
|
109
|
+
|
110
|
+
def message_key(action_name)
|
111
|
+
'ResourceNotFound' if is_demo?
|
112
|
+
end
|
113
|
+
|
114
|
+
def message_description(action_name)
|
115
|
+
'Resource Not Found' if is_demo?
|
116
|
+
end
|
117
|
+
|
118
|
+
def mapping
|
119
|
+
FILE_MAPPINGS
|
120
|
+
end
|
121
|
+
|
122
|
+
def is_scaffold?
|
123
|
+
config[:scaffold]
|
124
|
+
end
|
125
|
+
|
126
|
+
def is_demo?
|
127
|
+
config[:demo]
|
128
|
+
end
|
129
|
+
|
130
|
+
def insert_into_services(content)
|
131
|
+
config = {}
|
132
|
+
config.merge!(:after => /def configure\n|def configure .*\n/)
|
133
|
+
|
134
|
+
file = Dir[File.join(service_directory, '*.*')].first
|
135
|
+
|
136
|
+
base.insert_into_file(file, *([content] << config))
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
data/lib/angus/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module Angus
|
2
|
-
VERSION = '0.0.
|
3
|
-
end
|
2
|
+
VERSION = '0.0.8'
|
3
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: angus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2014-01-03 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: thor
|
@@ -213,9 +213,16 @@ files:
|
|
213
213
|
- lib/angus/marshallings/marshalling.rb
|
214
214
|
- lib/angus/marshallings/exceptions.rb
|
215
215
|
- lib/angus/marshallings/base.rb
|
216
|
-
- lib/angus/generator.rb
|
217
216
|
- lib/angus/status_codes.rb
|
218
217
|
- lib/angus/version.rb
|
218
|
+
- lib/angus/commands/angus_command.rb
|
219
|
+
- lib/angus/commands/new_service_command.rb
|
220
|
+
- lib/angus/commands/server_command.rb
|
221
|
+
- lib/angus/commands/resource_command.rb
|
222
|
+
- lib/angus/commands/scaffold_command.rb
|
223
|
+
- lib/angus/commands/demo_command.rb
|
224
|
+
- lib/angus/commands/command_processor.rb
|
225
|
+
- lib/angus/commands/help_command.rb
|
219
226
|
- lib/angus/base_actions.rb
|
220
227
|
- lib/angus/request_handler.rb
|
221
228
|
- lib/angus/renders/html_render.rb
|
@@ -226,12 +233,15 @@ files:
|
|
226
233
|
- lib/angus/generator/templates/README.md
|
227
234
|
- lib/angus/generator/templates/config.ru.erb
|
228
235
|
- lib/angus/generator/templates/services/service.rb.erb
|
229
|
-
- lib/angus/generator/templates/definitions/representations.yml
|
230
236
|
- lib/angus/generator/templates/definitions/service.yml.erb
|
231
237
|
- lib/angus/generator/templates/definitions/operations.yml.erb
|
232
|
-
- lib/angus/generator/templates/definitions/
|
238
|
+
- lib/angus/generator/templates/definitions/representations.yml.erb
|
239
|
+
- lib/angus/generator/templates/definitions/messages.yml.erb
|
240
|
+
- lib/angus/generator/thor/new_project.rb
|
241
|
+
- lib/angus/generator/thor/resource.rb
|
242
|
+
- lib/angus/generator/thor/helper_methods.rb
|
243
|
+
- lib/angus/generator/thor/file_handler.rb
|
233
244
|
- lib/angus/base_resource.rb
|
234
|
-
- lib/angus/command.rb
|
235
245
|
- lib/angus/response.rb
|
236
246
|
- lib/angus/exceptions.rb
|
237
247
|
- lib/angus/middleware/exception_handler.rb
|
data/lib/angus/command.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
require 'thor'
|
3
|
-
|
4
|
-
require_relative 'generator'
|
5
|
-
|
6
|
-
module Angus
|
7
|
-
class Command < Thor
|
8
|
-
|
9
|
-
desc 'new [NAME]', 'Generate a new service'
|
10
|
-
def new(name)
|
11
|
-
generator.new_service(name)
|
12
|
-
end
|
13
|
-
|
14
|
-
desc 'resource [NAME]', 'Generate a new resource'
|
15
|
-
method_option :actions, aliases: '-a', type: :array, desc: 'Generate the given actions for the resource'
|
16
|
-
def resource(name)
|
17
|
-
generator.resource(name)
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def generator
|
23
|
-
@generator ||= Angus::Generator.new
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
end
|
File without changes
|
File without changes
|
data/lib/angus/generator.rb
DELETED
@@ -1,141 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
require 'thor'
|
3
|
-
require 'thor/actions'
|
4
|
-
|
5
|
-
module Angus
|
6
|
-
class Generator < Thor
|
7
|
-
include Thor::Actions
|
8
|
-
|
9
|
-
RESOURCES_DIR = 'resources'
|
10
|
-
DEFINITIONS_DIR = 'definitions'
|
11
|
-
SERVICES_DIR = 'services'
|
12
|
-
|
13
|
-
NEW_APP_DIRECTORIES = %W(#{DEFINITIONS_DIR} #{RESOURCES_DIR} #{SERVICES_DIR})
|
14
|
-
|
15
|
-
NEW_APP_FILES = %w(
|
16
|
-
Gemfile.erb
|
17
|
-
config.ru.erb
|
18
|
-
services/service.rb.erb
|
19
|
-
definitions/messages.yml
|
20
|
-
definitions/representations.yml
|
21
|
-
definitions/service.yml.erb
|
22
|
-
)
|
23
|
-
|
24
|
-
FILE_MAPPINGS = {
|
25
|
-
'services/service.rb.erb' => -> command, app_name { File.join(SERVICES_DIR, "#{command.underscore(command.classify(app_name))}.rb") },
|
26
|
-
'resources/resource.rb.erb' => -> command, name { "#{command.underscore(command.classify(name))}.rb" },
|
27
|
-
'definitions/operations.yml.erb' => -> command, _ { File.join(command.resource_name, 'operations.yml') }
|
28
|
-
}
|
29
|
-
|
30
|
-
no_commands do
|
31
|
-
def new_service(name)
|
32
|
-
app_name(name)
|
33
|
-
|
34
|
-
empty_directory(app_name)
|
35
|
-
|
36
|
-
NEW_APP_DIRECTORIES.each do |directory|
|
37
|
-
empty_directory(File.join(app_name, directory))
|
38
|
-
end
|
39
|
-
|
40
|
-
NEW_APP_FILES.each do |file|
|
41
|
-
if is_erb?(file)
|
42
|
-
copy_erb_file(file, app_name)
|
43
|
-
else
|
44
|
-
copy_file(file, File.join(app_name, file))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def resource(name)
|
50
|
-
resource_name(name)
|
51
|
-
resource_actions(options[:actions])
|
52
|
-
|
53
|
-
empty_directory(RESOURCES_DIR)
|
54
|
-
empty_directory(DEFINITIONS_DIR)
|
55
|
-
|
56
|
-
copy_erb_file('resources/resource.rb.erb', resource_name, RESOURCES_DIR)
|
57
|
-
copy_erb_file('definitions/operations.yml.erb', resource_name, DEFINITIONS_DIR)
|
58
|
-
insert_into_services(" register :#{resource_name}\n")
|
59
|
-
end
|
60
|
-
|
61
|
-
def app_name(name = nil)
|
62
|
-
if name.nil?
|
63
|
-
@app_name
|
64
|
-
else
|
65
|
-
@app_name = name
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def resource_name(name = nil)
|
70
|
-
if name.nil?
|
71
|
-
@resource_name
|
72
|
-
else
|
73
|
-
@resource_name = name
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def resource_actions(actions = nil)
|
78
|
-
if actions.nil?
|
79
|
-
@resource_actions || []
|
80
|
-
else
|
81
|
-
@resource_actions = actions
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def classify(string)
|
86
|
-
string.sub(/^[a-z\d]*/) { $&.capitalize }.gsub(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
|
87
|
-
end
|
88
|
-
|
89
|
-
def underscore(camel_cased_word)
|
90
|
-
word = camel_cased_word.to_s.dup
|
91
|
-
word.gsub!(/::/, '/')
|
92
|
-
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
93
|
-
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
94
|
-
word.tr!('-', '_')
|
95
|
-
word.downcase!
|
96
|
-
word
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
private
|
101
|
-
|
102
|
-
def is_erb?(file)
|
103
|
-
file.end_with?('.erb')
|
104
|
-
end
|
105
|
-
|
106
|
-
def copy_erb_file(file, name, base_path = nil)
|
107
|
-
base_path = name if base_path.nil?
|
108
|
-
|
109
|
-
tmp_file = Tempfile.new(File.basename(file))
|
110
|
-
|
111
|
-
source = File.expand_path(find_in_source_paths(file.to_s))
|
112
|
-
content = ERB.new(File.binread(source)).result(binding)
|
113
|
-
|
114
|
-
File.open(tmp_file.path, 'w') { |f| f << content }
|
115
|
-
tmp_file.close
|
116
|
-
|
117
|
-
copy_file(tmp_file.path, File.join(base_path, filename_resolver(file, name)))
|
118
|
-
end
|
119
|
-
|
120
|
-
def insert_into_services(content)
|
121
|
-
config = {}
|
122
|
-
config.merge!(:after => /def configure\n|def configure .*\n/)
|
123
|
-
|
124
|
-
file = Dir[File.join(Dir.pwd, SERVICES_DIR, '*.*')].first
|
125
|
-
|
126
|
-
insert_into_file(file, *([content] << config))
|
127
|
-
end
|
128
|
-
|
129
|
-
def filename_resolver(file, app_name)
|
130
|
-
if FILE_MAPPINGS[file].nil?
|
131
|
-
file.gsub('.erb', '')
|
132
|
-
else
|
133
|
-
FILE_MAPPINGS[file].call(self, app_name)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
Angus::Generator.source_root(File.join(File.dirname(File.expand_path(__FILE__)), 'generator',
|
141
|
-
'templates'))
|