stratagem 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/Manifest +16 -18
  2. data/Rakefile +3 -3
  3. data/bin/stratagem +54 -6
  4. data/generators/stratagem/stratagem_generator.rb +26 -0
  5. data/lib/generators/stratagem/install/USAGE +0 -0
  6. data/lib/generators/stratagem/install/install_base.rb +35 -0
  7. data/lib/generators/stratagem/install/install_generator.rb +24 -0
  8. data/lib/stratagem.rb +87 -57
  9. data/lib/stratagem/authentication.rb +2 -2
  10. data/lib/stratagem/auto_mock/aquifer.rb +6 -1
  11. data/lib/stratagem/auto_mock/factory.rb +2 -2
  12. data/lib/stratagem/client.rb +1 -1
  13. data/lib/stratagem/crawler.rb +2 -0
  14. data/lib/stratagem/crawler/authentication.rb +10 -9
  15. data/lib/stratagem/crawler/parameter_resolver.rb +83 -0
  16. data/lib/stratagem/crawler/route_invoker.rb +187 -0
  17. data/lib/stratagem/crawler/session.rb +23 -251
  18. data/lib/stratagem/crawler/site_model.rb +18 -16
  19. data/lib/stratagem/framework_extensions.rb +12 -1
  20. data/lib/stratagem/framework_extensions/method_invocation.rb +50 -0
  21. data/lib/stratagem/framework_extensions/models/adapters/active_model/detect.rb +1 -1
  22. data/lib/stratagem/framework_extensions/models/adapters/active_model/extensions.rb +20 -11
  23. data/lib/stratagem/framework_extensions/models/adapters/active_model/metadata.rb +7 -3
  24. data/lib/stratagem/framework_extensions/models/adapters/active_model/tracing.rb +11 -9
  25. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb +12 -0
  26. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb +0 -0
  27. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb +21 -0
  28. data/lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb +4 -0
  29. data/lib/stratagem/framework_extensions/models/annotations.rb +1 -24
  30. data/lib/stratagem/framework_extensions/models/tracing.rb +9 -3
  31. data/lib/stratagem/framework_extensions/rails.rb +0 -6
  32. data/lib/stratagem/framework_extensions/{controllers → rails2}/action_controller.rb +0 -0
  33. data/lib/stratagem/framework_extensions/{controllers → rails2}/action_mailer.rb +0 -0
  34. data/lib/stratagem/framework_extensions/rails3/parameters.rb +14 -0
  35. data/lib/stratagem/interface/browser.rb +3 -1
  36. data/lib/stratagem/model/application.rb +6 -6
  37. data/lib/stratagem/model/components/controller.rb +17 -63
  38. data/lib/stratagem/model/components/model.rb +33 -33
  39. data/lib/stratagem/model/components/reference.rb +8 -4
  40. data/lib/stratagem/model/components/route.rb +40 -14
  41. data/lib/stratagem/model/components/view.rb +1 -1
  42. data/lib/stratagem/model_builder.rb +71 -42
  43. data/lib/stratagem/site_crawler.rb +1 -1
  44. data/lib/stratagem/snapshot.rb +0 -1
  45. data/stratagem.gemspec +10 -7
  46. data/templates/install/environments/stratagem.rb.erb +16 -0
  47. data/templates/install/tasks/stratagem.rake +18 -0
  48. metadata +57 -40
  49. data/lib/stratagem/framework_extensions/controllers.rb +0 -5
  50. data/lib/stratagem/scan/checks/filter_parameter_logging.rb +0 -6
  51. data/lib/stratagem/scan/checks/mongo_mapper/base.rb +0 -19
  52. data/lib/stratagem/scan/checks/mongo_mapper/foreign_keys_exposed.rb +0 -32
  53. data/lib/stratagem/scan/checks/routes.rb +0 -16
  54. data/lib/tasks/_old_stratagem.rake +0 -99
  55. data/spec/model/component_spec.rb +0 -43
  56. data/spec/model/components/view_spec.rb +0 -43
  57. data/spec/model/test_spec.rb +0 -10
  58. data/spec/samples/404.html.erb +0 -30
  59. data/spec/samples/_form.html.erb +0 -8
  60. data/spec/samples/index.html.erb +0 -77
  61. data/spec/samples/sample_model.rb +0 -5
  62. data/spec/samples/signup.html.erb +0 -14
  63. data/spec/scan/checks/email_address_spec.rb +0 -24
  64. data/spec/scan/checks/error_pages_spec.rb +0 -22
@@ -11,11 +11,15 @@ module Stratagem::Model::Component
11
11
  @models_rendered = {} # model => [MethodInvocation]
12
12
  end
13
13
 
14
- def model_invocations
15
- Stratagem::ApplicationExtensions::Models::Tracing.invocations_audit.select {|invocation|
16
- (invocation.controller_path == controller.path) &&
17
- (invocation.controller_action.to_s == self.name.to_s)
18
- }.uniq
14
+ def model_invocations(type=nil)
15
+ invocations = []
16
+ Stratagem::ApplicationExtensions::Models::Tracing.invocations_audit.each {|invocation|
17
+ if ((invocation.controller_path == controller.path) && (invocation.controller_action.to_s == self.name.to_s))
18
+ invocations << invocation unless invocations.include?(invocation)
19
+ end
20
+ }
21
+ invocations = invocations.select {|i| i.type == type } if type
22
+ invocations
19
23
  end
20
24
 
21
25
  end
@@ -30,6 +34,10 @@ module Stratagem::Model::Component
30
34
  @actions = []
31
35
  end
32
36
 
37
+ def action(name)
38
+ @actions.find {|a| a.name.to_s == name.to_s }
39
+ end
40
+
33
41
  def add_routable_action(name, method)
34
42
  @actions << Action.new(self, name, method)
35
43
  end
@@ -37,69 +45,15 @@ module Stratagem::Model::Component
37
45
  def export
38
46
  {
39
47
  :external_id => self.object_id,
40
- :type => :controller,
41
- :path => @path.gsub(RAILS_ROOT+'/', ''),
42
- :class_name => @klass.name,
48
+ :component_type => :controller,
49
+ :path => @path ? @path.gsub(RAILS_ROOT+'/', '') : nil,
50
+ :class_name => klass.name,
43
51
  :invalid_routes => @invalid_routes
44
52
  }
45
53
  end
46
54
 
47
- # returns a list of references that create or update the specified model.
48
- # see deletes? for destruction of model
49
- def modifies(model)
50
- # @modifies ||= {}
51
- # @modifies[model] ||= begin
52
- # outline = {} # method keys, value is hash of variables and values
53
- # current_method = nil
54
- # references = Set.new
55
- #
56
- # # return [] unless ((model.klass == WineFollow) && (self.klass == FollowsController))
57
- #
58
- # self.parse_tree.walk {|parent,i,subi,node|
59
- # case node
60
- # when RedParse::MethodNode #... do something with method calls
61
- # current_method = node.name
62
- # outline[current_method] = {}
63
- # # puts "CURRENTMETHOD: #{current_method}"
64
- # when RedParse::AssignNode
65
- # if (node.left.kind_of?(RedParse::VarNode))
66
- # begin
67
- # # puts "assigning:#{node.left.name} -> #{node.right.dereference}"
68
- # deref = node.right.dereference
69
- # ((outline[current_method][node.left.name] ||= []) << deref) if current_method && deref
70
- # rescue
71
- # puts $!.message
72
- # puts $!.backtrace
73
- # logger.error("Cannot dereference node #{node.right.to_s}")
74
- # end
75
- # end
76
- # when RedParse::CallNode
77
- # ['update','create','new'].each {|m|
78
- # # then this is a crud operation (excluding destroy)
79
- # if (node.name.include?(m))
80
- # if (node.talking_about? model)
81
- # references << create_reference(node, current_method, model)
82
- # break
83
- # elsif (node.receiver && node.receiver.methods_include?(:name) && outline[current_method])
84
- # if ((outline[current_method][node.receiver.name] || []).include?(model.klass))
85
- # references << create_reference(node, current_method, model)
86
- # break
87
- # end
88
- # end
89
- # end
90
- # }
91
- # end
92
- # node
93
- # }
94
- # references.to_a
95
- # end
96
- []
97
- end
98
-
99
55
  def references
100
- actions.map {|action|
101
- action.model_invocations.map {|inv| inv.to_reference }
102
- }.flatten
56
+ actions.map {|action| action.model_invocations }.flatten.uniq.map {|inv| inv.to_reference }
103
57
  end
104
58
 
105
59
  private
@@ -94,44 +94,44 @@ module Stratagem::Model::Component
94
94
  end
95
95
 
96
96
  # References to the find and find_x methods on the model
97
- def references_to_finders()
98
- references = []
99
- method = nil
100
- app_model.controllers.each {|controller|
101
- controller.parse_tree.walk {|parent,i,subi,node|
102
- case node
103
- when RedParse::MethodNode
104
- method = node
105
- when RedParse::CallNode
106
- if (!(parent.kind_of?(RedParse::AssignNode)) && (node.receiver) && (node.receiver.to_s == klass.name))
107
- references << ControllerModelReference.new(controller, method.name, node.name, node)
108
- end
109
- end
110
-
111
- case parent
112
- when RedParse::AssignNode
113
- # p parent
114
- begin
115
- if (node.kind_of?(RedParse::CallNode) && (node.receiver) && (node.receiver.name == klass.name))
116
- references << ControllerModelReference.new(controller, method.name, node.name, node)
117
- end
118
- rescue
119
- puts $!.message
120
- puts $!.backtrace
121
- # p parent
122
- end
123
- end
124
- true
125
- }
126
- }
127
- references
128
- end
97
+ # def references_to_finders()
98
+ # references = []
99
+ # method = nil
100
+ # app_model.controllers.each {|controller|
101
+ # controller.parse_tree.walk {|parent,i,subi,node|
102
+ # case node
103
+ # when RedParse::MethodNode
104
+ # method = node
105
+ # when RedParse::CallNode
106
+ # if (!(parent.kind_of?(RedParse::AssignNode)) && (node.receiver) && (node.receiver.to_s == klass.name))
107
+ # references << ControllerModelReference.new(controller, method.name, node.name, node)
108
+ # end
109
+ # end
110
+ #
111
+ # case parent
112
+ # when RedParse::AssignNode
113
+ # # p parent
114
+ # begin
115
+ # if (node.kind_of?(RedParse::CallNode) && (node.receiver) && (node.receiver.name == klass.name))
116
+ # references << ControllerModelReference.new(controller, method.name, node.name, node)
117
+ # end
118
+ # rescue
119
+ # puts $!.message
120
+ # puts $!.backtrace
121
+ # # p parent
122
+ # end
123
+ # end
124
+ # true
125
+ # }
126
+ # }
127
+ # references
128
+ # end
129
129
 
130
130
  def export
131
131
  adapters = stratagem? ? klass.stratagem.callbacks.map {|c| c.class.name } : []
132
132
  {
133
133
  :external_id => self.object_id,
134
- :type => :model,
134
+ :component_type => :model,
135
135
  :path => @path.gsub(RAILS_ROOT+'/', ''),
136
136
  :class_name => @klass.name,
137
137
  :superclass => @klass.superclass.name,
@@ -2,16 +2,20 @@ module Stratagem::Model::Component
2
2
  class Reference
3
3
  attr_accessor :reference_type # :read, :write
4
4
  attr_accessor :from_component, :to_component
5
- attr_accessor :line_number, :method, :function, :options, :stack_trace
5
+ attr_accessor :line_number, :request_method, :function, :options, :stack_trace
6
6
 
7
- Vars = [:reference_type, :from_component, :to_component, :line_number, :method, :function, :options, :stack_trace]
7
+ EQUALITY_ATTRS = [:reference_type, :from_component, :to_component, :line_number, :method, :function]
8
8
 
9
9
  def initialize(args={})
10
10
  args.each {|key,val| self.send("#{key}=", val) }
11
11
  end
12
12
 
13
13
  def ==(other)
14
- Vars.find {|attribute|
14
+ eql?(other)
15
+ end
16
+
17
+ def eql?(other)
18
+ EQUALITY_ATTRS.find {|attribute|
15
19
  self.send(attribute) != other.send(attribute)
16
20
  }.nil?
17
21
  end
@@ -23,7 +27,7 @@ module Stratagem::Model::Component
23
27
  :from_component_external_id => from_component.object_id,
24
28
  :to_component_external_id => to_component.object_id,
25
29
  :line_number => line_number,
26
- :method => method,
30
+ :request_method => request_method,
27
31
  :function => function,
28
32
  :options => options ? options.to_json : nil,
29
33
  :stack_trace => reference_type == :write ? compressed_stack_trace : nil
@@ -1,18 +1,49 @@
1
1
  module Stratagem::Model::Component
2
2
  class Route < Base
3
- attr_reader :route
3
+ attr_reader :route, :segment_keys, :path, :verb, :controller_name, :controller_path, :action_name
4
4
 
5
5
  def initialize(route)
6
6
  @route = route
7
+ if (Stratagem.rails_3?)
8
+ @path = route.path
9
+ @controller_path = route.requirements[:controller]
10
+ @action_name = route.requirements[:action]
11
+ @verb = (route.verb || :GET).downcase.to_sym
12
+ elsif (Stratagem.rails_2?)
13
+ @path = route.segments.join.sub(/[\?\/]$/, '')
14
+ @controller_path = route.parameter_shell[:controller]
15
+ @action_name = route.parameter_shell[:action]
16
+ @verb = route.conditions[:method] || :get
17
+ end
18
+
19
+ @segment_keys = route.segment_keys
20
+ @action_name = @action_name.to_sym if @action_name
21
+ if (@controller_path)
22
+ @controller_name = @controller_path.gsub('/','::').split('::').map {|part| part.camelcase }.join('::')
23
+ @controller_name << 'Controller'
24
+ end
25
+ puts "CONTROLLER INFO: #{@controller_name}, #{@action_name}, #{@verb}, #{controller}"
26
+ end
27
+
28
+ def responds_to?(path, request_method)
29
+ if (Stratagem.rails_3?)
30
+ begin
31
+ route.set.recognize_path(path, :method => request_method) == route.requirements
32
+ rescue ActionController::RoutingError
33
+ puts "ERROR: #{$!.message}"
34
+ end
35
+ elsif (Stratagem.rails_2?)
36
+ route.recognize(path, {:method => request_method})
37
+ end
7
38
  end
8
39
 
9
40
  def controller
10
- if (route.requirements[:controller])
41
+ if (controller_name)
11
42
  begin
12
- controller_class = "#{route.requirements[:controller].to_s.camelize}Controller".constantize
43
+ controller_class = controller_name.constantize
13
44
  Stratagem::Model::Application.instance.controllers.find {|c| c.klass == controller_class }
14
45
  rescue
15
- puts "unable to determine controller #{route.requirements[:controller]}"
46
+ puts "unable to determine controller: #{route.requirements[:controller]}"
16
47
  puts $!.message
17
48
  nil
18
49
  end
@@ -21,15 +52,11 @@ module Stratagem::Model::Component
21
52
  end
22
53
  end
23
54
 
24
- def action
25
- route.requirements[:action] ? route.requirements[:action].to_sym : nil
26
- end
27
-
28
55
  def ==(other)
29
56
  if (other.kind_of?(ActionController::Routing::Route))
30
57
  self.route == other
31
58
  elsif (other.kind_of?(Stratagem::Model::Component::Route))
32
- self.route.requirements == other.route.requirements && self.route.segments == other.route.segments
59
+ self.route == other.route
33
60
  else
34
61
  raise "unknown comparison to #{other.class.name}"
35
62
  end
@@ -38,12 +65,11 @@ module Stratagem::Model::Component
38
65
  def export
39
66
  {
40
67
  :external_id => self.object_id,
41
- :type => :route,
42
- :path => nil,
43
- :requirements => @route.requirements,
44
- :segments => @route.segments.map {|s| s.to_s },
68
+ :component_type => :route,
69
+ :path => path,
70
+ :verb => verb,
45
71
  :controller_external_id => controller ? controller.object_id : nil,
46
- :action => action,
72
+ :action => action_name,
47
73
  }
48
74
  end
49
75
  end
@@ -33,7 +33,7 @@ module Stratagem::Model::Component
33
33
  begin
34
34
  {
35
35
  :external_id => self.object_id,
36
- :type => :view,
36
+ :component_type => :view,
37
37
  :path => @path,
38
38
  :render_path => @render_path,
39
39
  :forms => forms.map {|form| form.export }
@@ -1,6 +1,6 @@
1
1
  module Stratagem
2
2
  class ModelBuilder
3
- attr_reader :parsed_models, :parsed_controllers
3
+ attr_reader :parsed_models, :parsed_controllers, :model
4
4
 
5
5
  def initialize
6
6
  @model = Stratagem::Model::Application.instance
@@ -33,9 +33,13 @@ module Stratagem
33
33
  end
34
34
 
35
35
  def load_plugins()
36
- loader = Rails::Plugin::Loader.new(Rails::Initializer.new(Rails::Configuration.new))
37
- loader.load_plugins
38
- @model.plugins << loader.initializer.loaded_plugins
36
+ if (Stratagem.rails_3?)
37
+ @model.plugins << Rails.application.railties.plugins
38
+ else
39
+ loader = Rails::Plugin::Loader.new(Rails::Initializer.new(Rails::Configuration.new))
40
+ loader.load_plugins
41
+ @model.plugins << loader.initializer.loaded_plugins
42
+ end
39
43
  end
40
44
 
41
45
  def load_models()
@@ -46,13 +50,6 @@ module Stratagem
46
50
  models = Stratagem::Model::Component::Model.load_all(File.join(root, model))
47
51
  models.each do |c|
48
52
  log "\t#{c.klass.name} loaded from #{model}"
49
-
50
- # references = []
51
- # @model.controllers.each do |controller|
52
- # references += controller.modifies(c)
53
- # end
54
- # log "\t\t#{references.size} references from controllers"
55
- # c.model_referenced_by = references
56
53
  end
57
54
  @model.models << models
58
55
  }
@@ -85,42 +82,53 @@ module Stratagem
85
82
  ActionController::Routing::Routes.routes.each {|route|
86
83
  route_container = Stratagem::Model::Component::Route.new(route)
87
84
  @model.routes << route_container
88
- begin
89
- filename = File.join(root, "#{route.parameter_shell[:controller]}_controller.rb")
90
85
 
91
- controllers = @model.controllers.select {|c| c.path == filename }
92
- unless controllers.size > 0
93
- controllers = Stratagem::Model::Component::Controller.load_all(filename)
94
- puts "loading controllers from #{filename} -> controllers #{controllers.map {|c| c.klass.name }.inspect}"
95
- @model.controllers << controllers
96
- end
97
-
98
- controller_name = route.parameter_shell[:controller].gsub('/','::').split('::').map {|part| part.camelcase }.join('::')
99
- controller_name << 'Controller'
100
- controller_class = controllers.find {|controller| controller.klass.name == controller_name }
101
- controller_object = controller_class ? controller_class.klass.new : nil
102
- controller_action = route.parameter_shell[:action] ? route.parameter_shell[:action].to_sym : nil
103
-
104
- if (controller_object && controller_action) && (controller_object.methods_include?(controller_action))
105
- controllers.each do |controller|
106
- controller.add_routable_action(controller_action, route.conditions[:method] || :get)
107
- end
108
- else
109
- # if the controller does not contain the indicated method
110
- # then check for a template that may be rendered anyway
111
- log "\tinvalid route #{route.to_s}"
112
- unless @model.views.find {|v| v.render_path == "#{route.parameter_shell[:controller]}/#{controller_action}" }
113
- # route is invalid
114
- @model.routes.invalid << Stratagem::Model::Component::Route.new(route)
115
- log "\tinvalid route #{route.to_s}"
86
+ begin
87
+ controller = route_container.controller || begin
88
+ controller_class = route_container.controller_name.constantize
89
+ filename = File.join(root, "#{route_container.controller_path}_controller.rb")
90
+ if (File.exists?(filename))
91
+ parse_tree = RedParse.new(File.read(filename)).parse
92
+ else
93
+ parse_tree = nil
116
94
  end
95
+ controller_container = Stratagem::Model::Component::Controller.new(filename, parse_tree, controller_class)
96
+ configure_route(route_container, controller_container)
97
+ @model.controllers << controller_container
117
98
  end
118
-
119
- rescue Errno::ENOENT
120
- @model.routes.invalid << Stratagem::Model::Component::Route.new(route)
121
- rescue MissingSourceFile
99
+ rescue
100
+ log "\tinvalid route #{route.to_s} - #{$!.message}"
122
101
  @model.routes.invalid << Stratagem::Model::Component::Route.new(route)
123
102
  end
103
+
104
+ # begin
105
+ # filename = File.join(root, "#{route_container.controller_path}_controller.rb")
106
+ # controllers = @model.controllers.select {|c| c.path == filename }
107
+ #
108
+ # unless controllers.size > 0
109
+ # controllers = Stratagem::Model::Component::Controller.load_all(filename)
110
+ # puts "loading controllers from #{filename} -> controllers #{controllers.map {|c| c.klass.name }.inspect}"
111
+ # @model.controllers << controllers
112
+ # end
113
+ #
114
+ # configure_route(route_container, controllers)
115
+ #
116
+ # rescue Errno::ENOENT, MissingSourceFile
117
+ # begin
118
+ # controller_class = route_container.controller
119
+ # if (controller_class)
120
+ # log "Attempting to load external controller for: #{route_container.controller_name}"
121
+ # controllers = [Stratagem::Model::Component::Controller.new(nil, nil, controller_class)]
122
+ # @model.controllers << controllers
123
+ # configure_route(route_container, controllers)
124
+ # else
125
+ # log "\tinvalid route #{route.to_s} - unable to load external controller"
126
+ # end
127
+ # rescue
128
+ # log "\tinvalid route #{route.to_s} - #{$!.message}"
129
+ # @model.routes.invalid << Stratagem::Model::Component::Route.new(route)
130
+ # end
131
+ # end
124
132
  }
125
133
  log ""
126
134
  end
@@ -140,5 +148,26 @@ module Stratagem
140
148
  end
141
149
  file_list
142
150
  end
151
+
152
+ protected
153
+
154
+ def configure_route(route_container, controller_container)
155
+ if (route_container.action_name)
156
+ controller_object = controller_container.klass ? controller_container.klass.new : nil
157
+ if (controller_object && controller_object.methods_include?(route_container.action_name))
158
+ controller_container.add_routable_action(route_container.action_name, route_container.verb)
159
+ log "\tvalid route #{route_container.route.to_s}"
160
+ else
161
+ # if the controller does not contain the indicated method
162
+ # then check for a template that may be rendered anyway
163
+ log "\tinvalid route #{route_container.route.to_s}"
164
+ unless @model.views.find {|v| v.render_path == "#{route_container.controller_path}/#{route_container.action_name.to_s}" }
165
+ # route is invalid
166
+ @model.routes.invalid << Stratagem::Model::Component::Route.new(route_container.route)
167
+ log "\tinvalid route #{route_container.route.to_s}"
168
+ end
169
+ end
170
+ end
171
+ end
143
172
  end
144
173
  end