choco 0.1.0

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