sanji 1.0.0.pre → 1.0.0.pre.1
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 +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
|

|
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
|