sanji 1.0.0.pre → 1.0.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +79 -0
- data/lib/sanji/app_builder.rb +33 -27
- data/lib/sanji/config.rb +33 -0
- data/lib/sanji/options.rb +91 -0
- data/lib/sanji/recipe.rb +11 -0
- data/lib/sanji/recipes/draper.rb +4 -0
- data/lib/sanji.rb +16 -3
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f13d7a1af1f0d2edf708a58d578a712f907fee0
|
4
|
+
data.tar.gz: c7bad2377c6be921fb2eebcb0be840dffe3cfb61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 699d5133e49fd48fbe0fa8f5ea938e84edb50423503ce924ce8934c97c6cf4364ea138882d79cf0bbfb89fa1a1ffba36fea06237cd8d441947ba37a49bdcd3de
|
7
|
+
data.tar.gz: 6261997f340b575fee6db4c7b1cbd2df0b4d148bd899eceab473c3583d7cce29d5c6d67d41a5e3fd1cdf52de1426464f70e4aa3191b81e441fd806c86976c370
|
data/README.md
CHANGED
@@ -1,3 +1,82 @@
|
|
1
1
|
# sanji
|
2
2
|
|
3
|
+
Customized Rails application generator.
|
4
|
+
Inspired by [suspenders](https://github.com/thoughtbot/suspenders) and [rails_apps_composer](https://github.com/RailsApps/rails_apps_composer) gems.
|
5
|
+
|
3
6
|
![sanji](http://icons.iconarchive.com/icons/crountch/one-piece-character/256/Sanji-icon.png)
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
```
|
11
|
+
gem install sanji
|
12
|
+
```
|
13
|
+
|
14
|
+
## Basic usage
|
15
|
+
|
16
|
+
```
|
17
|
+
sanji app_name
|
18
|
+
```
|
19
|
+
|
20
|
+
## Local Recipe
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
class Sanji::Locals::MyRecipe < Sanji::Recipe
|
24
|
+
|
25
|
+
def prompt
|
26
|
+
# return a string (boolean question) to make this recipe optional
|
27
|
+
end
|
28
|
+
|
29
|
+
def after_create
|
30
|
+
# execute after app is created
|
31
|
+
end
|
32
|
+
|
33
|
+
def after_bundle
|
34
|
+
# execute after bundle
|
35
|
+
end
|
36
|
+
|
37
|
+
def after_everything
|
38
|
+
# execute after "after_bundle"
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
## Local Setup
|
45
|
+
|
46
|
+
- `.bash_profile`
|
47
|
+
```
|
48
|
+
export SANJI_HOME=/path/to/sanji/
|
49
|
+
```
|
50
|
+
|
51
|
+
- `/path/to/sanji/sanji.yml`
|
52
|
+
```ruby
|
53
|
+
cookbook: cookbook_name
|
54
|
+
recipes: /path/to/recipes
|
55
|
+
|
56
|
+
cookbooks:
|
57
|
+
cookbook_name:
|
58
|
+
- recipe_name
|
59
|
+
- other_recipe_name
|
60
|
+
- another_recipe
|
61
|
+
|
62
|
+
my_cookbook:
|
63
|
+
- my_recipe
|
64
|
+
```
|
65
|
+
|
66
|
+
## Inclusions
|
67
|
+
|
68
|
+
- Gems
|
69
|
+
- pg - PostgreSQL adapter.
|
70
|
+
- seedbank - Organize seeds.
|
71
|
+
- annotate - Model annotations.
|
72
|
+
- figaro - Read environment variables.
|
73
|
+
- haml-rails - View template engine.
|
74
|
+
- draper - Decorator for views.
|
75
|
+
- reform - Form objects.
|
76
|
+
- virtus - Coercion for Form objects.
|
77
|
+
- bootstrap-sass - Twitter Bootstrap CSS and Javascripts (optional).
|
78
|
+
- normalize-rails - CSS Reset (if bootstrap is not selected).
|
79
|
+
- paperclip - Attachments for models.
|
80
|
+
- kaminari - Pagination.
|
81
|
+
- thin - Development web server.
|
82
|
+
- quiet_assets - Prevent asset logs.
|
data/lib/sanji/app_builder.rb
CHANGED
@@ -1,53 +1,51 @@
|
|
1
1
|
module Sanji
|
2
2
|
class AppBuilder < Rails::AppBuilder
|
3
3
|
|
4
|
-
RECIPES = [
|
5
|
-
:Setup,
|
6
|
-
:Annotate,
|
7
|
-
:Draper,
|
8
|
-
:Figaro,
|
9
|
-
:Haml,
|
10
|
-
:Paloma,
|
11
|
-
:Postgresql,
|
12
|
-
:Reform,
|
13
|
-
:Seedbank,
|
14
|
-
:Frontend,
|
15
|
-
:SimpleGems,
|
16
|
-
:Controllers,
|
17
|
-
:Devise,
|
18
|
-
:Cleanup
|
19
|
-
]
|
20
|
-
|
21
4
|
def after_create_tasks
|
22
|
-
|
23
|
-
|
5
|
+
self.setup_recipe.run_after_create
|
6
|
+
|
7
|
+
self.recipe_classes.each do |recipe_class|
|
8
|
+
self.get_recipe_instance(recipe_class).run_after_create
|
24
9
|
end
|
10
|
+
|
11
|
+
self.cleanup_recipe.run_after_create
|
25
12
|
end
|
26
13
|
|
27
14
|
def after_bundle_tasks
|
28
|
-
|
29
|
-
|
15
|
+
self.setup_recipe.run_after_bundle
|
16
|
+
|
17
|
+
self.recipe_classes.each do |recipe_class|
|
18
|
+
self.get_recipe_instance(recipe_class).run_after_bundle
|
30
19
|
end
|
20
|
+
|
21
|
+
self.cleanup_recipe.run_after_bundle
|
31
22
|
end
|
32
23
|
|
33
24
|
def after_everything_tasks
|
34
|
-
|
35
|
-
|
25
|
+
self.setup_recipe.run_after_everything
|
26
|
+
|
27
|
+
self.recipe_classes.each do |recipe_class|
|
28
|
+
self.get_recipe_instance(recipe_class).run_after_everything
|
36
29
|
end
|
30
|
+
|
31
|
+
self.cleanup_recipe.run_after_everything
|
37
32
|
end
|
38
33
|
|
39
34
|
|
40
35
|
|
41
36
|
protected
|
42
37
|
|
43
|
-
def
|
44
|
-
|
38
|
+
def recipe_classes
|
39
|
+
Options.instance.recipe_classes
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_recipe_instance recipe_class
|
43
|
+
recipe = self.recipe_instances[recipe_class.name.to_sym]
|
45
44
|
return recipe if recipe
|
46
45
|
|
47
|
-
recipe_class = ::Sanji::Recipes.const_get name
|
48
46
|
recipe = recipe_class.new self
|
49
47
|
|
50
|
-
self.recipe_instances[name] = recipe
|
48
|
+
self.recipe_instances[recipe_class.name.to_sym] = recipe
|
51
49
|
recipe
|
52
50
|
end
|
53
51
|
|
@@ -55,5 +53,13 @@ module Sanji
|
|
55
53
|
@recipe_instances ||= {}
|
56
54
|
end
|
57
55
|
|
56
|
+
def setup_recipe
|
57
|
+
@setup_recipe ||= Sanji::Recipes::Setup.new(self)
|
58
|
+
end
|
59
|
+
|
60
|
+
def cleanup_recipe
|
61
|
+
@cleanup_recipe ||= Sanji::Recipes::Cleanup.new(self)
|
62
|
+
end
|
63
|
+
|
58
64
|
end
|
59
65
|
end
|
data/lib/sanji/config.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
class Sanji::Config
|
4
|
+
|
5
|
+
attr_reader :contents
|
6
|
+
|
7
|
+
def initialize filename = nil
|
8
|
+
@contents = YAML.load_file(filename) if filename
|
9
|
+
end
|
10
|
+
|
11
|
+
def cookbook
|
12
|
+
self.contents['cookbook'] if self.contents
|
13
|
+
end
|
14
|
+
|
15
|
+
def cookbooks
|
16
|
+
self.contents['cookbooks'] if self.contents
|
17
|
+
end
|
18
|
+
|
19
|
+
def has_cookbook? name
|
20
|
+
return false unless self.contents
|
21
|
+
self.cookbooks.has_key? name.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def recipes
|
25
|
+
return [] unless self.contents
|
26
|
+
self.cookbooks[self.cookbook]
|
27
|
+
end
|
28
|
+
|
29
|
+
def recipes_path
|
30
|
+
self.contents['recipes'] if self.contents
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
class Sanji::Options
|
2
|
+
|
3
|
+
DEFAULT_HOME_PATH = "#{File.dirname(__FILE__)}/../"
|
4
|
+
HOME_PATH_ENV_VARIABLE = 'SANJI_HOME'
|
5
|
+
|
6
|
+
CONFIG_FILENAME = 'sanji.yml'
|
7
|
+
SANJI_ITEMS_PREFIX = '_'
|
8
|
+
|
9
|
+
|
10
|
+
def self.instance
|
11
|
+
@instance ||= self.new
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@default_config = Sanji::Config.new "#{DEFAULT_HOME_PATH}/#{CONFIG_FILENAME}"
|
18
|
+
@user_config = self.fetch_user_config
|
19
|
+
end
|
20
|
+
|
21
|
+
def user_recipes_path
|
22
|
+
return nil if self.user_home_path.blank?
|
23
|
+
"#{self.user_home_path}/#{@user_config.recipes_path}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def cookbook
|
27
|
+
@cookbook ||= @user_config.cookbook || @default_config.cookbook
|
28
|
+
end
|
29
|
+
|
30
|
+
def sanji_cookbook?
|
31
|
+
self.is_sanji_item? self.cookbook
|
32
|
+
end
|
33
|
+
|
34
|
+
def recipe_classes
|
35
|
+
@recipes ||=
|
36
|
+
self.cookbook_recipe_names.map do |recipe_name|
|
37
|
+
self.get_recipe_class recipe_name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def cookbook_recipe_names
|
42
|
+
return @cookbook_entry if @cookbook_entry
|
43
|
+
|
44
|
+
cookbook_valid_name = self.valid_item_name self.cookbook
|
45
|
+
|
46
|
+
@cookbook_entry =
|
47
|
+
if self.sanji_cookbook?
|
48
|
+
@default_config.cookbooks[cookbook_valid_name]
|
49
|
+
else
|
50
|
+
@user_config.cookbooks[cookbook_valid_name]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def user_home_path
|
58
|
+
@user_home_path ||= ENV[HOME_PATH_ENV_VARIABLE]
|
59
|
+
end
|
60
|
+
|
61
|
+
def fetch_user_config
|
62
|
+
filename =
|
63
|
+
user_home_path ? "#{self.user_home_path}/#{CONFIG_FILENAME}" : nil
|
64
|
+
|
65
|
+
Sanji::Config.new filename
|
66
|
+
end
|
67
|
+
|
68
|
+
def is_sanji_item? item_name
|
69
|
+
item_name.start_with? SANJI_ITEMS_PREFIX
|
70
|
+
end
|
71
|
+
|
72
|
+
def valid_item_name item_name
|
73
|
+
if self.is_sanji_item? item_name
|
74
|
+
return item_name.sub SANJI_ITEMS_PREFIX, ''
|
75
|
+
end
|
76
|
+
|
77
|
+
item_name
|
78
|
+
end
|
79
|
+
|
80
|
+
def get_recipe_class name
|
81
|
+
recipe_valid_name = self.valid_item_name name
|
82
|
+
recipe_class_name = recipe_valid_name.camelize
|
83
|
+
|
84
|
+
if self.is_sanji_item? name
|
85
|
+
Sanji::Recipes.const_get recipe_class_name
|
86
|
+
else
|
87
|
+
Sanji::Locals.const_get recipe_class_name
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
data/lib/sanji/recipe.rb
CHANGED
@@ -4,21 +4,29 @@ class Sanji::Recipe
|
|
4
4
|
|
5
5
|
def initialize builder
|
6
6
|
@a = Sanji::Assistant.new self, builder
|
7
|
+
@disabled = false
|
7
8
|
end
|
8
9
|
|
9
10
|
def run_after_create
|
11
|
+
@disabled = a.no?(self.prompt) if self.prompt.present?
|
12
|
+
return if @disabled
|
13
|
+
|
10
14
|
a.log_start :after_create
|
11
15
|
self.after_create
|
12
16
|
a.log_end :after_create
|
13
17
|
end
|
14
18
|
|
15
19
|
def run_after_bundle
|
20
|
+
return if @disabled
|
21
|
+
|
16
22
|
a.log_start :after_bundle
|
17
23
|
self.after_bundle
|
18
24
|
a.log_end :after_bundle
|
19
25
|
end
|
20
26
|
|
21
27
|
def run_after_everything
|
28
|
+
return if @disabled
|
29
|
+
|
22
30
|
a.log_start :after_everything
|
23
31
|
self.after_everything
|
24
32
|
a.log_end :after_everything
|
@@ -33,4 +41,7 @@ class Sanji::Recipe
|
|
33
41
|
def after_everything
|
34
42
|
end
|
35
43
|
|
44
|
+
def prompt
|
45
|
+
end
|
46
|
+
|
36
47
|
end
|
data/lib/sanji/recipes/draper.rb
CHANGED
data/lib/sanji.rb
CHANGED
@@ -2,24 +2,37 @@ module Sanji
|
|
2
2
|
module Recipes
|
3
3
|
end
|
4
4
|
|
5
|
+
module Locals
|
6
|
+
end
|
7
|
+
|
5
8
|
module Utilities
|
6
9
|
end
|
7
10
|
end
|
8
11
|
|
12
|
+
require 'sanji/config'
|
13
|
+
require 'sanji/options'
|
14
|
+
|
9
15
|
# Require all utilities
|
10
16
|
Dir["#{File.dirname(__FILE__)}/sanji/utilities/*.rb"].each do |filename|
|
11
17
|
require filename.sub('.rb', '')
|
12
18
|
end
|
13
19
|
|
14
|
-
|
15
20
|
require 'sanji/assistant'
|
16
21
|
require 'sanji/recipe'
|
22
|
+
require 'sanji/app_generator'
|
23
|
+
require 'sanji/app_builder'
|
17
24
|
|
18
25
|
# Require all recipes
|
19
26
|
Dir["#{File.dirname(__FILE__)}/sanji/recipes/*.rb"].each do |filename|
|
20
27
|
require filename.sub('.rb', '')
|
21
28
|
end
|
22
29
|
|
23
|
-
|
24
|
-
|
30
|
+
# Require user recipes
|
31
|
+
if Sanji::Options.instance.user_recipes_path
|
32
|
+
Dir["#{Sanji::Options.instance.user_recipes_path}/*.rb"].each do |filename|
|
33
|
+
require filename.sub('.rb', '')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
25
38
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sanji
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.pre
|
4
|
+
version: 1.0.0.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Paragua
|
@@ -23,6 +23,8 @@ files:
|
|
23
23
|
- lib/sanji/app_builder.rb
|
24
24
|
- lib/sanji/app_generator.rb
|
25
25
|
- lib/sanji/assistant.rb
|
26
|
+
- lib/sanji/config.rb
|
27
|
+
- lib/sanji/options.rb
|
26
28
|
- lib/sanji/recipe.rb
|
27
29
|
- lib/sanji/recipes/annotate.rb
|
28
30
|
- lib/sanji/recipes/cleanup.rb
|