pbw 0.0.10 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +8 -8
  2. data/Rakefile +1 -10
  3. data/app/controllers/pbw/{application_controller.rb → base_controller.rb} +1 -3
  4. data/app/controllers/pbw/base_models_controller.rb +13 -19
  5. data/app/controllers/pbw/item_containers_controller.rb +36 -0
  6. data/app/controllers/pbw/passwords_controller.rb +2 -2
  7. data/app/controllers/pbw/registrations_controller.rb +5 -3
  8. data/app/controllers/pbw/sessions_controller.rb +6 -3
  9. data/app/controllers/pbw/tokens_controller.rb +4 -0
  10. data/app/models/pbw/ability.rb +3 -3
  11. data/app/models/pbw/attached_process.rb +2 -0
  12. data/app/models/pbw/capability.rb +1 -1
  13. data/app/models/pbw/constraint.rb +1 -1
  14. data/app/models/pbw/trigger.rb +1 -1
  15. data/app/models/pbw/user.rb +3 -3
  16. data/config/initializers/mongoid_accessible_attributes.rb +14 -0
  17. data/config/routes.rb +15 -6
  18. data/lib/generators/pbw/area/area_generator.rb +4 -0
  19. data/lib/generators/pbw/install/install_generator.rb +1 -1
  20. data/lib/generators/pbw/item/item_generator.rb +4 -0
  21. data/lib/generators/pbw/resource_helpers.rb +4 -0
  22. data/lib/generators/pbw/rules/command/command_generator.rb +10 -0
  23. data/lib/generators/pbw/scaffold_generator.rb +15 -12
  24. data/lib/generators/pbw/templates/index.erb +1 -0
  25. data/lib/generators/pbw/templates/model.coffee +5 -5
  26. data/lib/generators/pbw/templates/pbw.coffee +18 -9
  27. data/lib/generators/pbw/templates/router.coffee +9 -0
  28. data/lib/generators/pbw/templates/templates/edit.jst +19 -4
  29. data/lib/generators/pbw/templates/templates/home.jst +2 -1
  30. data/lib/generators/pbw/templates/templates/index.jst +21 -10
  31. data/lib/generators/pbw/templates/templates/model.jst +15 -2
  32. data/lib/generators/pbw/templates/templates/new.jst +20 -4
  33. data/lib/generators/pbw/templates/templates/show.jst +12 -3
  34. data/lib/generators/pbw/templates/user_recovery.coffee +0 -1
  35. data/lib/generators/pbw/templates/user_registration.coffee +0 -1
  36. data/lib/generators/pbw/templates/user_session.coffee +0 -1
  37. data/lib/generators/pbw/templates/views/edit_view.coffee +19 -8
  38. data/lib/generators/pbw/templates/views/index_view.coffee +10 -2
  39. data/lib/generators/pbw/templates/views/login_view.coffee +20 -8
  40. data/lib/generators/pbw/templates/views/new_view.coffee +13 -5
  41. data/lib/generators/pbw/templates/views/recovery_view.coffee +8 -3
  42. data/lib/generators/pbw/templates/views/show_view.coffee +11 -1
  43. data/lib/generators/pbw/templates/views/signup_view.coffee +19 -5
  44. data/lib/generators/pbw/token/token_generator.rb +4 -0
  45. data/lib/pbw/engine.rb +1 -0
  46. data/lib/pbw/version.rb +1 -1
  47. data/vendor/assets/javascripts/Backbone.CollectionBinder.js +281 -0
  48. data/vendor/assets/javascripts/Backbone.ModelBinder.js +576 -0
  49. metadata +6 -6
  50. data/app/controllers/pbw/item_conversions_controller.rb +0 -7
  51. data/vendor/assets/javascripts/backbone_datalink.js +0 -21
  52. data/vendor/assets/javascripts/backbone_rails_sync.js +0 -81
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YzAxY2I2YmFlYWQ4Y2FjNWU4ZGRiMGNlOGVmYTQ2Nzk3MDA3OWIxZQ==
4
+ NDBhYjIwMmM3NWQ0ODM0ZTY2OGFhZGU5YmQ4M2U3N2FmZjY3YmZkZQ==
5
5
  data.tar.gz: !binary |-
6
- OWJjODBhYTY5NWJmMGY1Y2FlOThjNjdlZDY3YjE0ZTA4M2MwMWVhMQ==
6
+ OTk0NzNmYTE2NTY4MTE5YWVmNTUwMjcxY2I1ODJhNWE1ZWQ5NTM1OA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- YWFkNjg4NjIwMzM2ZTRkMjllYTgyNjBmMThhZDVjNjkyOWEzMWQwMjNmMTc1
10
- ZTRkMTZiMjc5NzE4NmQ4ZTVlMjQxOTU5ZTliZDY5ZjJkNGQ1Njk1NjMxOGMw
11
- Mjg2OTc5ODVkZjYwZGI1ZjBlMTA3MThlYzZmOTI1ODAzNjM2ZjM=
9
+ NmZlMDAxMTdhMmY2YjhjZmYyYjgxMWMzNDY5NzkzMzZiOWI3NGU5MTY0NTE0
10
+ Y2RiOWFhZWIyNjA1MThhN2EwMGE1N2ZiZDkyYjZkZDU2ZDI5ZTU2Y2QwMDRl
11
+ NmI1MzliZDA4YWMxNWFhMDc1NDU5MjExNTY2NDE2ZTY0ZmM0ODI=
12
12
  data.tar.gz: !binary |-
13
- M2Y5ZWNhZjZlZDEwODVjZDAxYjc3NTUwYTc4MzJkNTIwNDNiNjM4YTAxYmJm
14
- MGRiMDRmMTJkMGY2ZGY3ODgxY2U5ZDFiOWUzNmRiZDRjZjk2ZmU5Zjg3YzEz
15
- NzdhZjIyMDEwYTRiMmE4ODdiOWQzMjBkNDQ0ZTRkMDljZjFhODU=
13
+ Y2IxMmU1YmI4ZWQxOTY3YjBkNGI2NGE5NjA4MmZhZTg4NjIyNTM2NzJkN2I4
14
+ ODhjNGEzOWVlMmZjOGFhNDZkZWM2NTc2MmIwMWU2MWFlZDczMjBhYjlkMjA1
15
+ NzEyMDg1OTYwY2JjMDIxMjYxOTQ4MGQzZTM3ZTJlMWNjMGY0Zjc=
data/Rakefile CHANGED
@@ -19,9 +19,7 @@ namespace :backbone do
19
19
  task :download_latest do
20
20
  files = {
21
21
  'underscore.js'=>'http://underscorejs.org/underscore.js',
22
- 'backbone.js' => 'http://backbonejs.org/backbone.js',
23
- 'backbone_datalink.js' => 'https://raw.github.com/codebrew/backbone-rails/master/vendor/assets/javascripts/backbone_datalink.js',
24
- 'backbone_rails_sync.js' => 'https://raw.github.com/codebrew/backbone-rails/master/vendor/assets/javascripts/backbone_rails_sync.js'
22
+ 'backbone.js' => 'http://backbonejs.org/backbone.js'
25
23
  }
26
24
 
27
25
  vendor_dir = "vendor/assets/javascripts"
@@ -36,13 +34,6 @@ namespace :backbone do
36
34
  end
37
35
  end
38
36
 
39
- namespace :compass do
40
- desc "Compile scss in public with compass"
41
- task :compile do
42
- system "cd public && compass compile"
43
- end
44
- end
45
-
46
37
 
47
38
  Bundler::GemHelper.install_tasks
48
39
 
@@ -1,5 +1,5 @@
1
1
  module Pbw
2
- class ApplicationController < ActionController::Base
2
+ class BaseController < ActionController::Base
3
3
  respond_to :json
4
4
 
5
5
  rescue_from ::CanCan::AccessDenied do |exception|
@@ -10,8 +10,6 @@ module Pbw
10
10
  render json: {:error => exception.message}, status: 404
11
11
  end
12
12
 
13
- protected
14
-
15
13
  def current_ability
16
14
  @current_ability ||= Ability.new(current_user)
17
15
  end
@@ -1,5 +1,5 @@
1
1
  module Pbw
2
- class BaseModelsController < ApplicationController
2
+ class BaseModelsController < BaseController
3
3
  attr_accessor :model_class
4
4
 
5
5
  before_filter :authenticate_user!
@@ -23,21 +23,17 @@ module Pbw
23
23
 
24
24
  def index
25
25
  session[:referrer] = request.url
26
- render json: @models
26
+ if @models && !@models.empty?
27
+ render json: @models.to_json
28
+ else
29
+ render json: '', status: :unprocessable_entity
30
+ end
27
31
  end
28
32
 
29
33
  def show
30
34
  render json: @model.to_json
31
35
  end
32
36
 
33
- def edit
34
- render json: @model.to_json
35
- end
36
-
37
- def new
38
- render json: @model.to_json
39
- end
40
-
41
37
  def create
42
38
  if @model.save
43
39
  render json: @model.to_json
@@ -47,7 +43,7 @@ module Pbw
47
43
  end
48
44
 
49
45
  def update
50
- if @model.update_attributes(params[model_param])
46
+ if @model.update_attributes(params)
51
47
  render json: @model.to_json
52
48
  else
53
49
  render json: @model.errors.full_messages.to_json, status: :unprocessable_entity
@@ -73,33 +69,31 @@ module Pbw
73
69
  self.model_class
74
70
  end
75
71
 
76
- def model_param
77
- model_class.name.underscore.downcase.to_sym
78
- end
79
-
80
72
  def model_id
81
73
  params[:id]
82
74
  end
83
75
 
84
76
  def index_models
85
- authorize! :manage, model_class
77
+ authorize! :manage, real_model_class
86
78
  @models = model_class.desc(:created_at)
87
79
  end
88
80
 
89
81
  def model_for_create
90
82
  authorize! :create, real_model_class
91
- @model = real_model_class.new(params[model_param])
83
+ @model = real_model_class.new(params)
84
+ @model.accessible = :all
92
85
  update_model_before_create(@model)
93
86
  end
94
87
 
95
88
  def model_for_read
96
- @model = model_class.find(model_id)
89
+ @model = real_model_class.find(model_id)
97
90
  authorize! :read, @model
98
91
  end
99
92
 
100
93
  def model_for_update
101
- @model = model_class.find(model_id)
94
+ @model = real_model_class.find(model_id)
102
95
  authorize! :update, @model
96
+ @model.accessible = :all
103
97
  update_model_before_update(@model)
104
98
  end
105
99
  end
@@ -3,5 +3,41 @@ module Pbw
3
3
  def set_model_class
4
4
  self.model_class = ItemContainer
5
5
  end
6
+
7
+ def real_model_class
8
+ self.model_class
9
+ end
10
+
11
+ def token_or_area_or_user
12
+ return @token_or_area_or_user if defined?(@token_or_area_or_user) && @token_or_area_or_user
13
+ begin
14
+ unless params[:_type].blank?
15
+ klass = Kernel.get_const(params[:_type])
16
+ return @token_or_area_or_user = klass.find(params[:container_id])
17
+ else
18
+ return @token_or_area_or_user = current_user
19
+ end
20
+ rescue
21
+ nil
22
+ end
23
+ end
24
+
25
+ def index_models
26
+ authorize! :read, token_or_area_or_user
27
+ @models = token_or_area_or_user.item_containers
28
+ end
29
+
30
+ def model_for_create
31
+ authorize! :update, token_or_area_or_user
32
+ @model = model_class.new(params)
33
+ if token_or_area_or_user.ancestors.include?(Area)
34
+ @model.area = token_or_area_or_user
35
+ elsif token_or_area_or_user.ancestors.include?(Token)
36
+ @model.token = token_or_area_or_user
37
+ elsif token_or_area_or_user.ancestors.include?(User)
38
+ @model.user = token_or_area_or_user
39
+ end
40
+ update_model_before_create(@model)
41
+ end
6
42
  end
7
43
  end
@@ -1,9 +1,9 @@
1
1
  module Pbw
2
2
  class PasswordsController < Devise::PasswordsController
3
3
  respond_to :json
4
-
4
+
5
5
  def create
6
- self.resource = resource_class.where(resource_params).first
6
+ self.resource = resource_class.where(params).first
7
7
  if resource && resource.reset_password!
8
8
  head :no_content
9
9
  else
@@ -1,12 +1,14 @@
1
1
  module Pbw
2
2
  class RegistrationsController < Devise::RegistrationsController
3
3
  respond_to :json
4
-
4
+
5
5
  def create
6
- self.resource = User.new(params[:user])
7
- logger.error "Password confirmed? #{params[:user][:password] == params[:user][:password_confirmation]}"
6
+ self.resource = User.new(params)
8
7
  if resource.save && resource.send_registration_email
8
+ unwrapped = params
9
+ params[:user] = unwrapped
9
10
  Pbw.user_lifecycle_class.after_signup(resource)
11
+ sign_in(:user, resource)
10
12
  render json: resource
11
13
  else
12
14
  render json: resource.errors.full_messages.to_json, status: :unprocessable_entity
@@ -1,16 +1,19 @@
1
1
  module Pbw
2
2
  class SessionsController < Devise::SessionsController
3
3
  respond_to :json
4
-
4
+
5
5
  def create
6
+ unwrapped = params
7
+ params[:user] = unwrapped
6
8
  self.resource = warden.authenticate!(auth_options)
7
9
  sign_in(resource_name, resource)
8
10
  Pbw.user_lifecycle_class.after_login(current_user)
9
11
  render json: current_user.to_json, status: :ok
10
12
  end
11
13
 
12
- def after_sign_out_path_for(resource_name)
13
- "/"
14
+ def destroy
15
+ signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
16
+ render json: '', status: :ok
14
17
  end
15
18
  end
16
19
  end
@@ -3,5 +3,9 @@ module Pbw
3
3
  def set_model_class
4
4
  self.model_class = Token
5
5
  end
6
+
7
+ def update_model_before_create(model)
8
+ model.user = current_user
9
+ end
6
10
  end
7
11
  end
@@ -1,6 +1,5 @@
1
- require 'cancan'
2
-
3
- class Ability
1
+ module Pbw
2
+ class Ability
4
3
  include CanCan::Ability
5
4
 
6
5
  MANAGED_CLASSES = [Area, Capability, Command, Constraint, Item, ItemContainer, ItemConversion, Process, Rule, Token, Trigger, User]
@@ -34,4 +33,5 @@ class Ability
34
33
  return klass if subject_class.ancestors.include?(klass)
35
34
  end
36
35
  end
36
+ end
37
37
  end
@@ -1,5 +1,7 @@
1
1
  module Pbw
2
2
  class AttachedProcess
3
+ include ::Mongoid::Document
4
+ include ::Mongoid::Timestamps
3
5
  belongs_to :token, :class_name => 'Pbw::Token'
4
6
  belongs_to :area, :class_name => 'Pbw::Area'
5
7
  belongs_to :process, :class_name => 'Pbw::Process'
@@ -5,7 +5,7 @@ module Pbw
5
5
  def self.viewable_by?(user, subject)
6
6
  return true if user.admin?
7
7
  subject.tokens.each do |token|
8
- return true token.user && token.user == user
8
+ return true if token.user && token.user == user
9
9
  end
10
10
  false
11
11
  end
@@ -6,7 +6,7 @@ module Pbw
6
6
  def self.viewable_by?(user, subject)
7
7
  return true if user.admin?
8
8
  subject.tokens.each do |token|
9
- return true token.user && token.user == user
9
+ return true if token.user && token.user == user
10
10
  end
11
11
  false
12
12
  end
@@ -7,7 +7,7 @@ module Pbw
7
7
  def self.viewable_by?(user, subject)
8
8
  return true if user.admin?
9
9
  subject.tokens.each do |token|
10
- return true token.user && token.user == user
10
+ return true if token.user && token.user == user
11
11
  end
12
12
  false
13
13
  end
@@ -54,7 +54,7 @@ module Pbw
54
54
  end
55
55
 
56
56
  def admin?
57
- self.role == "admin"
57
+ self.role == "admin" || superadmin?
58
58
  end
59
59
 
60
60
  def make_admin!
@@ -63,7 +63,7 @@ module Pbw
63
63
  end
64
64
 
65
65
  def moderator?
66
- self.role == "moderator"
66
+ self.role == "moderator" || admin?
67
67
  end
68
68
 
69
69
  def make_moderator!
@@ -72,7 +72,7 @@ module Pbw
72
72
  end
73
73
 
74
74
  def player?
75
- self.role == "player"
75
+ self.role == "player" || moderator?
76
76
  end
77
77
 
78
78
  def send_registration_email
@@ -0,0 +1,14 @@
1
+ module Mongoid
2
+ module Document
3
+ attr_accessor :accessible
4
+
5
+ private
6
+ def mass_assignment_authorizer(role = :default)
7
+ if accessible == :all
8
+ self.class.protected_attributes
9
+ else
10
+ super + (accessible || [])
11
+ end
12
+ end
13
+ end
14
+ end
data/config/routes.rb CHANGED
@@ -8,12 +8,21 @@ Pbw::Engine.routes.draw do
8
8
  get "#{controller}/:_type" => "#{controller}\#index"
9
9
  get "#{controller}/:_type/:id" => "#{controller}\#show"
10
10
  post "#{controller}/:_type" => "#{controller}\#create"
11
- get "#{controller}/:_type/new" => "#{controller}\#new"
12
- get "#{controller}/:_type/:id/edit" => "#{controller}\#edit"
13
- delete "#{controller}/:_type/:id" => "#{controller}\#delete"
11
+ delete "#{controller}/:_type/:id" => "#{controller}\#destroy"
14
12
  put "#{controller}/:_type/:id" => "#{controller}\#update"
15
13
  end
16
-
17
- resources :item_containers
18
- resources :item_conversions
14
+
15
+ %W{areas tokens}.each do |controller|
16
+ get "#{controller}/:_type/:container_id/items" => "item_containers\#index"
17
+ get "#{controller}/:_type/:container_id/items/:id" => "item_containers\#show"
18
+ post "#{controller}/:_type/:container_id/items" => "item_containers\#create"
19
+ delete "#{controller}/:_type/:container_id/items/:id" => "item_containers\#destroy"
20
+ put "#{controller}/:_type/:container_id/items/:id" => "item_containers\#update"
21
+ end
22
+
23
+ get "users/items" => "item_containers\#index"
24
+ get "users/items/:id" => "item_containers\#show"
25
+ post "users/items" => "item_containers\#create"
26
+ put "users/items/:id" => "item_containers\#update"
27
+ delete "users/items/:id" => "item_containers\#destroy"
19
28
  end
@@ -10,4 +10,8 @@ class Pbw::AreaGenerator < Pbw::Generators::ScaffoldGenerator
10
10
  def model_namespace
11
11
  "Areas"
12
12
  end
13
+
14
+ def param_root
15
+ 'area'
16
+ end
13
17
  end
@@ -12,7 +12,7 @@ module Pbw
12
12
 
13
13
  def inject_backbone
14
14
  inject_into_file "app/assets/javascripts/application.js", :before => "//= require_tree" do
15
- "//= require underscore\n//= require backbone\n//= require backbone_rails_sync\n//= require backbone_datalink\n//= require #{application_name.underscore}\n"
15
+ "//= require underscore\n//= require backbone\n//= require Backbone.ModelBinder\n//= require Backbone.CollectionBinder\n//= require #{application_name.underscore}\n"
16
16
  end
17
17
  end
18
18
 
@@ -10,4 +10,8 @@ class Pbw::ItemGenerator < Pbw::Generators::ScaffoldGenerator
10
10
  def model_namespace
11
11
  "Items"
12
12
  end
13
+
14
+ def param_root
15
+ 'item'
16
+ end
13
17
  end
@@ -13,6 +13,10 @@ module Pbw
13
13
  def js_user_model_namespace
14
14
  [js_app_name, "Models", 'User'].join(".")
15
15
  end
16
+
17
+ def class_namespace
18
+ ["",model_namespace, class_name].join("::")
19
+ end
16
20
 
17
21
  def singular_model_name
18
22
  uncapitalize singular_name.camelize
@@ -24,4 +24,14 @@ class Pbw::Rules::CommandGenerator < Pbw::Generators::ScaffoldGenerator
24
24
  def model_namespace
25
25
  "Commands"
26
26
  end
27
+
28
+ def default_attributes
29
+ super
30
+ @default_attributes << {name: 'token', default_value: ''}
31
+ @default_attributes
32
+ end
33
+
34
+ def param_root
35
+ 'command'
36
+ end
27
37
  end
@@ -13,15 +13,15 @@ module Pbw
13
13
  end
14
14
  if available_views.include?('new')
15
15
  routes << "#{route_entry("#{plural_model_name}/new","new#{model_namespace}#{class_name}")}"
16
- route_methods << "#{route_method("new#{model_namespace}#{plural_name.camelize}", "New")}"
16
+ route_methods << "#{route_method("new#{model_namespace}#{class_name.camelize}", "New")}"
17
17
  end
18
18
  if available_views.include?('edit')
19
19
  routes << "#{route_entry("#{plural_model_name}/:id/edit","edit#{model_namespace}#{class_name}")}"
20
- route_methods << "#{route_method("edit#{model_namespace}#{plural_name.camelize}", "Edit")}"
20
+ route_methods << "#{route_method("edit#{model_namespace}#{class_name.camelize}", "Edit")}"
21
21
  end
22
22
  if available_views.include?('show')
23
23
  routes << "#{route_entry("#{plural_model_name}/:id","show#{model_namespace}#{class_name}")}"
24
- route_methods << "#{route_method("show#{model_namespace}#{plural_name.camelize}", "Show")}"
24
+ route_methods << "#{route_method("show#{model_namespace}#{class_name.camelize}", "Show")}"
25
25
  end
26
26
  if available_views.include?('index') # needs to be at the end
27
27
  routes << "#{route_entry("#{plural_model_name}/.*","index#{model_namespace}#{plural_name.camelize}")}"
@@ -47,6 +47,14 @@ module Pbw
47
47
  end
48
48
 
49
49
  protected
50
+ def param_root
51
+ class_name.underscore
52
+ end
53
+
54
+ def default_attributes
55
+ @default_attributes = [{name: 'name', default_value: ''}, {name: '_type', default_value: "#{class_namespace}"}]
56
+ end
57
+
50
58
  def available_views
51
59
  %w(index show new edit)
52
60
  end
@@ -70,19 +78,14 @@ module Pbw
70
78
  when 'Index'
71
79
  "@view = new #{view_namespace}.#{view}View(#{plural_model_name}: @#{plural_model_name})"
72
80
  when 'New'
73
- "#{singular_model_name} = new @#{plural_model_name}.model()\n @view = new #{view_namespace}.#{view}View(#{plural_model_name}: @#{plural_model_name}, model: #{singular_model_name})"
81
+ "#{singular_model_name} = new #{js_model_namespace}\n @view = new #{view_namespace}.#{view}View(model: #{singular_model_name})"
74
82
  when 'Edit', 'Show'
75
- "#{singular_model_name} = new @#{plural_model_name}.get(id)\n @view = new #{view_namespace}.#{view}View(#{plural_model_name}: @#{plural_model_name}, model: #{singular_model_name})"
83
+ "#{singular_model_name} = new #{js_model_namespace}({_id: id})\n @view = new #{view_namespace}.#{view}View(model: #{singular_model_name})"
76
84
  end
77
85
  "
78
86
  #{method_name}: #{method_params}->
79
- @#{plural_model_name}.fetch
80
- success: (collection) =>
81
- #{view_js}
82
- $(\"#app\").html(@view.render().el)
83
- error: (model, response) ->
84
- window.console && console.log response
85
- "
87
+ #{view_js}
88
+ $(\"#app\").html(@view.render().el)"
86
89
  end
87
90
  end
88
91
  end