active_mocker 1.8.4 → 2.0.0.beta1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +4 -2
- data/lib/active_mocker.rb +9 -25
- data/lib/active_mocker/config.rb +26 -46
- data/lib/active_mocker/generate.rb +115 -110
- data/lib/active_mocker/loaded_mocks.rb +76 -65
- data/lib/active_mocker/mock/base.rb +283 -287
- data/lib/active_mocker/mock/has_many.rb +2 -0
- data/lib/active_mocker/mock_creator.rb +262 -0
- data/lib/active_mocker/mock_template.erb +9 -186
- data/lib/active_mocker/mock_template/_associations.erb +82 -0
- data/lib/active_mocker/mock_template/_attributes.erb +11 -0
- data/lib/active_mocker/mock_template/_class_methods.erb +41 -0
- data/lib/active_mocker/mock_template/_defined_methods.erb +10 -0
- data/lib/active_mocker/mock_template/_modules_constants.erb +10 -0
- data/lib/active_mocker/mock_template/_scopes.erb +23 -0
- data/lib/active_mocker/null_progress.rb +9 -0
- data/lib/active_mocker/output_capture.rb +32 -0
- data/lib/active_mocker/parent_class.rb +64 -0
- data/lib/active_mocker/progress.rb +13 -0
- data/lib/active_mocker/public_methods.rb +15 -23
- data/lib/active_mocker/rspec.rb +16 -0
- data/lib/active_mocker/rspec_helper.rb +10 -8
- data/lib/active_mocker/task.rake +6 -1
- data/lib/active_mocker/template_creator.rb +22 -0
- data/lib/active_mocker/version.rb +1 -1
- metadata +43 -103
- data/lib/active_mocker/active_record.rb +0 -74
- data/lib/active_mocker/active_record/field.rb +0 -39
- data/lib/active_mocker/active_record/relationships.rb +0 -110
- data/lib/active_mocker/active_record/schema.rb +0 -81
- data/lib/active_mocker/active_record/scope.rb +0 -22
- data/lib/active_mocker/active_record/table.rb +0 -26
- data/lib/active_mocker/active_record/unknown_class_method.rb +0 -17
- data/lib/active_mocker/active_record/unknown_module.rb +0 -30
- data/lib/active_mocker/db_to_ruby_type.rb +0 -29
- data/lib/active_mocker/file_reader.rb +0 -11
- data/lib/active_mocker/model_reader.rb +0 -191
- data/lib/active_mocker/model_schema.rb +0 -285
- data/lib/active_mocker/model_schema/assemble.rb +0 -220
- data/lib/active_mocker/reparameterize.rb +0 -41
- data/lib/active_mocker/ruby_parse.rb +0 -68
- data/lib/active_mocker/schema_reader.rb +0 -30
- data/lib/active_mocker/string_reader.rb +0 -18
@@ -1,220 +0,0 @@
|
|
1
|
-
module ActiveMocker
|
2
|
-
|
3
|
-
module ModelLoadError
|
4
|
-
|
5
|
-
class General < Exception
|
6
|
-
|
7
|
-
def initialize(msg)
|
8
|
-
@msg = msg
|
9
|
-
super
|
10
|
-
end
|
11
|
-
|
12
|
-
def class_name
|
13
|
-
@msg
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
class HasNoParentClass < General
|
19
|
-
end
|
20
|
-
|
21
|
-
class LoadingModelInRails < General
|
22
|
-
|
23
|
-
def initialize(error, class_name)
|
24
|
-
@msg = "#{class_name}\n #{error.message}\n #{error.backtrace.join("\n ")}"
|
25
|
-
super(@msg)
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class ModelSchema
|
32
|
-
|
33
|
-
class Assemble
|
34
|
-
|
35
|
-
attr_reader :progress
|
36
|
-
|
37
|
-
def initialize(progress: nil)
|
38
|
-
@progress = progress
|
39
|
-
end
|
40
|
-
|
41
|
-
def increment_progress
|
42
|
-
progress.increment unless progress.nil?
|
43
|
-
end
|
44
|
-
|
45
|
-
def tables
|
46
|
-
@tables ||= SchemaReader.new.tables
|
47
|
-
end
|
48
|
-
|
49
|
-
def get_table(model, model_name)
|
50
|
-
if model.parent_class.present?
|
51
|
-
model = get_model(model_name)
|
52
|
-
end
|
53
|
-
selected_table = tables.select{|table| table.name == model.table_name}.first
|
54
|
-
if selected_table.nil?
|
55
|
-
Logger.info "Table: `#{model.table_name}`, can not be found for model #{model_name.camelize}.\n"
|
56
|
-
end
|
57
|
-
selected_table
|
58
|
-
end
|
59
|
-
|
60
|
-
def run
|
61
|
-
model_schemas = models.map do |model_name|
|
62
|
-
begin
|
63
|
-
model = get_model(model_name)
|
64
|
-
|
65
|
-
table = get_table(model, model_name)
|
66
|
-
attributes = []
|
67
|
-
attributes = build_attributes(table.fields, primary_key(table.fields, model)) unless table.nil?
|
68
|
-
|
69
|
-
increment_progress
|
70
|
-
|
71
|
-
ModelSchema.new(class_name: -> { model_name.camelize },
|
72
|
-
table_name: -> { model.try(:table_name) },
|
73
|
-
attributes: -> { attributes },
|
74
|
-
_methods: -> { build_methods(model) },
|
75
|
-
relationships: -> { build_relationships(model) },
|
76
|
-
constants: -> { model.constants },
|
77
|
-
modules: -> { model.modules },
|
78
|
-
parent_class: -> { model.parent_class },
|
79
|
-
abstract_class: -> { model.abstract_class}
|
80
|
-
)
|
81
|
-
rescue Exception => e
|
82
|
-
e
|
83
|
-
end
|
84
|
-
end
|
85
|
-
ModelSchemaCollection.new(model_schemas.compact)
|
86
|
-
end
|
87
|
-
|
88
|
-
def build_attributes(attributes, primary_attribute)
|
89
|
-
attributes.map do |attr|
|
90
|
-
attribute = ModelSchema::Attributes
|
91
|
-
.new(name: attr.name,
|
92
|
-
type: attr.type,
|
93
|
-
precision: attr.precision,
|
94
|
-
scale: attr.scale,
|
95
|
-
default_value: attr.default)
|
96
|
-
if primary_attribute == attr
|
97
|
-
attribute.primary_key = true
|
98
|
-
end
|
99
|
-
attribute
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def build_methods(model)
|
104
|
-
result = []
|
105
|
-
{scope: model.scopes_with_arguments,
|
106
|
-
instance: model.instance_methods_with_arguments,
|
107
|
-
class: model.class_methods_with_arguments}.each do |type,methods|
|
108
|
-
methods.map do |method|
|
109
|
-
method_name = method.keys.first.to_s
|
110
|
-
arguments = method.values.first
|
111
|
-
|
112
|
-
result.push(ModelSchema::Methods.new(name: method_name,
|
113
|
-
arguments: arguments,
|
114
|
-
type: type,
|
115
|
-
proc: method[:proc]))
|
116
|
-
end
|
117
|
-
end
|
118
|
-
result
|
119
|
-
end
|
120
|
-
|
121
|
-
def build_relationships(model)
|
122
|
-
relations_by_type(model).map do |type, relations|
|
123
|
-
relations.map do |relation|
|
124
|
-
Relationships.new(name: relation.name,
|
125
|
-
class_name: relation.class_name,
|
126
|
-
type: type,
|
127
|
-
through: nil,
|
128
|
-
source: nil,
|
129
|
-
foreign_key: relation.foreign_key,
|
130
|
-
join_table: nil)
|
131
|
-
end
|
132
|
-
end.flatten
|
133
|
-
end
|
134
|
-
|
135
|
-
def relations_by_type(model)
|
136
|
-
{belongs_to: model.belongs_to,
|
137
|
-
has_one: model.has_one,
|
138
|
-
has_many: model.has_many,
|
139
|
-
has_and_belongs_to_many: model.has_and_belongs_to_many
|
140
|
-
}
|
141
|
-
end
|
142
|
-
|
143
|
-
def find_join_table(relation, model)
|
144
|
-
return relation.join_table if relation.respond_to?(:join_table) && relation.join_table
|
145
|
-
tables.select do |table|
|
146
|
-
|
147
|
-
"#{model.table_name}_#{relation.name}" == table.name.to_s || "#{relation.name}_#{model.table_name}" == table.name.to_s
|
148
|
-
end.first
|
149
|
-
end
|
150
|
-
|
151
|
-
def primary_key(attributes, model)
|
152
|
-
result = model_primary_key_attribute(attributes, model)
|
153
|
-
return result unless result.nil?
|
154
|
-
|
155
|
-
result = find_primary_key(attributes)
|
156
|
-
return result unless result.nil?
|
157
|
-
|
158
|
-
find_id_attribute(attributes)
|
159
|
-
end
|
160
|
-
|
161
|
-
private
|
162
|
-
|
163
|
-
def model_primary_key_attribute(attributes, model)
|
164
|
-
if model.respond_to?(:primary_key) && model.primary_key
|
165
|
-
attributes.select do |attr|
|
166
|
-
model.primary_key.to_s == attr.name.to_s
|
167
|
-
end.first
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
def find_primary_key(attributes)
|
172
|
-
attributes.select do |attr|
|
173
|
-
attr.try(:primary_key)
|
174
|
-
end.first
|
175
|
-
end
|
176
|
-
|
177
|
-
def find_id_attribute(attributes)
|
178
|
-
attributes.select do |attr|
|
179
|
-
attr.name.to_sym == :id
|
180
|
-
end.first
|
181
|
-
end
|
182
|
-
|
183
|
-
public
|
184
|
-
|
185
|
-
def models
|
186
|
-
models = '*'
|
187
|
-
models = Config.generate_for_mock.underscore if Config.generate_for_mock
|
188
|
-
Dir["#{Config.model_dir}/#{models}.rb"].map do |file|
|
189
|
-
Pathname.new(file).basename.to_s.sub('.rb', '')
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
def get_model(model_file_name)
|
194
|
-
model = ModelReader.new.parse(model_file_name)
|
195
|
-
raise ModelLoadError::General.new(model_file_name) unless model
|
196
|
-
model
|
197
|
-
end
|
198
|
-
|
199
|
-
def get_table_name(model_table_name, model_name)
|
200
|
-
return model_name.tableize if model_table_name.nil?
|
201
|
-
return model_table_name
|
202
|
-
end
|
203
|
-
|
204
|
-
def table_to_model_file(table_name)
|
205
|
-
table_name.singularize
|
206
|
-
end
|
207
|
-
|
208
|
-
def table_to_class_name(table)
|
209
|
-
table.camelize.singularize
|
210
|
-
end
|
211
|
-
|
212
|
-
def get_belongs_to(class_name, foreign_key)
|
213
|
-
get_table(nil, class_name)
|
214
|
-
end
|
215
|
-
|
216
|
-
end
|
217
|
-
|
218
|
-
end
|
219
|
-
|
220
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module ActiveMocker
|
2
|
-
# @api private
|
3
|
-
class Reparameterize
|
4
|
-
|
5
|
-
def self.call(params, method_parameters: nil)
|
6
|
-
return method_parameters(params) unless method_parameters.nil?
|
7
|
-
method_arguments(params)
|
8
|
-
end
|
9
|
-
|
10
|
-
# Method arguments are the real values passed to (and received by) the function.
|
11
|
-
def self.method_arguments(params)
|
12
|
-
params.map do |state, param|
|
13
|
-
case state
|
14
|
-
when :req
|
15
|
-
param
|
16
|
-
when :rest
|
17
|
-
"*#{param}"
|
18
|
-
when :opt
|
19
|
-
"#{param}=nil"
|
20
|
-
when :keyreq
|
21
|
-
"#{param}:"
|
22
|
-
when :key
|
23
|
-
"#{param}: nil"
|
24
|
-
end
|
25
|
-
end.join(', ')
|
26
|
-
end
|
27
|
-
|
28
|
-
# Method parameters are the names listed in the function definition.
|
29
|
-
def self.method_parameters(params)
|
30
|
-
params.map do |state, param|
|
31
|
-
case state
|
32
|
-
when :key, :keyreq
|
33
|
-
"#{param}: #{param}"
|
34
|
-
else
|
35
|
-
param
|
36
|
-
end
|
37
|
-
end.join(', ')
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
module ActiveMocker
|
2
|
-
|
3
|
-
class RubyParse
|
4
|
-
|
5
|
-
attr_reader :source
|
6
|
-
|
7
|
-
def initialize(source)
|
8
|
-
@source = source
|
9
|
-
end
|
10
|
-
|
11
|
-
def is_class?
|
12
|
-
ast.type == :class
|
13
|
-
end
|
14
|
-
|
15
|
-
def class_name
|
16
|
-
Unparser.unparse(find_class.to_a[0])
|
17
|
-
end
|
18
|
-
|
19
|
-
def parent_class_name
|
20
|
-
Unparser.unparse(find_class.to_a[1])
|
21
|
-
end
|
22
|
-
|
23
|
-
def has_parent_class?
|
24
|
-
return false if find_class.nil?
|
25
|
-
find_class.to_a[1].try(:type) == :const
|
26
|
-
end
|
27
|
-
|
28
|
-
def change_class_name(class_name)
|
29
|
-
reset_nodes
|
30
|
-
nodes[0] = Parser::CurrentRuby.parse(class_name)
|
31
|
-
new_ast = ast.updated(nil, nodes, nil)
|
32
|
-
Unparser.unparse(new_ast)
|
33
|
-
end
|
34
|
-
|
35
|
-
def modify_parent_class(parent_class)
|
36
|
-
reset_nodes
|
37
|
-
if has_parent_class?
|
38
|
-
class_node = find_class.to_a.dup
|
39
|
-
class_node[1] = Parser::CurrentRuby.parse(parent_class)
|
40
|
-
new_ast = find_class.updated(nil, class_node, nil)
|
41
|
-
else
|
42
|
-
nodes[1] = nodes[0].updated(:const, [nil, parent_class.to_sym])
|
43
|
-
new_ast = ast.updated(nil, nodes, nil)
|
44
|
-
end
|
45
|
-
Unparser.unparse(new_ast)
|
46
|
-
end
|
47
|
-
|
48
|
-
def find_class
|
49
|
-
return ast if ast.try(:type) == :class
|
50
|
-
ast.to_a.select {|n| n.try(:type) == :class}.first
|
51
|
-
end
|
52
|
-
|
53
|
-
def ast
|
54
|
-
@ast ||= Parser::CurrentRuby.parse(source)
|
55
|
-
end
|
56
|
-
|
57
|
-
def nodes
|
58
|
-
@nodes ||= ast.to_a.dup
|
59
|
-
end
|
60
|
-
|
61
|
-
def reset_nodes
|
62
|
-
@nodes = nil
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
module ActiveMocker
|
3
|
-
# @api private
|
4
|
-
class SchemaReader
|
5
|
-
|
6
|
-
def tables
|
7
|
-
load_table
|
8
|
-
end
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def load_table
|
13
|
-
eval_file
|
14
|
-
raise "#{table_name} table not found." unless @tables
|
15
|
-
@tables
|
16
|
-
end
|
17
|
-
|
18
|
-
def eval_file
|
19
|
-
m = Module.new
|
20
|
-
@tables = m.module_eval(read_file).tables
|
21
|
-
end
|
22
|
-
|
23
|
-
def read_file
|
24
|
-
Config.file_reader.read(Config.schema_file)
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|