pbw 0.0.10 → 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 (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