stratagem 0.1.8 → 0.1.9

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