stratagem 0.2.0 → 0.2.2
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.
- data/LICENSE +29 -0
- data/Manifest +40 -38
- data/Rakefile +3 -3
- data/lib/stratagem.rb +22 -7
- data/lib/stratagem/authentication.rb +2 -1
- data/lib/stratagem/auto_mock/aquifer.rb +88 -15
- data/lib/stratagem/auto_mock/factory.rb +19 -30
- data/lib/stratagem/auto_mock/value_generator.rb +3 -1
- data/lib/stratagem/client.rb +3 -2
- data/lib/stratagem/crawler/authentication.rb +10 -3
- data/lib/stratagem/crawler/form.rb +2 -2
- data/lib/stratagem/crawler/html_utils.rb +12 -1
- data/lib/stratagem/crawler/parameter_resolver.rb +18 -4
- data/lib/stratagem/crawler/route_invoker.rb +58 -16
- data/lib/stratagem/crawler/session.rb +13 -5
- data/lib/stratagem/crawler/site_model.rb +20 -8
- data/lib/stratagem/extensions/object.rb +2 -2
- data/lib/stratagem/extensions/string.rb +2 -2
- data/lib/stratagem/instrumentation.rb +18 -0
- data/lib/stratagem/{framework_extensions → instrumentation}/method_invocation.rb +1 -1
- data/lib/stratagem/instrumentation/models.rb +25 -0
- data/lib/stratagem/instrumentation/models/annotations.rb +114 -0
- data/lib/stratagem/instrumentation/models/association.rb +40 -0
- data/lib/stratagem/instrumentation/models/authentication.rb +7 -0
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/authlogic/detect.rb +2 -2
- data/lib/stratagem/instrumentation/models/authentication/authlogic/instrumentation.rb +13 -0
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/authlogic/metadata.rb +1 -3
- data/lib/stratagem/instrumentation/models/authentication/devise/detect.rb +11 -0
- data/lib/stratagem/instrumentation/models/authentication/devise/instrumentation.rb +18 -0
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/devise/metadata.rb +7 -3
- data/lib/stratagem/{framework_extensions/models/adapters/util/authentication_metadata.rb → instrumentation/models/authentication/metadata.rb} +2 -2
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/restful_authentication/detect.rb +2 -4
- data/lib/stratagem/{framework_extensions/models/adapters/restful_authentication/extensions.rb → instrumentation/models/authentication/restful_authentication/instrumentation.rb} +1 -1
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/authentication}/restful_authentication/metadata.rb +2 -2
- data/lib/stratagem/{framework_extensions → instrumentation}/models/detect.rb +1 -1
- data/lib/stratagem/{framework_extensions → instrumentation}/models/metadata.rb +6 -4
- data/lib/stratagem/{framework_extensions → instrumentation}/models/mocking.rb +1 -1
- data/lib/stratagem/instrumentation/models/persistence.rb +9 -0
- data/lib/stratagem/instrumentation/models/persistence/active_record/detect.rb +18 -0
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/active_record/extensions.rb +5 -1
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/active_record/metadata.rb +25 -9
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/active_record/tracing.rb +4 -2
- data/lib/stratagem/instrumentation/models/persistence/common/detect.rb +7 -0
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/common/extensions.rb +0 -0
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/persistence}/common/metadata.rb +6 -2
- data/lib/stratagem/instrumentation/models/persistence/common/tracing.rb +4 -0
- data/lib/stratagem/instrumentation/models/support_libraries.rb +7 -0
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/support_libraries}/friendly_id/detect.rb +2 -2
- data/lib/stratagem/{framework_extensions/models/adapters → instrumentation/models/support_libraries}/friendly_id/metadata.rb +2 -2
- data/lib/stratagem/instrumentation/models/support_libraries/state_machine/detect.rb +11 -0
- data/lib/stratagem/instrumentation/models/support_libraries/state_machine/metadata.rb +17 -0
- data/lib/stratagem/{framework_extensions → instrumentation}/models/tracing.rb +2 -2
- data/lib/stratagem/{framework_extensions → instrumentation}/rails.rb +0 -0
- data/lib/stratagem/{framework_extensions → instrumentation}/rails2/action_controller.rb +0 -0
- data/lib/stratagem/{framework_extensions → instrumentation}/rails2/action_mailer.rb +0 -0
- data/lib/stratagem/{framework_extensions → instrumentation}/rails3/parameters.rb +0 -0
- data/lib/stratagem/{framework_extensions → instrumentation}/request_forgery_protection.rb +0 -0
- data/lib/stratagem/model/application.rb +30 -15
- data/lib/stratagem/model/components/controller.rb +2 -2
- data/lib/stratagem/model/components/reference.rb +2 -2
- data/lib/stratagem/model/components/view.rb +1 -1
- data/lib/stratagem/model_builder.rb +19 -8
- data/lib/stratagem/scanner.rb +1 -1
- data/lib/stratagem/site_crawler.rb +4 -2
- data/stratagem.gemspec +7 -7
- data/templates/install/tasks/stratagem.rake +9 -1
- metadata +86 -82
- data/lib/stratagem/framework_extensions.rb +0 -18
- data/lib/stratagem/framework_extensions/models.rb +0 -21
- data/lib/stratagem/framework_extensions/models/adapters/active_record/detect.rb +0 -7
- data/lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb +0 -10
- data/lib/stratagem/framework_extensions/models/adapters/authlogic/tracing.rb +0 -4
- data/lib/stratagem/framework_extensions/models/adapters/common/detect.rb +0 -7
- data/lib/stratagem/framework_extensions/models/adapters/common/tracing.rb +0 -4
- data/lib/stratagem/framework_extensions/models/adapters/devise/detect.rb +0 -11
- data/lib/stratagem/framework_extensions/models/adapters/devise/extensions.rb +0 -0
- data/lib/stratagem/framework_extensions/models/adapters/devise/tracing.rb +0 -4
- data/lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb +0 -0
- data/lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb +0 -4
- data/lib/stratagem/framework_extensions/models/adapters/restful_authentication/tracing.rb +0 -4
- data/lib/stratagem/framework_extensions/models/annotations.rb +0 -78
data/LICENSE
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Copyright (c) 2010-2011 StrataGem, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
Certain inventions disclosed in this file may be claimed within
|
|
4
|
+
patents owned or patent applications filed by StrataGem, Inc. or third
|
|
5
|
+
parties.
|
|
6
|
+
|
|
7
|
+
Subject to the terms of this notice, StrataGem grants you a
|
|
8
|
+
nonexclusive, nontransferable license, without the right to
|
|
9
|
+
sublicense, to (a) install and execute one copy of these files on any
|
|
10
|
+
number of workstations owned or controlled by you and (b) distribute
|
|
11
|
+
verbatim copies of these files to third parties. As a condition to the
|
|
12
|
+
foregoing grant, you must provide this notice along with each copy you
|
|
13
|
+
distribute and you must not remove, alter, or obscure this notice. All
|
|
14
|
+
other use, reproduction, modification, distribution, or other
|
|
15
|
+
exploitation of these files is strictly prohibited, except as may be set
|
|
16
|
+
forth in a separate written license agreement between you and Stratagem.
|
|
17
|
+
The terms of any such license agreement will control over this
|
|
18
|
+
notice. The license stated above will be automatically terminated and
|
|
19
|
+
revoked if you exceed its scope or violate any of the terms of this
|
|
20
|
+
notice.
|
|
21
|
+
|
|
22
|
+
Unless otherwise expressly agreed by StrataGem in a separate written
|
|
23
|
+
license agreement, these files are provided AS IS, WITHOUT WARRANTY OF
|
|
24
|
+
ANY KIND, including without any implied warranties of MERCHANTABILITY,
|
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NON-INFRINGEMENT. As a
|
|
26
|
+
condition to your use of these files, you are solely responsible for
|
|
27
|
+
such use. StrataGem will have no liability to you for direct,
|
|
28
|
+
indirect, consequential, incidental, special, or punitive damages or
|
|
29
|
+
for lost profits or data.
|
data/Manifest
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
LICENSE
|
|
1
2
|
Manifest
|
|
2
3
|
Rakefile
|
|
3
4
|
bin/stratagem
|
|
@@ -38,44 +39,45 @@ lib/stratagem/extensions/object.rb
|
|
|
38
39
|
lib/stratagem/extensions/red_parse.rb
|
|
39
40
|
lib/stratagem/extensions/string.rb
|
|
40
41
|
lib/stratagem/extensions/trace_compression.rb
|
|
41
|
-
lib/stratagem/
|
|
42
|
-
lib/stratagem/
|
|
43
|
-
lib/stratagem/
|
|
44
|
-
lib/stratagem/
|
|
45
|
-
lib/stratagem/
|
|
46
|
-
lib/stratagem/
|
|
47
|
-
lib/stratagem/
|
|
48
|
-
lib/stratagem/
|
|
49
|
-
lib/stratagem/
|
|
50
|
-
lib/stratagem/
|
|
51
|
-
lib/stratagem/
|
|
52
|
-
lib/stratagem/
|
|
53
|
-
lib/stratagem/
|
|
54
|
-
lib/stratagem/
|
|
55
|
-
lib/stratagem/
|
|
56
|
-
lib/stratagem/
|
|
57
|
-
lib/stratagem/
|
|
58
|
-
lib/stratagem/
|
|
59
|
-
lib/stratagem/
|
|
60
|
-
lib/stratagem/
|
|
61
|
-
lib/stratagem/
|
|
62
|
-
lib/stratagem/
|
|
63
|
-
lib/stratagem/
|
|
64
|
-
lib/stratagem/
|
|
65
|
-
lib/stratagem/
|
|
66
|
-
lib/stratagem/
|
|
67
|
-
lib/stratagem/
|
|
68
|
-
lib/stratagem/
|
|
69
|
-
lib/stratagem/
|
|
70
|
-
lib/stratagem/
|
|
71
|
-
lib/stratagem/
|
|
72
|
-
lib/stratagem/
|
|
73
|
-
lib/stratagem/
|
|
74
|
-
lib/stratagem/
|
|
75
|
-
lib/stratagem/
|
|
76
|
-
lib/stratagem/
|
|
77
|
-
lib/stratagem/
|
|
78
|
-
lib/stratagem/
|
|
42
|
+
lib/stratagem/instrumentation.rb
|
|
43
|
+
lib/stratagem/instrumentation/method_invocation.rb
|
|
44
|
+
lib/stratagem/instrumentation/models.rb
|
|
45
|
+
lib/stratagem/instrumentation/models/annotations.rb
|
|
46
|
+
lib/stratagem/instrumentation/models/association.rb
|
|
47
|
+
lib/stratagem/instrumentation/models/authentication.rb
|
|
48
|
+
lib/stratagem/instrumentation/models/authentication/authlogic/detect.rb
|
|
49
|
+
lib/stratagem/instrumentation/models/authentication/authlogic/instrumentation.rb
|
|
50
|
+
lib/stratagem/instrumentation/models/authentication/authlogic/metadata.rb
|
|
51
|
+
lib/stratagem/instrumentation/models/authentication/devise/detect.rb
|
|
52
|
+
lib/stratagem/instrumentation/models/authentication/devise/instrumentation.rb
|
|
53
|
+
lib/stratagem/instrumentation/models/authentication/devise/metadata.rb
|
|
54
|
+
lib/stratagem/instrumentation/models/authentication/metadata.rb
|
|
55
|
+
lib/stratagem/instrumentation/models/authentication/restful_authentication/detect.rb
|
|
56
|
+
lib/stratagem/instrumentation/models/authentication/restful_authentication/instrumentation.rb
|
|
57
|
+
lib/stratagem/instrumentation/models/authentication/restful_authentication/metadata.rb
|
|
58
|
+
lib/stratagem/instrumentation/models/detect.rb
|
|
59
|
+
lib/stratagem/instrumentation/models/metadata.rb
|
|
60
|
+
lib/stratagem/instrumentation/models/mocking.rb
|
|
61
|
+
lib/stratagem/instrumentation/models/persistence.rb
|
|
62
|
+
lib/stratagem/instrumentation/models/persistence/active_record/detect.rb
|
|
63
|
+
lib/stratagem/instrumentation/models/persistence/active_record/extensions.rb
|
|
64
|
+
lib/stratagem/instrumentation/models/persistence/active_record/metadata.rb
|
|
65
|
+
lib/stratagem/instrumentation/models/persistence/active_record/tracing.rb
|
|
66
|
+
lib/stratagem/instrumentation/models/persistence/common/detect.rb
|
|
67
|
+
lib/stratagem/instrumentation/models/persistence/common/extensions.rb
|
|
68
|
+
lib/stratagem/instrumentation/models/persistence/common/metadata.rb
|
|
69
|
+
lib/stratagem/instrumentation/models/persistence/common/tracing.rb
|
|
70
|
+
lib/stratagem/instrumentation/models/support_libraries.rb
|
|
71
|
+
lib/stratagem/instrumentation/models/support_libraries/friendly_id/detect.rb
|
|
72
|
+
lib/stratagem/instrumentation/models/support_libraries/friendly_id/metadata.rb
|
|
73
|
+
lib/stratagem/instrumentation/models/support_libraries/state_machine/detect.rb
|
|
74
|
+
lib/stratagem/instrumentation/models/support_libraries/state_machine/metadata.rb
|
|
75
|
+
lib/stratagem/instrumentation/models/tracing.rb
|
|
76
|
+
lib/stratagem/instrumentation/rails.rb
|
|
77
|
+
lib/stratagem/instrumentation/rails2/action_controller.rb
|
|
78
|
+
lib/stratagem/instrumentation/rails2/action_mailer.rb
|
|
79
|
+
lib/stratagem/instrumentation/rails3/parameters.rb
|
|
80
|
+
lib/stratagem/instrumentation/request_forgery_protection.rb
|
|
79
81
|
lib/stratagem/interface/browser.rb
|
|
80
82
|
lib/stratagem/interface/public/images/backgrounds/content.png
|
|
81
83
|
lib/stratagem/interface/public/images/backgrounds/shadow.png
|
data/Rakefile
CHANGED
|
@@ -2,9 +2,9 @@ require 'rubygems'
|
|
|
2
2
|
require 'rake'
|
|
3
3
|
require 'echoe'
|
|
4
4
|
|
|
5
|
-
Echoe.new('stratagem', '0.2.
|
|
6
|
-
p.description = "Intuitive security analysis
|
|
7
|
-
p.url = "http://
|
|
5
|
+
Echoe.new('stratagem', '0.2.2') do |p|
|
|
6
|
+
p.description = "Intuitive security analysis for your Rails applications"
|
|
7
|
+
p.url = "http://www.stratagemapp.com"
|
|
8
8
|
p.author = "Charles Grimes"
|
|
9
9
|
p.email = "cj@stratagemapp.com"
|
|
10
10
|
p.executable_pattern = ['bin/*']
|
data/lib/stratagem.rb
CHANGED
|
@@ -9,14 +9,14 @@ end
|
|
|
9
9
|
|
|
10
10
|
module Stratagem
|
|
11
11
|
class << self
|
|
12
|
-
def
|
|
12
|
+
def load_dependencies
|
|
13
13
|
require 'haml'
|
|
14
14
|
require 'launchy'
|
|
15
15
|
require 'redparse'
|
|
16
16
|
require 'stratagem/blocker'
|
|
17
17
|
require 'stratagem/logger'
|
|
18
18
|
require 'stratagem/extensions'
|
|
19
|
-
require 'stratagem/
|
|
19
|
+
require 'stratagem/instrumentation'
|
|
20
20
|
|
|
21
21
|
require 'stratagem/model'
|
|
22
22
|
require 'stratagem/auto_mock'
|
|
@@ -32,12 +32,29 @@ module Stratagem
|
|
|
32
32
|
require 'stratagem/snapshot'
|
|
33
33
|
|
|
34
34
|
require 'stratagem/commands'
|
|
35
|
-
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def init
|
|
38
|
+
load_dependencies
|
|
39
|
+
|
|
36
40
|
@@blocker = Blocker.new
|
|
37
41
|
@@running = false
|
|
38
42
|
@@session_id = Time.now.to_f.to_s # the interface uses this to determine which instance of the client it's talking to
|
|
39
43
|
end
|
|
40
44
|
|
|
45
|
+
def ssl?
|
|
46
|
+
false
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def domain
|
|
50
|
+
'stratagemapp.local'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def mocking?
|
|
54
|
+
true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
41
58
|
def rails_version
|
|
42
59
|
@@rails_version ||= begin
|
|
43
60
|
rails_version = Rails.version.split('.').map {|v| v.size > 1 ? 9 : v.to_i }
|
|
@@ -63,9 +80,7 @@ module Stratagem
|
|
|
63
80
|
Stratagem::Logger.instance
|
|
64
81
|
end
|
|
65
82
|
|
|
66
|
-
|
|
67
|
-
ENV['STRATAGEM_HOST'] || 'stratagemapp.com'
|
|
68
|
-
end
|
|
83
|
+
|
|
69
84
|
|
|
70
85
|
def wait_for_completion
|
|
71
86
|
@@blocker.wait
|
|
@@ -91,7 +106,7 @@ module Stratagem
|
|
|
91
106
|
# # Print a flat profile to text
|
|
92
107
|
# printer = RubyProf::FlatPrinter.new(result)
|
|
93
108
|
# printer.print(STDOUT, 0)
|
|
94
|
-
rescue
|
|
109
|
+
rescue Exception
|
|
95
110
|
puts $!.message
|
|
96
111
|
puts $!.backtrace
|
|
97
112
|
ensure
|
|
@@ -28,7 +28,8 @@ module Stratagem
|
|
|
28
28
|
|
|
29
29
|
def base_url
|
|
30
30
|
subdomain = credentials ? credentials[:account] : 'www'
|
|
31
|
-
|
|
31
|
+
protocol = Stratagem.ssl? ? 'https' : 'http'
|
|
32
|
+
"#{protocol}://#{subdomain}.#{Stratagem.domain}"
|
|
32
33
|
end
|
|
33
34
|
|
|
34
35
|
def project_url
|
|
@@ -14,27 +14,41 @@ module Stratagem::AutoMock
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def clear
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
objects
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
instance.
|
|
24
|
-
rescue
|
|
17
|
+
if (Stratagem.mocking?)
|
|
18
|
+
objects = self.repo.values.inject([]) {|memo,obj| memo += obj.compact }
|
|
19
|
+
i = 0
|
|
20
|
+
while (objects.size > 0 && ((i+=1) < objects.size))
|
|
21
|
+
objects = objects.select do |instance|
|
|
22
|
+
next if (pre_existing_object_ids[instance.class] || []).include?(instance.id)
|
|
23
|
+
puts "deleting #{instance.class.name} - #{instance.id}"
|
|
25
24
|
begin
|
|
26
|
-
instance.
|
|
25
|
+
instance.destroy
|
|
27
26
|
rescue
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
begin
|
|
28
|
+
instance.delete
|
|
29
|
+
rescue
|
|
30
|
+
puts "Unable to delete object: #{instance.class.name} - #{$!.message}"
|
|
31
|
+
puts $!.backtrace
|
|
32
|
+
end
|
|
30
33
|
end
|
|
34
|
+
!instance.frozen?
|
|
31
35
|
end
|
|
32
|
-
!instance.frozen?
|
|
33
36
|
end
|
|
34
37
|
end
|
|
35
38
|
self.repo.clear
|
|
36
39
|
end
|
|
37
40
|
|
|
41
|
+
# def export
|
|
42
|
+
# h = {}
|
|
43
|
+
# repo.each {|model_klass,instances|
|
|
44
|
+
# h[model_klass.name] = instances.map {|instance|
|
|
45
|
+
# instance.stratagem.
|
|
46
|
+
# :database_attributes => instance.
|
|
47
|
+
# }
|
|
48
|
+
#
|
|
49
|
+
# }
|
|
50
|
+
# end
|
|
51
|
+
#
|
|
38
52
|
def destroy
|
|
39
53
|
clear
|
|
40
54
|
end
|
|
@@ -52,23 +66,82 @@ module Stratagem::AutoMock
|
|
|
52
66
|
instance
|
|
53
67
|
end
|
|
54
68
|
|
|
69
|
+
def pre_existing_object_ids
|
|
70
|
+
@pre_existing_object_ids ||= {}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def load_existing_object_ids(klass)
|
|
74
|
+
if (Stratagem.mocking?)
|
|
75
|
+
# handle polymorphic objects (class may actually be a subclass of the klass parameter)
|
|
76
|
+
klass.existing_instance_ids.each do |existing_id|
|
|
77
|
+
begin
|
|
78
|
+
instance = klass.find(existing_id)
|
|
79
|
+
(pre_existing_object_ids[instance.class] ||= []) << existing_id
|
|
80
|
+
rescue
|
|
81
|
+
puts "ERROR: instance id #{existing_id} of #{klass.name} could not be loaded"
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
else
|
|
85
|
+
pre_existing_object_ids[klass] = []
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def load_instance_ids(meta_model)
|
|
90
|
+
if (meta_model.stratagem?)
|
|
91
|
+
meta_model.klass.existing_instance_ids
|
|
92
|
+
else
|
|
93
|
+
[]
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
|
|
55
98
|
def fill(model_count=nil)
|
|
56
99
|
Stratagem.logger.phase "mocking_models"
|
|
100
|
+
|
|
101
|
+
# load the ids of existing models for each class
|
|
102
|
+
application.models.each do |meta_model|
|
|
103
|
+
next unless meta_model.stratagem?
|
|
104
|
+
load_existing_object_ids(meta_model.klass)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# mock instances of all models
|
|
108
|
+
if (Stratagem.mocking?)
|
|
109
|
+
application.models.each do |meta_model|
|
|
110
|
+
mock_model(meta_model.klass, model_count) if (meta_model.stratagem?)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# determine the new ids for each model
|
|
57
115
|
application.models.each do |meta_model|
|
|
58
|
-
|
|
116
|
+
next unless meta_model.klass
|
|
117
|
+
next unless meta_model.stratagem?
|
|
118
|
+
|
|
119
|
+
known_mocked_instances = mocked(meta_model.klass)
|
|
120
|
+
new_ids = load_instance_ids(meta_model) - (pre_existing_object_ids[meta_model.klass] || [])
|
|
121
|
+
repo[meta_model.klass.name] = new_ids.map {|id|
|
|
122
|
+
begin
|
|
123
|
+
known_mocked_instances.find {|i| i.id == id } || meta_model.klass.find(id)
|
|
124
|
+
rescue
|
|
125
|
+
puts "ERROR: #{$!.message}"
|
|
126
|
+
nil
|
|
127
|
+
end
|
|
128
|
+
}.compact
|
|
129
|
+
|
|
59
130
|
end
|
|
60
|
-
|
|
131
|
+
|
|
61
132
|
print
|
|
62
133
|
self
|
|
63
134
|
end
|
|
64
135
|
|
|
65
136
|
def print
|
|
137
|
+
puts "Mocked models:"
|
|
66
138
|
application.models.each do |meta_model|
|
|
67
139
|
puts "#{meta_model.klass.name}"
|
|
68
140
|
(repo[meta_model.klass.name] || []).each do |instance|
|
|
69
|
-
puts "\t#{instance.class} - #{instance}"
|
|
141
|
+
puts "\t#{instance.class} - #{instance.id}"
|
|
70
142
|
end
|
|
71
143
|
end
|
|
144
|
+
puts "end of aquifer"
|
|
72
145
|
end
|
|
73
146
|
|
|
74
147
|
def mock_model(klass, count=nil)
|
|
@@ -18,7 +18,15 @@ module Stratagem::AutoMock
|
|
|
18
18
|
object.stratagem.mock_attributes
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
# Note:
|
|
22
|
+
# If a class is passed in that has descendants, a leaf descendant will be chosen at random
|
|
21
23
|
def mock(model,mock_chain=[], belongs_to=nil)
|
|
24
|
+
while (model.stratagem.subclasses?)
|
|
25
|
+
prior_model = model
|
|
26
|
+
model = model.sg_subclasses[rand model.sg_subclasses.size]
|
|
27
|
+
puts "mapped base class #{prior_model.name} -> #{model.name} "
|
|
28
|
+
end
|
|
29
|
+
|
|
22
30
|
return if mock_chain.select {|m| m == model }.size > 1
|
|
23
31
|
mock_chain << model
|
|
24
32
|
|
|
@@ -39,11 +47,12 @@ module Stratagem::AutoMock
|
|
|
39
47
|
break
|
|
40
48
|
end
|
|
41
49
|
end
|
|
42
|
-
rescue
|
|
43
|
-
puts $!.class.name
|
|
44
|
-
puts $!.message
|
|
45
|
-
puts $!.backtrace
|
|
46
|
-
e = MockError.new("Unexpected error mocking model #{model.name}")
|
|
50
|
+
rescue Exception, ActiveRecord::ActiveRecordError
|
|
51
|
+
# puts $!.class.name
|
|
52
|
+
# puts $!.message
|
|
53
|
+
# puts $!.backtrace
|
|
54
|
+
e = MockError.new("Unexpected error mocking model #{model.name} - #{$!.message}")
|
|
55
|
+
puts e.message
|
|
47
56
|
e.target = $!
|
|
48
57
|
# raise e
|
|
49
58
|
end
|
|
@@ -60,7 +69,7 @@ module Stratagem::AutoMock
|
|
|
60
69
|
def mocked(model=nil)
|
|
61
70
|
@mocked ||= {}
|
|
62
71
|
if (model)
|
|
63
|
-
@mocked[model.name] ||=
|
|
72
|
+
@mocked[model.name] ||= model.all
|
|
64
73
|
else
|
|
65
74
|
@mocked
|
|
66
75
|
end
|
|
@@ -109,26 +118,6 @@ module Stratagem::AutoMock
|
|
|
109
118
|
end
|
|
110
119
|
end
|
|
111
120
|
|
|
112
|
-
# has_many relations
|
|
113
|
-
# object.stratagem.relation_names(:has_many).each do |attr_name|
|
|
114
|
-
# relation = object.stratagem.relation(attr_name)
|
|
115
|
-
# # select the instances that don't have an existing belongs_to for this relation type
|
|
116
|
-
# instances = mocked(relation.klass).select {|i|
|
|
117
|
-
# br = i.stratagem.relations.find {|r| r.klass == i.class }
|
|
118
|
-
# if (br && !i.send(br.name).nil?)
|
|
119
|
-
# false
|
|
120
|
-
# else
|
|
121
|
-
# true
|
|
122
|
-
# end
|
|
123
|
-
# }
|
|
124
|
-
# if (instances.size > 2)
|
|
125
|
-
# collection = object.send(attr_name.to_s)
|
|
126
|
-
# collection << instances[rand instances.size]
|
|
127
|
-
# else
|
|
128
|
-
# mock(relation.klass, mock_chain, object)
|
|
129
|
-
# end
|
|
130
|
-
# end
|
|
131
|
-
|
|
132
121
|
(object.stratagem.invalid_columns(object)).size == 0
|
|
133
122
|
end
|
|
134
123
|
|
|
@@ -163,11 +152,10 @@ module Stratagem::AutoMock
|
|
|
163
152
|
puts "Error mocking #{klass.name}"
|
|
164
153
|
valid = false
|
|
165
154
|
rescue
|
|
166
|
-
puts object.stratagem.mock_attributes.inspect
|
|
167
|
-
puts "Error mocking #{object.class.name} - #{$!.message}"
|
|
155
|
+
puts "Error mocking #{object.class.name} - #{$!.message} - #{object.stratagem.mock_attributes.inspect}"
|
|
168
156
|
error_column = object.stratagem.column_from_error($!)
|
|
169
|
-
puts "\terror column: #{error_column}"
|
|
170
157
|
if error_column && !object.stratagem.foreign_keys.include?(error_column)
|
|
158
|
+
puts "\terror column: #{error_column}"
|
|
171
159
|
if retries < 100
|
|
172
160
|
puts "\tretrying to correct field #{error_column} that was missing validation"
|
|
173
161
|
set_attribute_value(object, error_column, [])
|
|
@@ -179,7 +167,8 @@ module Stratagem::AutoMock
|
|
|
179
167
|
else
|
|
180
168
|
valid = false
|
|
181
169
|
end
|
|
182
|
-
puts
|
|
170
|
+
puts "\tERROR: could not correct errors in model" unless valid
|
|
171
|
+
# puts $!.backtrace unless valid
|
|
183
172
|
end
|
|
184
173
|
|
|
185
174
|
# puts "\t#{object.stratagem.mock_attributes.inspect}" if (valid)
|
|
@@ -57,7 +57,9 @@ module Stratagem::AutoMock
|
|
|
57
57
|
|
|
58
58
|
def generate_string(attribute_name)
|
|
59
59
|
attribute_name = attribute_name.to_s
|
|
60
|
-
if (attribute_name.stratagem_contains_token?('
|
|
60
|
+
if (attribute_name.stratagem_contains_token?('_type'))
|
|
61
|
+
nil
|
|
62
|
+
elsif (attribute_name.stratagem_contains_token?('email') || attribute_name.stratagem_contains_token?('e-mail'))
|
|
61
63
|
(random_noise(4,false) || '') + @user[:email]
|
|
62
64
|
elsif (attribute_name.stratagem_contains_token?('login') || attribute_name.stratagem_contains_token?('username') || attribute_name.stratagem_contains_token?('user_name'))
|
|
63
65
|
@user[:login] + (random_noise(4, false) || '')
|