active_mocker 1.6.2 → 1.6.3
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 +11 -0
- data/README.md +9 -5
- data/lib/active_mocker.rb +3 -0
- data/lib/active_mocker/active_record.rb +1 -0
- data/lib/active_mocker/mock.rb +1 -0
- data/lib/active_mocker/mock/base.rb +2 -11
- data/lib/active_mocker/mock_template.erb +0 -1
- data/lib/active_mocker/model_reader.rb +53 -25
- data/lib/active_mocker/model_schema/generate.rb +11 -9
- data/lib/active_mocker/rspec_helper.rb +2 -2
- data/lib/active_mocker/ruby_parse.rb +68 -0
- data/lib/active_mocker/task.rake +11 -0
- data/lib/active_mocker/version.rb +1 -1
- metadata +35 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b9ffc902e6ec65a43aced40034136b32162c83d
|
4
|
+
data.tar.gz: 05f4e7753af31a25d6df189bd345c8f4b966b832
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85bf777384443284ad2a40a38749d3c910145abc8590962a0b4f6b2682bfaf81b1a390eb29d9ff531c21052cfdb1481fd0284ed9c5e20d9b415f390d057211bf
|
7
|
+
data.tar.gz: 8d17e5205fda5b47b2f2eec67378aab8528eee1450106288c049732395b221c7fed13701159661a6e896c6e932b2413525b53368932947463970d032504c8cb3
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
|
+
## 1.6.3 - 2014-08-14
|
4
|
+
|
5
|
+
### Fix
|
6
|
+
- Remove check for object is defined and then deleting, it is no longer needed there are better ways to manage clearing state.
|
7
|
+
- `rake active_mock:build` failed parsing when an ActiveRecord Model had no table, example where `self.abstract_class = true` was set.
|
8
|
+
- `rake active_mock:build` failed for STI models.
|
9
|
+
|
10
|
+
###Enhancement
|
11
|
+
- Removing methods `#hash` and `==` and using Ruby defaults gives modest performance improvements.
|
12
|
+
- Cache build_types object for small performance improvements.
|
13
|
+
|
3
14
|
## 1.6.2 - 2014-07-31
|
4
15
|
|
5
16
|
## Fix
|
data/README.md
CHANGED
@@ -37,7 +37,7 @@ Examples from a real apps
|
|
37
37
|
|
38
38
|
---------------------------
|
39
39
|
|
40
|
-
## Documentation
|
40
|
+
## Documentation [](http://inch-ci.org/github/zeisler/active_mocker)
|
41
41
|
|
42
42
|
[rdoc](http://rdoc.info/github/zeisler/active_mocker/master/ActiveMocker)
|
43
43
|
|
@@ -71,11 +71,15 @@ Or install it yourself as:
|
|
71
71
|
|
72
72
|
## Setup
|
73
73
|
|
74
|
+
|
75
|
+
See [example_rails_app](https://github.com/zeisler/active_mocker/tree/master/example_rails_app) for complete setup.
|
76
|
+
|
77
|
+
|
74
78
|
### Generate Mocks
|
75
79
|
|
76
80
|
Running this rake task builds/rebuilds the mocks. It will be ran automatically after every schema modification. If the model changes this rake task needs to be called manually. You could add a file watcher for when your models change and have it run the rake task.
|
77
81
|
|
78
|
-
rake active_mocker
|
82
|
+
rake active_mocker:build
|
79
83
|
|
80
84
|
## Usage
|
81
85
|
|
@@ -254,7 +258,7 @@ Running this rake task builds/rebuilds the mocks. It will be ran automatically a
|
|
254
258
|
|
255
259
|
|
256
260
|
### Scoped Methods
|
257
|
-
* As long the mock file that holds the scope method is required it will be available but
|
261
|
+
* As long the mock file that holds the scope method is required it will be available but raise an `unimplemented error` when called.
|
258
262
|
|
259
263
|
### Managing Mocks
|
260
264
|
|
@@ -341,9 +345,9 @@ See [Documentation](http://rdoc.info/github/zeisler/active_mocker/master/ActiveM
|
|
341
345
|
### Known Limitations
|
342
346
|
* Model names and table names must follow the default ActiveRecord naming pattern.
|
343
347
|
* Whatever associations are setup in one mock object will not be reflected in any other objects.
|
344
|
-
* There partial support for
|
348
|
+
* There's partial support for it to work more like ActiveRecord in v1.6 when `ActiveMocker::Mock.config.experimental = true` is set. When v1.7 comes out these features will be moved out of experimantal.
|
345
349
|
|
346
|
-
* Validation are not present in mocks.
|
350
|
+
* Validation/Callbacks are not present in mocks. A Work around is putting the method into a module with required ActiveSupport/ActiveModel dependencies and make sure the code is supported by the mock.
|
347
351
|
* Sql queries, joins, etc will never be supported.
|
348
352
|
|
349
353
|
## Inspiration
|
data/lib/active_mocker.rb
CHANGED
@@ -24,4 +24,7 @@ require 'active_mocker/reparameterize'
|
|
24
24
|
require 'active_mocker/db_to_ruby_type'
|
25
25
|
require 'active_mocker/model_schema'
|
26
26
|
require 'active_mocker/model_schema/generate'
|
27
|
+
require 'parser/current'
|
28
|
+
require 'unparser'
|
29
|
+
require 'active_mocker/ruby_parse'
|
27
30
|
require 'virtus'
|
data/lib/active_mocker/mock.rb
CHANGED
@@ -99,7 +99,8 @@ class Base
|
|
99
99
|
end
|
100
100
|
|
101
101
|
def build_type(type)
|
102
|
-
|
102
|
+
@@built_types ||= {}
|
103
|
+
@@built_types[type] ||= Virtus::Attribute.build(type)
|
103
104
|
end
|
104
105
|
|
105
106
|
def classes(klass)
|
@@ -256,16 +257,6 @@ class Base
|
|
256
257
|
ObjectInspect.new(self.class.name, attributes).to_s
|
257
258
|
end
|
258
259
|
|
259
|
-
def hash
|
260
|
-
attributes.hash
|
261
|
-
end
|
262
|
-
|
263
|
-
def ==(obj)
|
264
|
-
return false if obj.nil?
|
265
|
-
return hash == obj.attributes.hash if obj.respond_to?(:attributes)
|
266
|
-
hash == obj.hash if obj.respond_to?(:hash)
|
267
|
-
end
|
268
|
-
|
269
260
|
module PropertiesGetterAndSetter
|
270
261
|
|
271
262
|
# Returns the value of the attribute identified by <tt>attr_name</tt> after
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'active_mocker/mock'
|
2
|
-
Object.send(:remove_const, "<%= class_name + @mock_append_name %>") if Object.const_defined?("<%= class_name + @mock_append_name %>")
|
3
2
|
|
4
3
|
class <%= class_name + @mock_append_name %> < ActiveMocker::Mock::Base
|
5
4
|
<% constants.each do |constant| -%>
|
@@ -1,5 +1,7 @@
|
|
1
|
+
|
1
2
|
module ActiveMocker
|
2
3
|
# @api private
|
4
|
+
|
3
5
|
class ModelReader
|
4
6
|
|
5
7
|
attr_reader :model_name, :model_dir, :file_reader
|
@@ -12,44 +14,68 @@ module ActiveMocker
|
|
12
14
|
def parse(model_name)
|
13
15
|
@model_name = model_name
|
14
16
|
klass
|
15
|
-
return self
|
17
|
+
return self if @klass
|
16
18
|
return false
|
17
19
|
end
|
18
20
|
|
19
21
|
def klass
|
20
|
-
@klass ||= eval_file
|
22
|
+
@klass ||= eval_file(sandbox_model, file_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def sandbox_model
|
26
|
+
source = ActiveMocker::RubyParse.new(read_file)
|
27
|
+
if source.has_parent_class? && source.parent_class_name == 'ActiveRecord::Base'
|
28
|
+
source.modify_parent_class('ActiveMocker::ActiveRecord::Base')
|
29
|
+
else
|
30
|
+
load_parent_class(source.parent_class_name)
|
31
|
+
read_file
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def load_parent_class(class_name)
|
36
|
+
file_name = class_name.tableize.singularize
|
37
|
+
source = ActiveMocker::RubyParse.new(read_file(file_name)).modify_parent_class('ActiveMocker::ActiveRecord::Base')
|
38
|
+
eval_file(source, file_path(file_name))
|
21
39
|
end
|
22
40
|
|
23
|
-
def
|
41
|
+
def module_namespace
|
42
|
+
@module ||= Module.new
|
43
|
+
end
|
44
|
+
|
45
|
+
def eval_file(string, file_path)
|
24
46
|
failure = false
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
47
|
+
begin
|
48
|
+
|
49
|
+
module_namespace.module_eval(string, file_path)
|
50
|
+
_klass = module_namespace.const_get(module_namespace.constants.last)
|
51
|
+
rescue SyntaxError => e
|
52
|
+
log_loading_error(e, true)
|
53
|
+
failure = true
|
54
|
+
rescue Exception => e
|
55
|
+
log_loading_error(e, false)
|
56
|
+
failure = true
|
57
|
+
end
|
58
|
+
return false if failure
|
59
|
+
_klass
|
60
|
+
end
|
61
|
+
|
62
|
+
def log_loading_error(msg, print_to_stdout=false)
|
63
|
+
main = "ActiveMocker :: Error loading Model: #{model_name} \n\t#{msg}\n"
|
64
|
+
file = "\t#{file_path}\n"
|
65
|
+
Logger.error main + file
|
66
|
+
print main + file if print_to_stdout
|
41
67
|
end
|
42
68
|
|
43
69
|
def real
|
44
70
|
model_name.classify.constantize
|
45
71
|
end
|
46
72
|
|
47
|
-
def read_file
|
48
|
-
file_reader.read(file_path)
|
73
|
+
def read_file(m_name=model_name)
|
74
|
+
file_reader.read(file_path(m_name))
|
49
75
|
end
|
50
76
|
|
51
|
-
def file_path
|
52
|
-
"#{model_dir}/#{
|
77
|
+
def file_path(m_name=model_name)
|
78
|
+
"#{model_dir}/#{m_name}.rb"
|
53
79
|
end
|
54
80
|
|
55
81
|
def class_methods
|
@@ -74,12 +100,14 @@ module ActiveMocker
|
|
74
100
|
|
75
101
|
def instance_methods_with_arguments
|
76
102
|
instance_methods.map do |m|
|
77
|
-
{m => klass.
|
103
|
+
{m => klass.instance_method(m).parameters }
|
78
104
|
end
|
79
105
|
end
|
80
106
|
|
81
107
|
def instance_methods
|
82
|
-
klass.public_instance_methods(false)
|
108
|
+
methods = klass.public_instance_methods(false)
|
109
|
+
methods << klass.superclass.public_instance_methods(false) if klass.superclass != ActiveRecord::Base
|
110
|
+
methods.flatten
|
83
111
|
end
|
84
112
|
|
85
113
|
def relationships_types
|
@@ -35,20 +35,22 @@ module ActiveMocker
|
|
35
35
|
def run
|
36
36
|
model_schemas = models.map do |model_name|
|
37
37
|
|
38
|
-
model
|
38
|
+
model = get_model(model_name)
|
39
39
|
next if model == false
|
40
|
-
table
|
41
|
-
|
40
|
+
table = get_table(model, model_name)
|
41
|
+
table_name = model_name
|
42
|
+
attributes = []
|
43
|
+
attributes = build_attributes(table.fields, primary_key(table.fields, model)) unless table.nil?
|
42
44
|
|
43
45
|
increment_progress
|
44
46
|
|
45
|
-
ModelSchema.new(class_name:
|
46
|
-
table_name:
|
47
|
-
attributes:
|
48
|
-
methods:
|
47
|
+
ModelSchema.new(class_name: model_name.camelize,
|
48
|
+
table_name: table_name,
|
49
|
+
attributes: attributes,
|
50
|
+
methods: build_methods(model),
|
49
51
|
relationships: build_relationships(model),
|
50
|
-
constants:
|
51
|
-
modules:
|
52
|
+
constants: model.constants,
|
53
|
+
modules: model.modules)
|
52
54
|
|
53
55
|
end
|
54
56
|
|
@@ -7,8 +7,8 @@ RSpec.configure do |config|
|
|
7
7
|
ActiveMocker::LoadedMocks.class_name_to_mock.select { |name, mock| name == class_name }.values.first
|
8
8
|
end
|
9
9
|
|
10
|
-
config.before(:each) do
|
11
|
-
|
10
|
+
config.before(:each, active_mocker: true) do
|
11
|
+
unless ENV['RUN_WITH_RAILS'] && self.class.metadata[:rails_compatible]
|
12
12
|
ActiveMocker::LoadedMocks.class_name_to_mock.each { |class_name, mock| stub_const(class_name, mock) }
|
13
13
|
end
|
14
14
|
end
|
@@ -0,0 +1,68 @@
|
|
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
|
+
|
data/lib/active_mocker/task.rake
CHANGED
@@ -1,9 +1,20 @@
|
|
1
1
|
namespace :active_mocker do
|
2
|
+
|
2
3
|
desc('Rebuild mocks.')
|
3
4
|
task :build => :environment do
|
4
5
|
ActiveMocker::Generate.new
|
5
6
|
end
|
6
7
|
|
8
|
+
desc('Run all tests tagged active_mocker')
|
9
|
+
task :test do
|
10
|
+
sh 'rspec --tag active_mocker'
|
11
|
+
end
|
12
|
+
|
13
|
+
desc('Run all tests tagged active_mocker and rails_compatible and will disable model stubbing')
|
14
|
+
task :rails_compatible do
|
15
|
+
sh 'RUN_WITH_RAILS=1 rspec --tag rails_compatible'
|
16
|
+
end
|
17
|
+
|
7
18
|
end
|
8
19
|
|
9
20
|
['db:migrate'].each do |task|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_mocker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dustin Zeisler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -53,61 +53,75 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.4'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: parser
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '1
|
62
|
-
type: :
|
61
|
+
version: '2.1'
|
62
|
+
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '1
|
68
|
+
version: '2.1'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: unparser
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '0.1'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: bundler
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.5'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
96
|
+
version: '1.5'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
98
|
+
name: rake
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- -
|
101
|
+
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
103
|
+
version: '10.1'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- -
|
108
|
+
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
110
|
+
version: '10.1'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
|
-
name: rspec
|
112
|
+
name: rspec
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - '='
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
117
|
+
version: '3'
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
122
|
- - '='
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
124
|
+
version: '3'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: sqlite3
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,19 +151,19 @@ dependencies:
|
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '4.1'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
154
|
+
name: rspec-rails
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
142
156
|
requirements:
|
143
157
|
- - "~>"
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
159
|
+
version: '3'
|
146
160
|
type: :development
|
147
161
|
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
|
-
version: '
|
166
|
+
version: '3'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: rspec-given
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,20 +206,6 @@ dependencies:
|
|
192
206
|
- - "~>"
|
193
207
|
- !ruby/object:Gem::Version
|
194
208
|
version: '0.5'
|
195
|
-
- !ruby/object:Gem::Dependency
|
196
|
-
name: ruby-prof
|
197
|
-
requirement: !ruby/object:Gem::Requirement
|
198
|
-
requirements:
|
199
|
-
- - "~>"
|
200
|
-
- !ruby/object:Gem::Version
|
201
|
-
version: '0.15'
|
202
|
-
type: :development
|
203
|
-
prerelease: false
|
204
|
-
version_requirements: !ruby/object:Gem::Requirement
|
205
|
-
requirements:
|
206
|
-
- - "~>"
|
207
|
-
- !ruby/object:Gem::Version
|
208
|
-
version: '0.15'
|
209
209
|
description: ActiveMocker creates mocks classes from ActiveRecord models. Allowing
|
210
210
|
your test suite to run very fast by not loading Rails or hooking to a database.
|
211
211
|
It parses the schema.rb and the defined methods on a model then generates a ruby
|
@@ -262,6 +262,7 @@ files:
|
|
262
262
|
- lib/active_mocker/railtie.rb
|
263
263
|
- lib/active_mocker/reparameterize.rb
|
264
264
|
- lib/active_mocker/rspec_helper.rb
|
265
|
+
- lib/active_mocker/ruby_parse.rb
|
265
266
|
- lib/active_mocker/schema_reader.rb
|
266
267
|
- lib/active_mocker/string_reader.rb
|
267
268
|
- lib/active_mocker/table.rb
|