active_mocker 1.3.2 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +136 -24
  4. data/Rakefile +8 -2
  5. data/active_mocker.gemspec +3 -3
  6. data/lib/active_mock/association.rb +7 -0
  7. data/lib/active_mock/base.rb +250 -0
  8. data/lib/active_mock/collection.rb +52 -0
  9. data/lib/active_mock/creators.rb +25 -0
  10. data/lib/active_mock/do_nothing_active_record_methods.rb +51 -0
  11. data/lib/active_mock/has_and_belongs_to_many.rb +7 -0
  12. data/lib/active_mock/has_many.rb +54 -0
  13. data/lib/active_mock/next_id.rb +16 -0
  14. data/lib/active_mock/object_inspect.rb +39 -0
  15. data/lib/{active_mocker/collection → active_mock}/queries.rb +26 -19
  16. data/lib/active_mock/records.rb +81 -0
  17. data/lib/active_mock/relation.rb +8 -0
  18. data/lib/active_mocker.rb +3 -1
  19. data/lib/active_mocker/active_mock.rb +26 -0
  20. data/lib/active_mocker/active_record.rb +18 -0
  21. data/lib/active_mocker/active_record/relationships.rb +57 -6
  22. data/lib/active_mocker/active_record/schema.rb +1 -1
  23. data/lib/active_mocker/active_record/scope.rb +1 -1
  24. data/lib/active_mocker/active_record/unknown_class_method.rb +1 -1
  25. data/lib/active_mocker/active_record/unknown_module.rb +10 -9
  26. data/lib/active_mocker/db_to_ruby_type.rb +26 -0
  27. data/lib/active_mocker/field.rb +16 -8
  28. data/lib/active_mocker/generate.rb +19 -174
  29. data/lib/active_mocker/loaded_mocks.rb +48 -8
  30. data/lib/active_mocker/logger.rb +2 -0
  31. data/lib/active_mocker/mock_template.erb +123 -53
  32. data/lib/active_mocker/model_reader.rb +42 -13
  33. data/lib/active_mocker/model_schema.rb +279 -0
  34. data/lib/active_mocker/model_schema/generate.rb +175 -0
  35. data/lib/active_mocker/reparameterize.rb +23 -3
  36. data/lib/active_mocker/table.rb +2 -2
  37. data/lib/active_mocker/version.rb +1 -1
  38. data/sample_app_rails_4/Gemfile +1 -1
  39. data/sample_app_rails_4/app/models/micropost.rb +13 -1
  40. data/sample_app_rails_4/db/schema.rb +1 -1
  41. data/sample_app_rails_4/spec/compare_mocker_and_record_spec.rb +194 -7
  42. data/sample_app_rails_4/spec/micropost_mock_spec.rb +145 -0
  43. data/sample_app_rails_4/spec/mocks/micropost_mock.rb +81 -55
  44. data/sample_app_rails_4/spec/mocks/relationship_mock.rb +85 -54
  45. data/sample_app_rails_4/spec/mocks/user_mock.rb +71 -72
  46. data/sample_app_rails_4/spec/reload_spec.rb +1 -1
  47. data/sample_app_rails_4/spec/user_mock_spec.rb +25 -7
  48. data/spec/lib/acitve_mock/queriable_spec.rb +207 -0
  49. data/spec/lib/active_mocker/db_to_ruby_type_spec.rb +124 -0
  50. data/spec/lib/active_mocker/loaded_mocks_spec.rb +167 -0
  51. data/spec/lib/active_mocker/logger_spec.rb +32 -0
  52. data/spec/lib/active_mocker/model_reader_spec.rb +79 -28
  53. data/spec/lib/active_mocker/model_schema/generate_spec.rb +111 -0
  54. data/spec/lib/active_mocker/model_schema_spec.rb +145 -0
  55. data/spec/lib/model.rb +2 -1
  56. data/spec/lib/reparameterize_spec.rb +202 -0
  57. data/spec/unit_logger.rb +2 -2
  58. metadata +55 -35
  59. data/lib/active_hash/ar_api.rb +0 -77
  60. data/lib/active_hash/init.rb +0 -32
  61. data/lib/active_mocker/collection/association.rb +0 -12
  62. data/lib/active_mocker/collection/base.rb +0 -65
  63. data/lib/active_mocker/collection/relation.rb +0 -11
  64. data/lib/active_mocker/mock_class_methods.rb +0 -92
  65. data/lib/active_mocker/mock_instance_methods.rb +0 -84
  66. data/lib/active_mocker/mock_requires.rb +0 -10
  67. data/spec/lib/active_mocker/collection.rb +0 -94
@@ -5,30 +5,70 @@ module ActiveMocker
5
5
  mocks.merge!({mocks_to_add.name => mocks_to_add})
6
6
  end
7
7
 
8
+ def self.add_subclass(subclass)
9
+ subclasses.merge!({subclass.mocked_class => subclass})
10
+ end
11
+
12
+ def self.subclasses
13
+ @subclasses ||= {}
14
+ end
15
+
16
+ def self.clear_subclasses
17
+ @subclasses = nil
18
+ end
19
+
20
+ def self.mocks
21
+ @mocks ||= {}
22
+ end
23
+
24
+ def self.find(klass)
25
+ class_name_to_mock[klass]
26
+ end
27
+
8
28
  def self.all
9
29
  mocks
10
30
  end
11
31
 
12
32
  def self.clear_all
13
- mocks.each { |n, m| m.clear_mock }
33
+ action = -> (mocks){ mocks.each { |n, m| m.clear_mock } }
34
+ action.call(mocks)
35
+ action.call(subclasses)
36
+ clear_subclasses
14
37
  end
15
38
 
16
39
  def self.delete_all
17
- mocks.each { |n, m| m.delete_all }
40
+ action = -> (mocks) { mocks.each { |n, m| m.delete_all } }
41
+ action.call(mocks)
42
+ action.call(subclasses)
18
43
  end
19
44
 
20
45
  def self.reload_all
21
- mocks.each { |n, m| m.reload }
46
+ action = -> (mocks) { mocks.each { |n, m| m.send(:reload) } }
47
+ action.call(mocks)
48
+ action.call(subclasses)
22
49
  end
23
50
 
24
- def self.mocks
25
- @@mocks ||= {}
51
+ def self.undefine_all
52
+ action = -> (mocks) { mocks.each do |n, m|
53
+ Object.send(:remove_const, n) if Object.const_defined?(n)
54
+ end }
55
+ action.call(mocks)
56
+ action.call(subclasses)
26
57
  end
27
58
 
28
- def self.undefine_all
29
- mocks.each do |n, m|
30
- Object.send(:remove_const, n) if Object.const_defined?(:n)
59
+ def self.class_name_to_mock
60
+ hash = {}
61
+ mocks.each do |mock_name, mock_constant|
62
+ hash[mock_constant.mocked_class] = mock_constant
31
63
  end
64
+ hash.merge(subclasses)
65
+ end
66
+
67
+ private
68
+
69
+ def self.internal_clear
70
+ clear_subclasses
71
+ @mocks = nil
32
72
  end
33
73
  end
34
74
 
@@ -6,6 +6,8 @@ module ActiveMocker
6
6
  end
7
7
 
8
8
  def self.method_missing(meth, *args, &block)
9
+ @@logger ||= nil
10
+ return nil if @@logger.nil?
9
11
  return @@logger.send(meth, *args, &block)
10
12
  end
11
13
  end
@@ -1,24 +1,49 @@
1
- require 'active_mocker/mock_requires'
2
- Object.send(:remove_const, "<%= class_name %>") if ActiveMocker.class_exists?("<%= class_name %>")
1
+ require 'active_mocker/active_mock'
2
+ Object.send(:remove_const, "<%= class_name + @mock_append_name %>") if Object.const_defined?("<%= class_name + @mock_append_name %>")
3
3
 
4
- class <%= class_name %> < ::ActiveHash::Base
5
- include ActiveMocker::ActiveHash::ARApi
6
- include ActiveMocker::MockInstanceMethods
7
- extend ActiveMocker::MockClassMethods
4
+ class <%= class_name + @mock_append_name %> < ActiveMock::Base
5
+ <% constants.each do |constant| %>
6
+ <%= constant.first %> = <%= constant.last.inspect %>
7
+ <% end -%>
8
8
 
9
- def initialize(attributes={}, &block)
10
- @attributes = HashWithIndifferentAccess.new(<%= default_attributes %>)
11
- @associations = HashWithIndifferentAccess.new(<%= associations %>)
12
- super(attributes, &block)
13
- end
9
+ class << self
14
10
 
11
+ def attributes
12
+ @attributes ||= HashWithIndifferentAccess.new(<%= attributes_with_defaults %>)
13
+ end
15
14
 
16
- def self.column_names
17
- <%= attribute_names %>
18
- end
15
+ def types
16
+ @types ||= <%= types_hash %>
17
+ end
18
+
19
+ def associations
20
+ @associations ||= <%= associations %>
21
+ end
22
+
23
+ def model_instance_methods
24
+ @model_instance_methods ||= <%= instance_method_not_implemented %>
25
+ end
26
+
27
+ def model_class_methods
28
+ @model_class_methods ||= <%= class_method_not_implemented %>
29
+ end
30
+
31
+ def mocked_class
32
+ '<%= class_name %>'
33
+ end
34
+
35
+ def column_names
36
+ attribute_names
37
+ end
38
+
39
+ def attribute_names
40
+ @attribute_names ||= <%= attribute_names %>
41
+ end
42
+
43
+ def primary_key
44
+ <%= primary_key.name.inspect %>
45
+ end
19
46
 
20
- def self.attribute_names
21
- @attribute_names = <%= attribute_names %>
22
47
  end
23
48
 
24
49
  ##################################
@@ -26,75 +51,120 @@ class <%= class_name %> < ::ActiveHash::Base
26
51
  ##################################
27
52
  <% attributes.each do |meth| %>
28
53
  def <%= meth.name %>
29
- @attributes['<%= meth.name %>']
54
+ read_attribute(:<%= meth.name %>)
30
55
  end
31
56
 
32
57
  def <%= meth.name %>=(val)
33
- type = (types[:<%= meth.name %>] ||= Virtus::Attribute.build(<%= meth.type %>))
34
- @attributes['<%= meth.name %>'] = type.coerce(val)
58
+ <% association = belongs_to_foreign_key(meth.name) -%>
59
+ write_attribute(:<%= meth.name %>, val)
60
+ <% if association -%>
61
+ association = classes('<%= association.class_name %>').try(:find, <%= meth.name %>)
62
+ write_association(:<%= association.name %>,association) unless association.nil?
63
+ <% end -%>
35
64
  end
36
65
  <% end %>
37
66
  ##################################
38
- # Association getter/setters #
67
+ # Associations #
39
68
  ##################################
40
69
 
41
- def self.association_names
42
- @association_names = <%= association_names.map { |a| a.to_sym } %>
70
+ <%= '# belongs_to' unless belongs_to.empty? -%>
71
+ <% belongs_to.each do |meth| %>
72
+ def <%= meth.name %>
73
+ @associations[:<%= meth.name %>]
43
74
  end
44
- <% single_associations.each do |meth| %>
45
- def <%= meth %>
46
- associations['<%= meth %>']
75
+
76
+ def <%= meth.name %>=(val)
77
+ @associations[:<%= meth.name %>] = val
78
+ write_attribute(:<%= meth.foreign_key %>, val.id) if val.respond_to?(:persisted?) && val.persisted?
79
+ end
80
+
81
+ def build_<%= meth.name %>(attributes={}, &block)
82
+ <% association = relation_find(:name, meth.name).first -%>
83
+ <% if association -%>
84
+ association = classes('<%= association.class_name %>').try(:new, attributes, &block)
85
+ write_association(:<%= meth.name %>, association) unless association.nil?
86
+ <% end -%>
47
87
  end
48
88
 
49
- def <%= meth %>=(val)
50
- associations['<%= meth %>'] = val
89
+ def create_<%= meth.name %>(attributes={}, &block)
90
+ <% association = relation_find(:name, meth.name).first -%>
91
+ <% if association -%>
92
+ association = classes('<%= association.class_name %>').try(:create,attributes, &block)
93
+ write_association(:<%= meth.name %>, nil) unless association.nil?
94
+ <% end -%>
51
95
  end
96
+ alias_method :create_<%= meth.name %>!, :create_<%= meth.name %>
52
97
  <% end -%>
53
- <% collection_associations.each do |meth| %>
54
- def <%= meth %>
55
- associations['<%= meth %>'] ||= ActiveMocker::Collection::Association.new
98
+ <%= '# has_one' unless has_one.empty? -%>
99
+ <% has_one.each do |meth| %>
100
+ def <%= meth.name %>
101
+ @associations['<%= meth.name %>']
56
102
  end
57
103
 
58
- def <%= meth %>=(val)
59
- associations['<%= meth %>'] = ActiveMocker::Collection::Association.new(val)
104
+ def <%= meth.name %>=(val)
105
+ @associations['<%= meth.name %>'] = val
60
106
  end
107
+
108
+ def build_<%= meth.name %>(attributes={}, &block)
109
+ <% association = relation_find(:name, meth.name).first -%>
110
+ <% if association -%>
111
+ write_association(:<%= meth.name %>, classes('<%= association.class_name %>').new(attributes, &block)) if classes('<%= association.class_name %>')
61
112
  <% end -%>
113
+ end
62
114
 
63
- ##################################
64
- # Model Methods getter/setters #
65
- ##################################
115
+ def create_<%= meth.name %>(attributes={}, &block)
116
+ <% association = relation_find(:name, meth.name).first -%>
117
+ <% if association -%>
118
+ write_association(:<%= meth.name %>,classes('<%= association.class_name %>').create(attributes, &block)) if classes('<%= association.class_name %>')
119
+ <% end -%>
120
+ end
121
+ alias_method :create_<%= meth.name %>!, :create_<%= meth.name %>
122
+ <% end -%>
66
123
 
67
- def self.model_instance_methods
68
- @model_instance_methods ||= <%= model_instance_methods %>
124
+ <%= '# has_many' unless has_many.empty? -%>
125
+ <% has_many.each do |meth| %>
126
+ def <%= meth.name %>
127
+ @associations[:<%= meth.name %>] ||= ActiveMock::HasMany.new([],'<%= meth.foreign_key %>', @attributes['id'], classes('<%= meth.class_name %>'))
69
128
  end
70
129
 
71
- def self.model_class_methods
72
- @model_class_methods ||= <%= model_class_methods %>
130
+ def <%= meth.name %>=(val)
131
+ @associations[:<%= meth.name %>] ||= ActiveMock::HasMany.new(val,'<%= meth.foreign_key %>', @attributes['id'], classes('<%= meth.class_name %>'))
132
+ end
133
+ <% end -%>
134
+ <%= '# has_and_belongs_to_many' unless has_and_belongs_to_many.empty? -%>
135
+ <% has_and_belongs_to_many.each do |meth| %>
136
+ def <%= meth.name %>
137
+ @associations[:<%= meth.name %>] ||= ActiveMock::HasAndBelongsToMany.new
73
138
  end
74
139
 
75
- def self.clear_mock
76
- @model_class_methods, @model_instance_methods = nil, nil
77
- delete_all
140
+ def <%= meth.name %>=(val)
141
+ @associations[:<%= meth.name %>] = ActiveMock::HasAndBelongsToMany.new(val)
78
142
  end
143
+ <% end -%>
144
+
145
+ ##################################
146
+ # Model Methods getter/setters #
147
+ ##################################
148
+
79
149
  <% instance_methods.each do |method| %>
80
- def <%= method.method %>(<%= method.params %>)
81
- block = model_instance_methods['<%= method.method %>']
82
- self.class.is_implemented(block, '#<%= method.method %>')
83
- instance_exec(*[<%= method.params_pass %>], &block)
150
+ def <%= method.name %>(<%= method.arguments %>)
151
+ block = model_instance_methods['<%= method.name %>']
152
+ self.class.is_implemented(block, '#<%= method.name %>')
153
+ instance_exec(*[<%= method.arguments.passable %>], &block)
84
154
  end
85
155
  <% end -%>
86
156
  <% class_methods.each do |method| %>
87
- def self.<%= method.method %>(<%= method.params %>)
88
- block = model_class_methods['<%= method.method %>']
89
- is_implemented(block, '::<%= method.method %>')
90
- instance_exec(*[<%= method.params_pass %>], &block)
157
+ def self.<%= method.name %>(<%= method.arguments %>)
158
+ block = model_class_methods['<%= method.name %>']
159
+ is_implemented(block, '::<%= method.name %>')
160
+ instance_exec(*[<%= method.arguments.passable %>], &block)
91
161
  end
92
162
  <% end -%>
93
163
 
164
+ private
165
+
94
166
  def self.reload
95
167
  load __FILE__
96
168
  end
97
169
 
98
- end
99
-
100
- ActiveMocker::LoadedMocks.add(<%= class_name %>)
170
+ end
@@ -12,7 +12,8 @@ module ActiveMocker
12
12
  def parse(model_name)
13
13
  @model_name = model_name
14
14
  klass
15
- self
15
+ return self unless @klass == false
16
+ return false
16
17
  end
17
18
 
18
19
  def klass
@@ -20,22 +21,17 @@ module ActiveMocker
20
21
  end
21
22
 
22
23
  def eval_file
23
- failure = true
24
- while failure
24
+ failure = false
25
25
  begin
26
26
  m = Module.new
27
27
  m.module_eval(read_file, file_path)
28
- rescue NameError => e
29
- raise e
30
- result = e.to_s.scan /::(\w*)$/ # gets the Constant name from error
31
- const_name = result.flatten.first
32
- Logger_.debug "ActiveMocker :: Can't can't find Constant #{const_name} from class #{model_name}..\n #{caller}"
33
- next
28
+ rescue Exception => e
29
+ Logger.error "ActiveMocker :: Error loading Model: #{model_name} \n \t\t\t\t\t\t\t\t`#{e}` \n"
30
+ Logger.error "\t\t\t\t\t\t\t\t #{file_path}\n"
31
+ failure = true
34
32
  end
35
- failure = false
36
- model = m.const_get m.constants.first
37
- end
38
- model
33
+ return m.const_get m.constants.first unless failure
34
+ return false
39
35
  end
40
36
 
41
37
  def read_file
@@ -82,6 +78,39 @@ module ActiveMocker
82
78
  klass.single_relationships.flatten.compact
83
79
  end
84
80
 
81
+ def belongs_to
82
+ klass.relationships.belongs_to
83
+ end
84
+
85
+ def has_one
86
+ klass.relationships.has_one
87
+ end
88
+
89
+ def has_and_belongs_to_many
90
+ klass.relationships.has_and_belongs_to_many
91
+ end
92
+
93
+ def has_many
94
+ klass.relationships.has_many
95
+ end
96
+
97
+ def table_name
98
+ klass.table_name
99
+ end
100
+
101
+ def primary_key
102
+ klass.primary_key
103
+ end
104
+
105
+ def constants
106
+ const = {}
107
+ klass.constants.each {|c| const[c] = klass.const_get(c)}
108
+ const = const.reject do |c, v|
109
+ v.class == Module || v.class == Class
110
+ end
111
+ const
112
+ end
113
+
85
114
  end
86
115
 
87
116
  end
@@ -0,0 +1,279 @@
1
+ module ActiveMocker
2
+
3
+ module LoggerToJson
4
+
5
+ def initialize(*args)
6
+ super(args)
7
+ UnitLogger.unit.info "#{caller_locations[1]}\n"
8
+ obj = JSON.parse(self.to_hash.to_json)
9
+ UnitLogger.unit.info "#{self.class.name}: #{JSON.pretty_unparse(obj)}\n"
10
+ puts "#{self.class.name}: #{JSON.pretty_unparse(obj)}\n"
11
+ end
12
+
13
+ end
14
+
15
+ class ModelSchemaCollection
16
+
17
+ include Enumerable
18
+
19
+ attr_accessor :collection
20
+
21
+ def initialize(collection)
22
+ @collection = collection
23
+ end
24
+
25
+ def each(&block)
26
+ collection.each do |item|
27
+ block.call(item)
28
+ end
29
+ end
30
+
31
+ def find_by(options={})
32
+ collection.select{|c| c.send(options.keys.first) == options.values.first}.first
33
+ end
34
+
35
+ def find_by_in_relationships(options={})
36
+ result = nil
37
+ collection.each do |item|
38
+ result = item.relationships.select do |attr|
39
+ attr.send(options.keys.first) == options.values.first
40
+ end
41
+ end
42
+ result
43
+ end
44
+
45
+
46
+ def [](val)
47
+ collection[val]
48
+ end
49
+
50
+ end
51
+
52
+ class ModelSchema
53
+
54
+ include LoggerToJson
55
+
56
+ attr_reader :class_name, :table_name, :attributes, :relationships, :methods
57
+
58
+ def initialize( class_name: nil,
59
+ table_name: nil,
60
+ attributes: nil,
61
+ relationships: nil,
62
+ methods: nil,
63
+ constants: nil,
64
+ is_join_table: nil,
65
+ join_table_members: nil
66
+ )
67
+ @class_name = class_name
68
+ @table_name = table_name
69
+ @attributes = attributes unless attributes.nil?
70
+ @relationships = relationships unless relationships.nil?
71
+ @methods = methods unless (methods || []).empty?
72
+ @constants = constants unless (constants || []).empty?
73
+ @is_join_table = is_join_table unless is_join_table.nil?
74
+ @join_table_members = join_table_members unless join_table_members.nil?
75
+
76
+ # UnitLogger.unit.info "#{caller_locations[1]}\n"
77
+ # obj = ::JSON.parse(self.to_json)
78
+ # UnitLogger.unit.info "#{self.class.name}: #{JSON.pretty_unparse(obj)}\n"
79
+ # puts "#{self.class.name}: #{JSON.pretty_unparse(obj)}\n"
80
+ end
81
+
82
+ def constants
83
+ @constants || []
84
+ end
85
+
86
+ def has_many
87
+ relation_find(:type, :has_many)
88
+ end
89
+
90
+ def has_one
91
+ relation_find(:type, :has_one)
92
+ end
93
+
94
+ def belongs_to
95
+ relation_find(:type, :belongs_to)
96
+ end
97
+
98
+ def has_and_belongs_to_many
99
+ relation_find(:type, :has_and_belongs_to_many)
100
+ end
101
+
102
+ def belongs_to_foreign_key(foreign_key)
103
+ belongs_to.select { |r| r.foreign_key.to_sym == foreign_key.to_sym }.first
104
+ end
105
+
106
+ def relation_find(key, value)
107
+ relationships.select { |r| r.send(key).to_sym == value }
108
+ end
109
+
110
+ def instance_methods
111
+ method_find(:instance)
112
+ end
113
+
114
+ def class_methods
115
+ method_find(:class)
116
+ end
117
+
118
+ def method_find(type)
119
+ return [] if methods.nil?
120
+ methods.select { |r| r.type.to_sym == type }
121
+ end
122
+
123
+ def attribute_names
124
+ attributes.map(&:name)
125
+ end
126
+
127
+ def types_hash
128
+ types = {}
129
+ attributes.each do |attr|
130
+ types[attr.name] = "build_type(#{attr.ruby_type})"
131
+ end
132
+
133
+ type_array = types.map do |name, type|
134
+ "#{name}: #{type}"
135
+ end
136
+ '{ ' + type_array.join(', ') + ' }'
137
+ end
138
+
139
+ def attributes_with_defaults
140
+ hash = {}
141
+ attributes.each do |attr|
142
+ hash[attr.name] = attr.default_value
143
+ end
144
+ hash
145
+ end
146
+
147
+ def associations
148
+ hash = {}
149
+ relationships.each do |r|
150
+ hash[r.name] = nil
151
+ end
152
+ hash
153
+ end
154
+
155
+ def mock_name(klass_name)
156
+ klass_name + "Mock"
157
+ end
158
+
159
+ def class_method_not_implemented
160
+ not_implemented(class_methods)
161
+ end
162
+
163
+ def instance_method_not_implemented
164
+ not_implemented(instance_methods)
165
+ end
166
+
167
+ def not_implemented(collection)
168
+ hash = {}
169
+ collection.each do |meth|
170
+ hash[meth.name.to_s] = :not_implemented
171
+ end
172
+ hash
173
+ end
174
+
175
+ def render(template, mock_append_name)
176
+ @mock_append_name = mock_append_name
177
+ ERB.new(template, nil, '-').result(binding)
178
+ end
179
+
180
+ private :relation_find
181
+
182
+ def primary_key
183
+ key_attribute = attributes.select { |attr| attr.primary_key }.first
184
+ return key_attribute if key_attribute
185
+ default_primary_key
186
+ end
187
+
188
+ def default_primary_key
189
+ default_id = Attributes.new(name: 'id', primary_key: true, type: :integer)
190
+ attributes.unshift(default_id)
191
+ default_id
192
+ end
193
+
194
+ class Attributes
195
+
196
+ attr_reader :name, :type, :precision, :scale, :default_value, :primary_key
197
+ attr_writer :primary_key
198
+ def initialize(name:,
199
+ type:,
200
+ precision: nil,
201
+ scale: nil,
202
+ default_value: nil,
203
+ primary_key: nil
204
+ )
205
+ @name = name
206
+ @type = type
207
+ @precision = precision unless precision.nil?
208
+ @scale = scale unless scale.nil?
209
+ @default_value = default_value unless default_value.nil?
210
+ @primary_key = primary_key unless primary_key.nil?
211
+ end
212
+
213
+ def ruby_type
214
+ ActiveMocker::DBToRubyType.call(type)
215
+ end
216
+
217
+ end
218
+
219
+ class Relationships
220
+
221
+ attr_reader :name, :class_name, :type, :through, :foreign_key, :join_table
222
+
223
+ def initialize(name:,
224
+ class_name:,
225
+ type:,
226
+ through:,
227
+ foreign_key:,
228
+ join_table:
229
+ )
230
+ @name = name
231
+ @class_name = class_name
232
+ @type = type
233
+ @through = through unless through.nil?
234
+ @foreign_key = foreign_key unless foreign_key.nil?
235
+ @join_table = join_table unless join_table.nil?
236
+ end
237
+
238
+ end
239
+
240
+ class Methods
241
+
242
+ attr_reader :name, :arguments, :type
243
+
244
+ def initialize( name:,
245
+ arguments:,
246
+ type:
247
+ )
248
+ @name = name
249
+ @arguments = Arguments.new(arguments)
250
+ @type = type
251
+ end
252
+
253
+ class Arguments
254
+
255
+ attr_reader :arguments
256
+
257
+ def initialize(arguments)
258
+ @arguments = arguments
259
+ end
260
+
261
+ def to_hash
262
+ @arguments
263
+ end
264
+
265
+ def to_s
266
+ Reparameterize.call(arguments)
267
+ end
268
+
269
+ def passable
270
+ Reparameterize.call(arguments, param_list: true)
271
+ end
272
+
273
+ end
274
+
275
+ end
276
+
277
+ end
278
+
279
+ end