choco 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/HISTORY +3 -0
  4. data/LICENSE +20 -0
  5. data/README.rdoc +326 -0
  6. data/Rakefile +55 -0
  7. data/bin/choco +45 -0
  8. data/choco.gemspec +98 -0
  9. data/lib/choco.rb +16 -0
  10. data/lib/choco/cli.rb +75 -0
  11. data/lib/choco/dependency_manager.rb +92 -0
  12. data/lib/choco/generators/app_generator.rb +72 -0
  13. data/lib/choco/generators/controller_generator.rb +21 -0
  14. data/lib/choco/generators/layout_generator.rb +19 -0
  15. data/lib/choco/generators/model_generator.rb +20 -0
  16. data/lib/choco/generators/plugin_generator.rb +20 -0
  17. data/lib/choco/generators/scaffold_generator.rb +65 -0
  18. data/lib/choco/generators/templates/Jimfile +24 -0
  19. data/lib/choco/generators/templates/README.rdoc +3 -0
  20. data/lib/choco/generators/templates/Rakefile +25 -0
  21. data/lib/choco/generators/templates/application.css +1 -0
  22. data/lib/choco/generators/templates/choco +7 -0
  23. data/lib/choco/generators/templates/controllers/application_controller.js +33 -0
  24. data/lib/choco/generators/templates/controllers/base_controller.js +6 -0
  25. data/lib/choco/generators/templates/controllers/rest_controller.js +53 -0
  26. data/lib/choco/generators/templates/help/commands +12 -0
  27. data/lib/choco/generators/templates/help/generators +33 -0
  28. data/lib/choco/generators/templates/helpers/application_helper.js +7 -0
  29. data/lib/choco/generators/templates/index.html +16 -0
  30. data/lib/choco/generators/templates/lib/plugin.js +40 -0
  31. data/lib/choco/generators/templates/models/base.js +7 -0
  32. data/lib/choco/generators/templates/views/edit.template +14 -0
  33. data/lib/choco/generators/templates/views/index.template +32 -0
  34. data/lib/choco/generators/templates/views/layout.js +4 -0
  35. data/lib/choco/generators/templates/views/main/index.template +1 -0
  36. data/lib/choco/generators/templates/views/new.template +14 -0
  37. data/lib/choco/generators/templates/views/show.template +10 -0
  38. data/spec/choco_spec.rb +7 -0
  39. data/spec/spec.opts +1 -0
  40. data/spec/spec_helper.rb +9 -0
  41. metadata +164 -0
@@ -0,0 +1,98 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{choco}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Anthony Heukmes"]
12
+ s.date = %q{2010-07-23}
13
+ s.default_executable = %q{choco}
14
+ s.description = %q{Choco brings the MVC to the client side! It allows you to easily develop maintainable Rich Internet Applications using Javascript.}
15
+ s.email = %q{anthony.heukmes@skynet.be}
16
+ s.executables = ["choco"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.rdoc"
20
+ ]
21
+ s.files = [
22
+ ".document",
23
+ ".gitignore",
24
+ "HISTORY",
25
+ "LICENSE",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "bin/choco",
29
+ "choco.gemspec",
30
+ "lib/choco.rb",
31
+ "lib/choco/cli.rb",
32
+ "lib/choco/dependency_manager.rb",
33
+ "lib/choco/generators/app_generator.rb",
34
+ "lib/choco/generators/controller_generator.rb",
35
+ "lib/choco/generators/layout_generator.rb",
36
+ "lib/choco/generators/model_generator.rb",
37
+ "lib/choco/generators/plugin_generator.rb",
38
+ "lib/choco/generators/scaffold_generator.rb",
39
+ "lib/choco/generators/templates/Jimfile",
40
+ "lib/choco/generators/templates/README.rdoc",
41
+ "lib/choco/generators/templates/Rakefile",
42
+ "lib/choco/generators/templates/application.css",
43
+ "lib/choco/generators/templates/choco",
44
+ "lib/choco/generators/templates/controllers/application_controller.js",
45
+ "lib/choco/generators/templates/controllers/base_controller.js",
46
+ "lib/choco/generators/templates/controllers/rest_controller.js",
47
+ "lib/choco/generators/templates/help/commands",
48
+ "lib/choco/generators/templates/help/generators",
49
+ "lib/choco/generators/templates/helpers/application_helper.js",
50
+ "lib/choco/generators/templates/index.html",
51
+ "lib/choco/generators/templates/lib/plugin.js",
52
+ "lib/choco/generators/templates/models/base.js",
53
+ "lib/choco/generators/templates/views/edit.template",
54
+ "lib/choco/generators/templates/views/index.template",
55
+ "lib/choco/generators/templates/views/layout.js",
56
+ "lib/choco/generators/templates/views/main/index.template",
57
+ "lib/choco/generators/templates/views/new.template",
58
+ "lib/choco/generators/templates/views/show.template",
59
+ "spec/choco_spec.rb",
60
+ "spec/spec.opts",
61
+ "spec/spec_helper.rb"
62
+ ]
63
+ s.homepage = %q{http://github.com/ahe/choco}
64
+ s.rdoc_options = ["--charset=UTF-8"]
65
+ s.require_paths = ["lib"]
66
+ s.rubygems_version = %q{1.3.6}
67
+ s.summary = %q{A delicious Javascript web framework made in Belgium!}
68
+ s.test_files = [
69
+ "spec/choco_spec.rb",
70
+ "spec/spec_helper.rb"
71
+ ]
72
+
73
+ if s.respond_to? :specification_version then
74
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
75
+ s.specification_version = 3
76
+
77
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
78
+ s.add_runtime_dependency(%q<jim>, [">= 0"])
79
+ s.add_runtime_dependency(%q<fssm>, [">= 0"])
80
+ s.add_runtime_dependency(%q<thor>, [">= 0"])
81
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
82
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
83
+ else
84
+ s.add_dependency(%q<jim>, [">= 0"])
85
+ s.add_dependency(%q<fssm>, [">= 0"])
86
+ s.add_dependency(%q<thor>, [">= 0"])
87
+ s.add_dependency(%q<activesupport>, [">= 0"])
88
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
89
+ end
90
+ else
91
+ s.add_dependency(%q<jim>, [">= 0"])
92
+ s.add_dependency(%q<fssm>, [">= 0"])
93
+ s.add_dependency(%q<thor>, [">= 0"])
94
+ s.add_dependency(%q<activesupport>, [">= 0"])
95
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
96
+ end
97
+ end
98
+
@@ -0,0 +1,16 @@
1
+ require 'thor'
2
+ require 'thor/group'
3
+ require 'active_support/inflector'
4
+
5
+ module Choco
6
+ VERSION = '0.1.0'
7
+
8
+ autoload :DependencyManager, 'choco/dependency_manager'
9
+ autoload :CLI, 'choco/cli'
10
+ autoload :AppGenerator, 'choco/generators/app_generator'
11
+ autoload :ControllerGenerator, 'choco/generators/controller_generator'
12
+ autoload :LayoutGenerator, 'choco/generators/layout_generator'
13
+ autoload :ModelGenerator, 'choco/generators/model_generator'
14
+ autoload :PluginGenerator, 'choco/generators/plugin_generator'
15
+ autoload :ScaffoldGenerator, 'choco/generators/scaffold_generator'
16
+ end
@@ -0,0 +1,75 @@
1
+ require 'pathname'
2
+
3
+ module Choco
4
+
5
+ class CLI
6
+
7
+ def initialize(args)
8
+ @args = args
9
+ @output = ""
10
+ end
11
+
12
+ def run
13
+ @args << '--help' if @args.empty?
14
+
15
+ aliases = {
16
+ "g" => "generate"
17
+ }
18
+
19
+ command = @args.shift
20
+ command = aliases[command] || command
21
+
22
+ case command
23
+ when 'generate'
24
+ name = @args.shift
25
+ if name
26
+ klass = eval("Choco::#{name.capitalize}Generator")
27
+ klass.start @args
28
+ else
29
+ @output = template('generators')
30
+ end
31
+
32
+ when '--watch'
33
+ require 'fssm'
34
+
35
+ puts "*** Choco is now watching your JS files..."
36
+
37
+ system "jim bundle #{Choco::DependencyManager.to}"
38
+
39
+ FSSM.monitor(Dir.pwd, ['**/*.js', 'Jimfile']) do
40
+ update do |base, relative|
41
+ unless relative.include?('bundled.js')
42
+ puts "*** #{relative} changed!"
43
+ system "jim bundle #{Choco::DependencyManager.to}"
44
+ end
45
+ end
46
+
47
+ create do |base, relative|
48
+ unless relative.include?('bundled.js')
49
+ puts "*** #{relative} created!"
50
+ Choco::DependencyManager.add_dependency(relative)
51
+ system "jim bundle #{Choco::DependencyManager.to}"
52
+ end
53
+ end
54
+
55
+ delete do |base, relative|
56
+ puts "*** #{relative} deleted!"
57
+ Choco::DependencyManager.remove_dependency(relative)
58
+ system "jim bundle #{Choco::DependencyManager.to}"
59
+ end
60
+ end
61
+ else
62
+ @output = template('commands')
63
+ end
64
+
65
+ @output
66
+ end
67
+
68
+ private
69
+
70
+ def template(path)
71
+ (Pathname.new(__FILE__).dirname + 'generators/templates/help/' + path).read
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,92 @@
1
+ module Choco
2
+ class DependencyManager
3
+
4
+ @@to = 'lib/bundled.js'
5
+
6
+ def self.to
7
+ @@to
8
+ end
9
+
10
+ def self.add_dependency(filename)
11
+ filename = remove_extension(filename)
12
+
13
+ if filename.include?('controllers/')
14
+ type = 'Controller'
15
+ elsif filename.include?('helpers/')
16
+ type = 'Helper'
17
+ elsif filename.include?('models/')
18
+ type = 'Model'
19
+ else
20
+ type = 'Libs'
21
+ end
22
+
23
+
24
+ already_present = false
25
+ File.new('Jimfile', "r").each do |line|
26
+ if line.include?(filename)
27
+ already_present = true
28
+ break
29
+ end
30
+ end
31
+
32
+ unless already_present
33
+ jimfile = ""
34
+ File.new('Jimfile', "r").each do |line|
35
+ jimfile << line
36
+ if line.include?("// #{type}")
37
+ jimfile << "#{filename}\n"
38
+ end
39
+ end
40
+
41
+ File.open('Jimfile', "wb") { |io| io.print jimfile }
42
+
43
+ if type == 'Controller' || type == 'Helper'
44
+ application_controller = ""
45
+ file = extract_filename(filename)
46
+
47
+ File.new('app/controllers/application_controller.js', "r").each do |line|
48
+ application_controller << line
49
+ if line.include?("/* Configure your #{type.downcase.pluralize} here")
50
+ if type == 'Helper'
51
+ application_controller << "\tthis.helpers(#{file});\n"
52
+ else
53
+ application_controller << "\t#{file}(this);\n"
54
+ end
55
+ end
56
+ end
57
+
58
+ File.open('app/controllers/application_controller.js', "wb") { |io| io.print application_controller }
59
+ end
60
+ end
61
+ end
62
+
63
+ def self.remove_dependency(filename)
64
+ filename = remove_extension(filename)
65
+
66
+ jimfile = ""
67
+ File.new('Jimfile', "r").each do |line|
68
+ jimfile << line unless line.include?(filename)
69
+ end
70
+
71
+ File.open('Jimfile', "wb") { |io| io.print jimfile }
72
+
73
+ file = extract_filename(filename)
74
+ application_controller = ""
75
+ File.new('app/controllers/application_controller.js', "r").each do |line|
76
+ application_controller << line unless line.include?(filename)
77
+ end
78
+
79
+ File.open('app/controllers/application_controller.js', "wb") { |io| io.print application_controller }
80
+ end
81
+
82
+ private
83
+
84
+ def self.remove_extension(filename)
85
+ filename.gsub('.js', '')
86
+ end
87
+
88
+ def self.extract_filename(filename)
89
+ filename.to_s.split('/').last.camelcase
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,72 @@
1
+ module Choco
2
+ class AppGenerator < Thor::Group
3
+ include Thor::Actions
4
+
5
+ def self.source_root
6
+ File.dirname(__FILE__)
7
+ end
8
+
9
+ desc 'Generates a delicious Choco app'
10
+ argument :name
11
+
12
+ def create_root_folder
13
+ empty_directory name
14
+ end
15
+
16
+ def create_app_folder
17
+ empty_directory "#{name}/app"
18
+ empty_directory "#{name}/app/controllers"
19
+ empty_directory "#{name}/app/models"
20
+ empty_directory "#{name}/app/views"
21
+ empty_directory "#{name}/app/views/main"
22
+ empty_directory "#{name}/app/views/layouts"
23
+ empty_directory "#{name}/app/helpers"
24
+
25
+ template('templates/controllers/application_controller.js', "#{name}/app/controllers/application_controller.js")
26
+ template('templates/views/main/index.template', "#{name}/app/views/main/index.template")
27
+ template('templates/helpers/application_helper.js', "#{name}/app/helpers/application_helper.js")
28
+ end
29
+
30
+ def create_lib_folder
31
+ empty_directory "#{name}/lib"
32
+ end
33
+
34
+ def create_compressed_folder
35
+ empty_directory "#{name}/compressed"
36
+ end
37
+
38
+ def create_images_folder
39
+ empty_directory "#{name}/images"
40
+ end
41
+
42
+ def create_stylesheets_folder
43
+ empty_directory "#{name}/stylesheets"
44
+ template('templates/application.css', "#{name}/stylesheets/application.css")
45
+ end
46
+
47
+ def create_spec_folder
48
+ empty_directory "#{name}/spec"
49
+ end
50
+
51
+ def create_script_folder
52
+ empty_directory "#{name}/script"
53
+ template('templates/choco', "#{name}/script/choco")
54
+ end
55
+
56
+ def create_jimfile
57
+ template('templates/Jimfile', "#{name}/Jimfile")
58
+ end
59
+
60
+ def create_rakefile
61
+ template('templates/Rakefile', "#{name}/Rakefile")
62
+ end
63
+
64
+ def create_readme_file
65
+ create_file "#{name}/README.rdoc"
66
+ end
67
+
68
+ def create_index_file
69
+ template('templates/index.html', "#{name}/index.html")
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,21 @@
1
+ module Choco
2
+ class ControllerGenerator < Thor::Group
3
+ include Thor::Actions
4
+
5
+ def self.source_root
6
+ File.dirname(__FILE__)
7
+ end
8
+
9
+ desc 'Generates a Choco controller'
10
+ argument :name
11
+
12
+ def create_controller_file
13
+ template('templates/controllers/base_controller.js', "app/controllers/#{name}_controller.js")
14
+ end
15
+
16
+ def create_views_folder
17
+ empty_directory "app/views/#{name}"
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Choco
2
+ class LayoutGenerator < Thor::Group
3
+ include Thor::Actions
4
+
5
+ def self.source_root
6
+ File.dirname(__FILE__)
7
+ end
8
+
9
+ desc 'Generates a Choco layout'
10
+ argument :name
11
+
12
+ def create_model_file
13
+ @layout_name = name.camelcase.singularize
14
+ @name = name.underscore.singularize
15
+ template('templates/views/layout.js', "app/views/layouts/#{@name}.js")
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module Choco
2
+ class ModelGenerator < Thor::Group
3
+ include Thor::Actions
4
+
5
+ def self.source_root
6
+ File.dirname(__FILE__)
7
+ end
8
+
9
+ desc 'Generates a Choco model'
10
+ argument :name
11
+
12
+ def create_model_file
13
+ @model_name = name.camelcase.singularize
14
+ @model = name.underscore.singularize
15
+ @route_path = name.underscore.pluralize
16
+ template('templates/models/base.js', "app/models/#{@model}.js")
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module Choco
2
+ class PluginGenerator < Thor::Group
3
+ include Thor::Actions
4
+
5
+ def self.source_root
6
+ File.dirname(__FILE__)
7
+ end
8
+
9
+ desc 'Generates a Choco plugin (Sammy or js-model)'
10
+ argument :name
11
+ class_option :for_lib
12
+
13
+ def create_model_file
14
+ @plugin_name = name.camelcase.singularize
15
+ @name = name.underscore.singularize
16
+ template('templates/lib/plugin.js', "lib/plugin_#{@name}.js")
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,65 @@
1
+ require 'open-uri'
2
+ require 'json'
3
+
4
+ module Choco
5
+ class ScaffoldGenerator < Thor::Group
6
+ include Thor::Actions
7
+
8
+ def self.source_root
9
+ File.dirname(__FILE__)
10
+ end
11
+
12
+ desc 'Generates a Choco CRUD controller with views & model'
13
+ argument :name, :required => true
14
+ argument :fields, :type => :array, :default => []
15
+
16
+ def get_data_structure
17
+ @controller_name = name.pluralize.camelcase
18
+ @route_path = name.pluralize.underscore
19
+ @model = name.singularize.underscore
20
+ @model_name = name.singularize.camelcase
21
+
22
+ @keys = []
23
+ if fields.first && fields.first.include?('http://')
24
+ @keys = load_json(fields.first)
25
+ else
26
+ @keys = fields
27
+ end
28
+ end
29
+
30
+ def create_controller
31
+ template('templates/controllers/rest_controller.js', "app/controllers/#{@route_path}_controller.js")
32
+ end
33
+
34
+ def create_views
35
+ empty_directory "app/views/#{@route_path}"
36
+ template('templates/views/index.template', "app/views/#{@route_path}/index.template")
37
+ template('templates/views/show.template', "app/views/#{@route_path}/show.template")
38
+ template('templates/views/new.template', "app/views/#{@route_path}/new.template")
39
+ template('templates/views/edit.template', "app/views/#{@route_path}/edit.template")
40
+ end
41
+
42
+ def create_model
43
+ template('templates/models/base.js', "app/models/#{@model}.js")
44
+ end
45
+
46
+ private
47
+
48
+ def load_json(url)
49
+ begin
50
+ buffer = open(url, 'UserAgent' => 'Choco').read
51
+ data = JSON.parse(buffer)[0]
52
+
53
+ if data.size == 1 && data.first[1].is_a?(Hash)
54
+ data = data.first[1]
55
+ end
56
+
57
+ keys = data.map{ |key, value| key }
58
+ rescue Exception
59
+ puts "An error occured (check that your URL is reachable and that your JSON is not empty)"
60
+ end
61
+ keys
62
+ end
63
+
64
+ end
65
+ end