sanji 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: db57a4e0739187f622d2dfd0e997135ac62bb85d
4
+ data.tar.gz: fa9dc9a29f35da36a0cd46150927a579bfda400e
5
+ SHA512:
6
+ metadata.gz: 399f7e0e08d027a55c717a2bdcd0522adb6433e9b79d3f369a0ee14f5d8c3ddc583f584daaba233bfc9ec25f707bcbfe7cc2a57f0d247ce5c07bbf10d7c05e61
7
+ data.tar.gz: 18aed75ec1c1fe017eb316bf603c206ed6e6ac705c1630aec79232743ede32923a7200eb40c1412ec8cd8ff159d69c5660f1e5952b4f94f25547f2ffc0b378c9
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # sanji
2
+
3
+ ![sanji](http://icons.iconarchive.com/icons/crountch/one-piece-character/256/Sanji-icon.png)
data/bin/sanji ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'sanji'
4
+
5
+ templates_root =
6
+ File.expand_path(File.join('..', 'templates'), File.dirname(__FILE__))
7
+
8
+ Sanji::AppGenerator.source_root templates_root
9
+
10
+ Sanji::AppGenerator.source_paths <<
11
+ Rails::Generators::AppGenerator.source_root <<
12
+ templates_root
13
+
14
+ Sanji::AppGenerator.start
@@ -0,0 +1,59 @@
1
+ module Sanji
2
+ class AppBuilder < Rails::AppBuilder
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
+ def after_create_tasks
22
+ RECIPES.each do |name|
23
+ self.get_recipe_instance(name).run_after_create
24
+ end
25
+ end
26
+
27
+ def after_bundle_tasks
28
+ RECIPES.each do |name|
29
+ self.get_recipe_instance(name).run_after_bundle
30
+ end
31
+ end
32
+
33
+ def after_everything_tasks
34
+ RECIPES.each do |name|
35
+ self.get_recipe_instance(name).run_after_everything
36
+ end
37
+ end
38
+
39
+
40
+
41
+ protected
42
+
43
+ def get_recipe_instance name
44
+ recipe = self.recipe_instances[name]
45
+ return recipe if recipe
46
+
47
+ recipe_class = ::Sanji::Recipes.const_get name
48
+ recipe = recipe_class.new self
49
+
50
+ self.recipe_instances[name] = recipe
51
+ recipe
52
+ end
53
+
54
+ def recipe_instances
55
+ @recipe_instances ||= {}
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,39 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/rails/app/app_generator'
3
+
4
+ module Sanji
5
+ class AppGenerator < Rails::Generators::AppGenerator
6
+
7
+ def finish_template
8
+ invoke :sanji_after_create_tasks
9
+ super
10
+ end
11
+
12
+ def run_after_bundle_callbacks
13
+ invoke :sanji_after_bundle_tasks
14
+ super
15
+ invoke :sanji_after_everything_tasks
16
+ end
17
+
18
+ def sanji_after_create_tasks
19
+ build :after_create_tasks
20
+ end
21
+
22
+ def sanji_after_bundle_tasks
23
+ build :after_bundle_tasks
24
+ end
25
+
26
+ def sanji_after_everything_tasks
27
+ build :after_everything_tasks
28
+ end
29
+
30
+
31
+
32
+ protected
33
+
34
+ def get_builder_class
35
+ Sanji::AppBuilder
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,96 @@
1
+ class Sanji::Assistant
2
+
3
+ attr_reader :builder
4
+
5
+ def initialize recipe, builder
6
+ @recipe = recipe
7
+ @builder = builder
8
+ end
9
+
10
+ def method_missing name, *args, &block
11
+ self.builder.send name, *args, &block
12
+ end
13
+
14
+
15
+
16
+ def text &block
17
+ Sanji::Utilities::Text.create &block
18
+ end
19
+
20
+ def generator name, value
21
+ self.builder.insert_into_file 'config/application.rb',
22
+ self.text { |t| t.indent(3).puts "g.#{name} #{value}" },
23
+ :after => "# sanji-generators\n"
24
+ end
25
+
26
+
27
+ # `block` will have an Sanji::Utilities::Text instance as an argument.
28
+ def application_config &block
29
+ config = self.text &block
30
+
31
+ self.builder.insert_into_file 'config/application.rb', config,
32
+ :after => "class Application < Rails::Application\n"
33
+ end
34
+
35
+ def bundle_exec command = ''
36
+ self.builder.run "bundle exec #{command}"
37
+ end
38
+
39
+ def add_gem name, version_or_options = nil, extra = nil
40
+ first_arg =
41
+ if version_or_options.is_a? String
42
+ "'#{version_or_options}'"
43
+ else
44
+ version_or_options.to_s.gsub /\{|\}/, ''
45
+ end
46
+
47
+ second_arg = extra.to_s.gsub(/\{|\}/, '') if extra
48
+
49
+ values = ["'#{name}'", first_arg, second_arg].reject &:blank?
50
+ entry = values.join ', '
51
+
52
+ self.builder.insert_into_file 'Gemfile', :after => "# sanji-gems\n" do
53
+ "gem #{entry}\n"
54
+ end
55
+ end
56
+
57
+ def remove_gem name
58
+ self.builder.gsub_file 'Gemfile',
59
+ Regexp.new("^\\s*gem ('|\")#{name}('|\").*\\n"), ''
60
+ end
61
+
62
+ def delete_file filename
63
+ self.builder.run "rm #{filename}"
64
+ end
65
+
66
+ def log_start method_name
67
+ self.say "start ##{method_name}"
68
+ end
69
+
70
+ def log_end method_name
71
+ self.say "end ##{method_name}"
72
+ end
73
+
74
+ def say text
75
+ self.builder.say recipe_message(text), Thor::Shell::Color::YELLOW
76
+ end
77
+
78
+ def ask question
79
+ self.builder.ask recipe_message(question)
80
+ end
81
+
82
+ def yes? question
83
+ self.builder.yes? recipe_message("#{question} (y/n)")
84
+ end
85
+
86
+ def no? question
87
+ self.builder.no? recipe_message("#{question} (y/n)")
88
+ end
89
+
90
+ private
91
+
92
+ def recipe_message message = ''
93
+ "#{@recipe.class.name} -> #{message}"
94
+ end
95
+
96
+ end
@@ -0,0 +1,36 @@
1
+ class Sanji::Recipe
2
+
3
+ attr_reader :a
4
+
5
+ def initialize builder
6
+ @a = Sanji::Assistant.new self, builder
7
+ end
8
+
9
+ def run_after_create
10
+ a.log_start :after_create
11
+ self.after_create
12
+ a.log_end :after_create
13
+ end
14
+
15
+ def run_after_bundle
16
+ a.log_start :after_bundle
17
+ self.after_bundle
18
+ a.log_end :after_bundle
19
+ end
20
+
21
+ def run_after_everything
22
+ a.log_start :after_everything
23
+ self.after_everything
24
+ a.log_end :after_everything
25
+ end
26
+
27
+ def after_create
28
+ end
29
+
30
+ def after_bundle
31
+ end
32
+
33
+ def after_everything
34
+ end
35
+
36
+ end
@@ -0,0 +1,11 @@
1
+ class Sanji::Recipes::Annotate < Sanji::Recipe
2
+
3
+ def after_create
4
+ a.add_gem 'annotate'
5
+ end
6
+
7
+ def after_bundle
8
+ a.generate 'annotate:install'
9
+ end
10
+
11
+ end
@@ -0,0 +1,19 @@
1
+ class Sanji::Recipes::Cleanup < Sanji::Recipe
2
+
3
+ def after_everything
4
+ # remove all helper comments from Setup recipe.
5
+ [
6
+ 'config/application.rb',
7
+ 'Gemfile'
8
+ ].each { |file| a.gsub_file file, /^\s*# sanji.*\n/, '' }
9
+
10
+ self.remove_gemfile_comments
11
+ end
12
+
13
+ protected
14
+
15
+ def remove_gemfile_comments
16
+ a.gsub_file 'Gemfile', /^\s*#.*\n/, ''
17
+ end
18
+
19
+ end
@@ -0,0 +1,80 @@
1
+ class Sanji::Recipes::Controllers < Sanji::Recipe
2
+
3
+ def after_bundle
4
+ self.setup_public
5
+
6
+ self.setup_admin if self.has_admin?
7
+ self.setup_private if self.has_private?
8
+ end
9
+
10
+ protected
11
+
12
+ def has_admin?
13
+ a.yes? 'Create admin namespace?'
14
+ end
15
+
16
+ def has_private?
17
+ a.yes? 'Create private module for logged-in non-admin users?'
18
+ end
19
+
20
+ def has_homepage?
21
+ a.yes? 'Create controller for public home page?'
22
+ end
23
+
24
+ def setup_admin
25
+ a.generate 'controller', 'admin/base'
26
+
27
+ a.inside 'app/views/admin' do
28
+ a.run 'rm -R base'
29
+ end
30
+
31
+ route =
32
+ a.text do |t|
33
+ t.indent.puts 'namespace :admin do'
34
+ t.indent.puts 'end'
35
+ end
36
+
37
+ a.route route
38
+ end
39
+
40
+ def setup_private
41
+ a.generate 'controller', 'private/base'
42
+
43
+ a.inside 'app/views/private' do
44
+ a.run 'rm -R base'
45
+ end
46
+
47
+ route =
48
+ a.text do |t|
49
+ t.indent.puts 'scope :module => :private do'
50
+ t.indent.puts 'end'
51
+ end
52
+
53
+ a.route route
54
+ end
55
+
56
+ def setup_public
57
+ a.generate 'controller', 'public/base'
58
+
59
+ a.inside 'app/views/public' do
60
+ a.run 'rm -R base'
61
+ end
62
+
63
+ if self.has_homepage?
64
+ a.copy_file 'public_home_controller.rb',
65
+ 'app/controller/public/home_controller.rb'
66
+
67
+ a.template 'public_home_index.haml.erb', 'app/views/public/home/index.haml'
68
+
69
+ a.route "root :to => 'public/home#index'"
70
+
71
+ # Change public namespace to module only.
72
+ a.gsub_file 'config/routes.rb',
73
+ /namespace :public/,
74
+ 'scope :module => :public'
75
+ else
76
+ a.route "scope :module => :public do\n end"
77
+ end
78
+ end
79
+
80
+ end
@@ -0,0 +1,15 @@
1
+ class Sanji::Recipes::Devise < Sanji::Recipe
2
+
3
+ def after_create
4
+ a.add_gem 'devise', '~> 3.0.0'
5
+ end
6
+
7
+ def after_bundle
8
+ a.generate 'devise:install'
9
+ a.generate 'devise:views'
10
+ a.generate 'devise User'
11
+
12
+ a.rake 'db:migrate'
13
+ end
14
+
15
+ end
@@ -0,0 +1,14 @@
1
+ class Sanji::Recipes::Draper < Sanji::Recipe
2
+
3
+ def after_create
4
+ a.add_gem 'draper'
5
+ a.generator :decorator, false
6
+ end
7
+
8
+ def after_bundle
9
+ a.create_file 'app/decorators/application_decorator.rb' do
10
+ "class ApplicationDecorator < Draper::Decorator\nend"
11
+ end
12
+ end
13
+
14
+ end
@@ -0,0 +1,22 @@
1
+ class Sanji::Recipes::Figaro < Sanji::Recipe
2
+
3
+ def after_create
4
+ a.add_gem 'figaro'
5
+
6
+ self.create_application_yml_sample
7
+ end
8
+
9
+ def after_bundle
10
+ a.bundle_exec 'figaro install'
11
+ end
12
+
13
+ protected
14
+
15
+ def create_application_yml_sample
16
+ a.create_file 'config/application.sample.yml' do
17
+ "# This will be the template for application.yml\n" \
18
+ "# Put all valid keys here and their sample values."
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,47 @@
1
+ class Sanji::Recipes::Frontend < Sanji::Recipe
2
+
3
+ def after_create
4
+ self.application_css_to_scss
5
+
6
+ if self.use_bootstrap?
7
+ self.setup_bootstrap
8
+ else
9
+ self.setup_normalize
10
+ end
11
+ end
12
+
13
+ protected
14
+
15
+ def application_css_to_scss
16
+ a.inside 'app/assets/stylesheets' do
17
+ a.run 'mv application.css application.scss'
18
+ end
19
+ end
20
+
21
+ def use_bootstrap?
22
+ a.yes? 'Use twitter bootstrap css and javascripts?'
23
+ end
24
+
25
+ def setup_bootstrap
26
+ a.add_gem 'bootstrap-sass'
27
+
28
+ a.insert_into_file 'app/assets/stylesheets/application.scss',
29
+ :after => "*/\n" do
30
+ "@import 'bootstrap-sprockets';\n" \
31
+ "@import 'bootstrap';\n"
32
+ end
33
+
34
+ a.insert_into_file 'app/assets/javascripts/application.js',
35
+ "//= require bootstrap-sprockets\n",
36
+ :after => "//= require jquery\n"
37
+ end
38
+
39
+ def setup_normalize
40
+ a.add_gem 'normalize-rails'
41
+
42
+ a.insert_into_file 'app/assets/stylesheets/application.scss',
43
+ "@import 'normalize-rails';\n",
44
+ :after => "*/\n"
45
+ end
46
+
47
+ end
@@ -0,0 +1,11 @@
1
+ class Sanji::Recipes::Haml < Sanji::Recipe
2
+
3
+ def after_create
4
+ a.add_gem 'haml-rails'
5
+ end
6
+
7
+ def after_everything
8
+ a.rake 'haml:erb2haml'
9
+ end
10
+
11
+ end
@@ -0,0 +1,9 @@
1
+ class Sanji::Recipes::Paloma < Sanji::Recipe
2
+
3
+ def after_create
4
+ a.insert_into_file 'app/assets/javascripts/application.js',
5
+ "//= require paloma\n",
6
+ :after => "//= require jquery_ujs\n"
7
+ end
8
+
9
+ end
@@ -0,0 +1,23 @@
1
+ class Sanji::Recipes::Postgresql < Sanji::Recipe
2
+
3
+ def after_create
4
+ a.remove_gem 'sqlite3'
5
+ a.add_gem 'pg'
6
+
7
+ self.create_database_yml
8
+ end
9
+
10
+
11
+ protected
12
+
13
+ def create_database_yml
14
+ username = a.ask 'Development database username?'
15
+ password = a.ask 'Development database password?'
16
+
17
+ a.delete_file 'config/database.yml'
18
+ a.template 'database.yml.erb', 'config/database.yml',
19
+ :username => username,
20
+ :password => password
21
+ end
22
+
23
+ end
@@ -0,0 +1,12 @@
1
+ class Sanji::Recipes::Reform < Sanji::Recipe
2
+
3
+ def after_create
4
+ a.add_gem 'reform'
5
+ a.add_gem 'virtus'
6
+ end
7
+
8
+ def after_bundle
9
+ a.copy_file 'base_form.rb', 'app/forms/base_form.rb'
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ class Sanji::Recipes::Seedbank < Sanji::Recipe
2
+
3
+ def after_create
4
+ a.add_gem 'seedbank'
5
+
6
+ [:development, :staging, :production].each do |env|
7
+ a.create_file "db/seeds/#{env}/main.seeds.rb",
8
+ "# rake db:seed:#{env}:main"
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,25 @@
1
+ class Sanji::Recipes::Setup < Sanji::Recipe
2
+
3
+ def after_create
4
+ self.add_generators_block
5
+ self.add_gemfile_marker
6
+ end
7
+
8
+
9
+ protected
10
+
11
+ def add_generators_block
12
+ a.application_config do |t|
13
+ t.indent(2).puts 'config.generators do |g|'
14
+ t.indent(3).puts '# sanji-generators'
15
+ t.indent(2).puts 'end'
16
+ end
17
+ end
18
+
19
+ def add_gemfile_marker
20
+ a.append_to_file 'Gemfile' do
21
+ "# sanji-gems\n"
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,11 @@
1
+ class Sanji::Recipes::SimpleGems < Sanji::Recipe
2
+
3
+ def after_create
4
+ [:paperclip, :kaminari].each { |name| a.add_gem name }
5
+
6
+ [:thin, :quiet_assets].each do |name|
7
+ a.add_gem name, :group => [:development, :test]
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,37 @@
1
+ class Sanji::Utilities::Text
2
+
3
+ attr_reader :value
4
+
5
+
6
+ def self.create &block
7
+ instance = self.new
8
+ block.call instance
9
+
10
+ instance.value
11
+ end
12
+
13
+
14
+ def initialize
15
+ @value = ''
16
+ end
17
+
18
+ def puts text = ''
19
+ self.value << "#{text}\n"
20
+ self
21
+ end
22
+
23
+ def print text = ''
24
+ self.value << "#{text}"
25
+ self
26
+ end
27
+
28
+ def indent quantity = 1
29
+ self.value << (' ' * quantity)
30
+ self
31
+ end
32
+
33
+ def empty_line
34
+ self.puts
35
+ end
36
+
37
+ end
data/lib/sanji.rb ADDED
@@ -0,0 +1,25 @@
1
+ module Sanji
2
+ module Recipes
3
+ end
4
+
5
+ module Utilities
6
+ end
7
+ end
8
+
9
+ # Require all utilities
10
+ Dir["#{File.dirname(__FILE__)}/sanji/utilities/*.rb"].each do |filename|
11
+ require filename.sub('.rb', '')
12
+ end
13
+
14
+
15
+ require 'sanji/assistant'
16
+ require 'sanji/recipe'
17
+
18
+ # Require all recipes
19
+ Dir["#{File.dirname(__FILE__)}/sanji/recipes/*.rb"].each do |filename|
20
+ require filename.sub('.rb', '')
21
+ end
22
+
23
+ require 'sanji/app_generator'
24
+ require 'sanji/app_builder'
25
+
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sanji
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre
5
+ platform: ruby
6
+ authors:
7
+ - Karl Paragua
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-09 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: rails application generator
14
+ email: kb.paragua@gmail.com
15
+ executables:
16
+ - sanji
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - README.md
21
+ - bin/sanji
22
+ - lib/sanji.rb
23
+ - lib/sanji/app_builder.rb
24
+ - lib/sanji/app_generator.rb
25
+ - lib/sanji/assistant.rb
26
+ - lib/sanji/recipe.rb
27
+ - lib/sanji/recipes/annotate.rb
28
+ - lib/sanji/recipes/cleanup.rb
29
+ - lib/sanji/recipes/controllers.rb
30
+ - lib/sanji/recipes/devise.rb
31
+ - lib/sanji/recipes/draper.rb
32
+ - lib/sanji/recipes/figaro.rb
33
+ - lib/sanji/recipes/frontend.rb
34
+ - lib/sanji/recipes/haml.rb
35
+ - lib/sanji/recipes/paloma.rb
36
+ - lib/sanji/recipes/postgresql.rb
37
+ - lib/sanji/recipes/reform.rb
38
+ - lib/sanji/recipes/seedbank.rb
39
+ - lib/sanji/recipes/setup.rb
40
+ - lib/sanji/recipes/simple_gems.rb
41
+ - lib/sanji/utilities/text.rb
42
+ homepage: https://www.github.com/kbparagua/sanji
43
+ licenses:
44
+ - MIT
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">"
58
+ - !ruby/object:Gem::Version
59
+ version: 1.3.1
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 2.4.5.1
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: rails application generator
66
+ test_files: []