backbonify 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/LICENSE +22 -0
  2. data/README.md +52 -0
  3. data/Rakefile +2 -0
  4. data/lib/assets/javascripts/backbone.filter.js +66 -0
  5. data/lib/assets/javascripts/backbone.grid.js +295 -0
  6. data/lib/assets/javascripts/backbone.js +1290 -0
  7. data/lib/assets/javascripts/backbone_datalink.js +21 -0
  8. data/lib/assets/javascripts/backbone_rails_sync.js +68 -0
  9. data/lib/assets/javascripts/jquery-ui.js +783 -0
  10. data/lib/assets/javascripts/jquery.js +9266 -0
  11. data/lib/assets/javascripts/jquery.notice.js +79 -0
  12. data/lib/assets/javascripts/json2.js +480 -0
  13. data/lib/assets/javascripts/underscore.js +999 -0
  14. data/lib/backbonify.rb +4 -0
  15. data/lib/backbonify/engine.rb +5 -0
  16. data/lib/backbonify/version.rb +3 -0
  17. data/lib/generators/backbonify/USAGE +8 -0
  18. data/lib/generators/backbonify/hbs/hbs_generator.rb +29 -0
  19. data/lib/generators/backbonify/hbs/templates/_form.haml +6 -0
  20. data/lib/generators/backbonify/hbs/templates/_row.haml +4 -0
  21. data/lib/generators/backbonify/hbs/templates/edit.haml +1 -0
  22. data/lib/generators/backbonify/hbs/templates/index.haml +13 -0
  23. data/lib/generators/backbonify/hbs/templates/new.haml +1 -0
  24. data/lib/generators/backbonify/hbs/templates/page.haml +6 -0
  25. data/lib/generators/backbonify/hbs/templates/show.haml +1 -0
  26. data/lib/generators/backbonify/install/install_generator.rb +57 -0
  27. data/lib/generators/backbonify/install/templates/app.js +47 -0
  28. data/lib/generators/backbonify/model/model_generator.rb +20 -0
  29. data/lib/generators/backbonify/model/templates/model.js +35 -0
  30. data/lib/generators/backbonify/resource_helpers.rb +63 -0
  31. data/lib/generators/backbonify/router/router_generator.rb +44 -0
  32. data/lib/generators/backbonify/router/templates/router.js +24 -0
  33. data/lib/generators/backbonify/router/templates/template.jst +2 -0
  34. data/lib/generators/backbonify/router/templates/view.coffee +8 -0
  35. data/lib/generators/backbonify/scaffold/scaffold_generator.rb +26 -0
  36. data/lib/generators/backbonify/views/templates/edit_view.js +34 -0
  37. data/lib/generators/backbonify/views/templates/filter_view.js +36 -0
  38. data/lib/generators/backbonify/views/templates/index_view.js +15 -0
  39. data/lib/generators/backbonify/views/templates/new_view.js +22 -0
  40. data/lib/generators/backbonify/views/templates/page_view.js +30 -0
  41. data/lib/generators/backbonify/views/templates/show_view.js +18 -0
  42. data/lib/generators/backbonify/views/views_generator.rb +21 -0
  43. metadata +122 -0
@@ -0,0 +1,4 @@
1
+ require "backbonify/engine"
2
+
3
+ module Backbonify
4
+ end
@@ -0,0 +1,5 @@
1
+ module Backbonify
2
+ class Engine < Rails::Engine
3
+ isolate_namespace Backbonify
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Backbonify
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate backbonify Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,29 @@
1
+ require 'generators/backbonify/resource_helpers'
2
+
3
+ module Backbonify
4
+ module Generators
5
+ class HbsGenerator < Rails::Generators::NamedBase
6
+ include Backbonify::Generators::ResourceHelpers
7
+
8
+ source_root File.expand_path("../templates", __FILE__)
9
+ desc "This generator creates a set of Handlebars templates for a model"
10
+
11
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
12
+
13
+
14
+ def create_templates
15
+ %w(page index show new edit).each do |view|
16
+ template "#{view}.haml", File.join(backbone_path, "templates", plural_name, "#{view}.jst.hbs.haml")
17
+ end
18
+ end
19
+
20
+ def create_partials
21
+ %w(_row _form).each do |view|
22
+ template "#{view}.haml", File.join(backbone_path, "templates", plural_name, "_#{singular_name}#{view}.jst.hbs.haml")
23
+ end
24
+ end
25
+
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,6 @@
1
+ = form_for <%= singular_name.capitalize %>.new do |f|
2
+ <% attributes.each do |attribute| -%>
3
+ =f.text_field :<%= attribute.name %>, :placeholder => "<%= attribute.name %>"
4
+ <% end -%>
5
+
6
+ = submit_tag
@@ -0,0 +1,4 @@
1
+ <% attributes.each do |attribute| -%>
2
+ %td.<%= attribute.name %> {{<%= attribute.name %>}}
3
+ <% end -%>
4
+
@@ -0,0 +1 @@
1
+ {{> <%= singular_name %>_row}}
@@ -0,0 +1,13 @@
1
+ %table
2
+ %thead
3
+ %tr
4
+ <% attributes.each do |attribute| -%>
5
+ %th <%= attribute.human_name %>
6
+ <% end -%>
7
+
8
+ %tbody
9
+ {{#each collection}}
10
+ %tr(id="<%= singular_name %>_{{id}}")
11
+ {{> <%= singular_name %>_row}}
12
+ {{/each}}
13
+
@@ -0,0 +1 @@
1
+ {{> <%= singular_name %>_form}}
@@ -0,0 +1,6 @@
1
+ .submenu
2
+ %a.reload(href="#reload") ⟳
3
+ %a.new.<%= singular_name %>(href="") new <%= singular_name %>
4
+ %span.filters
5
+ =# text_field :performance, :film, :placeholder => "film", :class => "search"
6
+ %span.collectionLength
@@ -0,0 +1 @@
1
+ {{> <%= singular_name %>_row}}
@@ -0,0 +1,57 @@
1
+ require 'generators/backbonify/resource_helpers'
2
+
3
+ module Backbonify
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ include Backbonify::Generators::ResourceHelpers
7
+
8
+ source_root File.expand_path("../templates", __FILE__)
9
+ desc "This generator installs backbone.js with a default folder layout in app/assets/javascripts/backbone"
10
+ class_option :skip_git, :type => :boolean, :aliases => "-G", :default => true,
11
+ :desc => "Skip Git ignores and keeps"
12
+ class_option :skip_require, :type => :boolean, :aliases => "-R", :default => true,
13
+ :desc => "Skip injection of requires in app.js (-R), useful for updates"
14
+
15
+ def copy_javascripts_libs_to_vendor
16
+ directory("../../../../../lib/assets/javascripts/", "vendor/assets/javascripts/", :recursive => true)
17
+ end
18
+
19
+
20
+ def inject_backbone
21
+ return if options[:skip_requires]
22
+ inject_into_file "app/assets/javascripts/application.js", :before => "//= require_tree" do
23
+ a = %{
24
+ //= require json2
25
+ //= require jquery
26
+ //= require jquery-ui
27
+ //= require jquery.notice
28
+ //= require handlebars.runtime
29
+ //= require underscore
30
+ //= require backbone
31
+ // require backbone_rails_sync
32
+ //= require backbone_datalink
33
+ //= require backbone.grid
34
+ //= require #{application_name.underscore}
35
+
36
+ $(function(){
37
+ window.app = #{application_name}.init()
38
+ });
39
+
40
+ }
41
+ end
42
+ end
43
+
44
+ def create_dir_layout
45
+ %W{routers models views templates}.each do |dir|
46
+ empty_directory "app/assets/javascripts/#{dir}"
47
+ create_file "app/assets/javascripts/#{dir}/.gitkeep" unless options[:skip_git]
48
+ end
49
+ end
50
+
51
+ def create_app_file
52
+ template "app.js", "app/assets/javascripts/#{application_name.underscore}.js"
53
+ end
54
+
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,47 @@
1
+ //= require_self
2
+ //= require_tree ./templates
3
+ //= require_tree ./models
4
+ //= require_tree ./views
5
+ //= require_tree ./routers
6
+
7
+ var <%= js_app_name %> = (function(){
8
+
9
+
10
+ var initialize = function(){
11
+ initializeCollections();
12
+ startListening();
13
+
14
+ //new <%= js_app_name %>.Routers.SomeRouter;
15
+ Backbone.history.start();
16
+ }
17
+
18
+ var initializeCollections = function() {
19
+ //app.collection = new <%= js_app_name %>.Collections.SomeCollection;
20
+ }
21
+
22
+ var startListening = function() {
23
+ //app.collection.on("sync", notifySync)
24
+ //app.collection.on("error", notifyError)
25
+ }
26
+
27
+ var notifySync = function(collection) {
28
+ $.noticeAdd({text: "Succesfully saved, Yo!"})
29
+ }
30
+
31
+ var notifyError = function(collection) {
32
+ //_.delay(function() {self.$("input[type='submit']").prop("disabled", false)}, 3000)
33
+ $.noticeAdd({text: "Error yo, put a date or a film or something"})
34
+ }
35
+
36
+ var app = {
37
+ init : initialize,
38
+ Models: {},
39
+ Collections: {},
40
+ Routers: {},
41
+ Views: {}
42
+ };
43
+
44
+
45
+ return app;
46
+
47
+ })()
@@ -0,0 +1,20 @@
1
+ require 'generators/backbonify/resource_helpers'
2
+
3
+ module Backbonify
4
+ module Generators
5
+ class ModelGenerator < Rails::Generators::NamedBase
6
+ include Backbonify::Generators::ResourceHelpers
7
+
8
+ source_root File.expand_path("../templates", __FILE__)
9
+ desc "This generator creates a backbone model"
10
+
11
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
12
+
13
+ def create_backbone_model
14
+ template "model.js", "#{backbone_path}/models/#{file_name}.js"
15
+ end
16
+
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ //
2
+ // MODEL
3
+ //
4
+ <%= model_namespace %> = Backbone.Model.extend({
5
+ paramRoot: '<%= singular_table_name %>',
6
+ urlRoot: '<%= route_url %>',
7
+
8
+ defaults: {
9
+ <% attributes.each do |attribute| -%>
10
+ <%= attribute.name %>: null,
11
+ <% end -%>
12
+ noop:null
13
+ }
14
+
15
+ })
16
+
17
+ <%= collection_namespace %> = Backbone.Collection.extend({
18
+ model: <%= model_namespace %>,
19
+ url: '<%= route_url %>',
20
+
21
+ // A small decorator for 'fetch' to retain last data passed to it
22
+ fetch: function(options) {
23
+ this.fetchOptions = options || {};
24
+ Backbone.Collection.prototype.fetch.call(this, options);
25
+ },
26
+
27
+ // default_fetch uses the last data past to fetch to reload accordingly
28
+ default_fetch: function() {
29
+ this.fetch(this.fetchOptions)
30
+ }
31
+
32
+ })
33
+
34
+ _.extend(<%= collection_namespace %>.prototype, Filter);
35
+
@@ -0,0 +1,63 @@
1
+ module Backbonify
2
+ module Generators
3
+ module ResourceHelpers
4
+
5
+ def backbone_path
6
+ "app/assets/javascripts"
7
+ end
8
+
9
+ # => Perf.Models.Performance
10
+ def model_namespace
11
+ [js_app_name, "Models", class_name].join(".")
12
+ end
13
+
14
+ # => performance
15
+ def singular_model_name
16
+ uncapitalize singular_name.camelize
17
+ end
18
+
19
+ # => performances
20
+ def plural_model_name
21
+ uncapitalize(plural_name.camelize)
22
+ end
23
+
24
+ # => Perf.Collections.Performances
25
+ def collection_namespace
26
+ [js_app_name, "Collections", plural_name.camelize].join(".")
27
+ end
28
+
29
+ # => Perf.Views.Performances
30
+ def view_namespace
31
+ [js_app_name, "Views", plural_name.camelize].join(".")
32
+ end
33
+
34
+ # => Perf.Routers.Performances
35
+ def router_namespace
36
+ [js_app_name, "Routers", plural_name.camelize].join(".")
37
+ end
38
+
39
+ def jst(action)
40
+ "templates/#{plural_name}/#{action}"
41
+ end
42
+
43
+ def js_app_name
44
+ application_name.camelize
45
+ end
46
+
47
+ # TODO : Add an option so "App" is default
48
+ def application_name
49
+ if defined?(Rails) && Rails.application
50
+ Rails.application.class.name.split('::').first
51
+ else
52
+ "application"
53
+ end
54
+ end
55
+
56
+ # uncapitalize("ABC") => aBC
57
+ def uncapitalize(str)
58
+ str[0, 1].downcase << str[1..-1]
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,44 @@
1
+ require 'generators/backbonify/resource_helpers'
2
+
3
+ module Backbonify
4
+ module Generators
5
+ class RouterGenerator < Rails::Generators::NamedBase
6
+ include Backbonify::Generators::ResourceHelpers
7
+
8
+ source_root File.expand_path("../templates", __FILE__)
9
+ desc "This generator creates a backbone router (NOT with views and templates for the provided actions)"
10
+
11
+ argument :actions, :type => :array, :default => [], :banner => "action action"
12
+
13
+ RESERVED_JS_WORDS = %W{
14
+ break case catch continue debugger default delete do else finally for
15
+ function if in instanceof new return switch this throw try typeof var void while with
16
+ }
17
+
18
+ def validate_no_reserved_words
19
+ actions.each do |action|
20
+ if RESERVED_JS_WORDS.include? action
21
+ raise Thor::Error, "The name '#{action}' is reserved by javascript " <<
22
+ "Please choose an alternative action name and run this generator again."
23
+ end
24
+ end
25
+ end
26
+
27
+ def create_router_files
28
+ template 'router.js', File.join(backbone_path, "routers", class_path, "#{file_name}_router.js")
29
+ end
30
+
31
+ #def create_view_files
32
+ # actions.each do |action|
33
+ # @action = action
34
+ # @view_path = File.join(backbone_path, "views", plural_name, "#{action}_view.js.coffee")
35
+ # @jst_path = File.join(backbone_path,"templates", plural_name, "#{action}.jst.ejs")
36
+ #
37
+ # template "view.coffee", @view_path
38
+ # template "template.jst", @jst_path
39
+ # end
40
+ #end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,24 @@
1
+ //
2
+ // Router
3
+ //
4
+ <%= router_namespace %>Router = Backbone.Router.extend({
5
+ routes : {
6
+ "<%= plural_name %>" : "index",
7
+ "<%= plural_name %>/:id" : "show"
8
+ },
9
+
10
+ page: null,
11
+
12
+ initialize : function() {
13
+ this.page = new <%= "#{view_namespace}.#{'page'.camelize}View()" %>
14
+ this.page.display();
15
+ },
16
+
17
+ index : function(){
18
+ $("#orchestraPage, #contractPage").hide()
19
+ this.page.slide()
20
+ },
21
+
22
+ show : function(id) {}
23
+
24
+ });
@@ -0,0 +1,2 @@
1
+ <h1><%= class_name %>#<%= @action %></h1>
2
+ <p>Find me in <%= @jst_path %></p>
@@ -0,0 +1,8 @@
1
+ <%= view_namespace %> ||= {}
2
+
3
+ class <%= view_namespace %>.<%= @action.camelize %>View extends Backbone.View
4
+ template: JST["<%= jst @action %>"]
5
+
6
+ render: ->
7
+ $(@el).html(@template())
8
+ return this
@@ -0,0 +1,26 @@
1
+ require 'generators/backbonify/resource_helpers'
2
+
3
+ module Backbonify
4
+ module Generators
5
+ class ScaffoldGenerator < Rails::Generators::NamedBase
6
+ include Backbonify::Generators::ResourceHelpers
7
+
8
+ source_root File.expand_path("../templates", __FILE__)
9
+ desc "This generator creates the client side crud scaffolding"
10
+
11
+
12
+ class_option :model, :default => true, :type => :string
13
+ hook_for :model
14
+
15
+ class_option :router, :default => true, :type => :string
16
+ hook_for :router
17
+
18
+ class_option :views, :default => true, :type => :string
19
+ hook_for :views
20
+
21
+ class_option :js_template, :default => "hbs", :type => :string
22
+ hook_for :js_template
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ //
2
+ // EDIT : <%= singular_name.capitalize %>
3
+ //
4
+ <%= view_namespace %> = <%= view_namespace %> || {};
5
+
6
+ <%= view_namespace %>.EditView = Grid.EditView.extend({
7
+ tagName : "tr",
8
+ className : "new_<%= singular_name %>",
9
+ template : JST["templates/<%= plural_name %>/show"],
10
+ cell : null,
11
+ attribute : null,
12
+ inputTag : null,
13
+
14
+ initialize : function() {
15
+ var self = this;
16
+ this.model.bind("sync", this.renderRow, this);
17
+ //this.slowSaving = _.debounce(function(){ self.model.save() }, 1100);
18
+ },
19
+
20
+
21
+ _createInputTemplate : function() {
22
+ if( this.cell.hasClass('address') ) {
23
+ return "<textarea style='height:25px' name='address'><%%="+ this.attribute+"%></textarea>"
24
+ } else {
25
+ return '<input id="<%= singular_name %>_' + this.attribute +
26
+ '" value="<%%=' + this.attribute +
27
+ '%>" name="' + this.attribute + '" />'
28
+ }
29
+ },
30
+
31
+ noop:null
32
+ });
33
+
34
+ //_.extend(<%= view_namespace %>.EditView.prototype, <%= js_app_name %>.FormHelpers);