to_factory 0.1.1 → 0.2.0
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/.travis.yml +1 -0
- data/README.md +8 -11
- data/lib/to_factory/collation.rb +40 -14
- data/lib/to_factory/file_sync.rb +9 -7
- data/lib/to_factory/file_writer.rb +21 -11
- data/lib/to_factory/finders/factory.rb +12 -6
- data/lib/to_factory/finders/model.rb +25 -9
- data/lib/to_factory/generation/attribute.rb +35 -17
- data/lib/to_factory/generation/factory.rb +32 -24
- data/lib/to_factory/klass_inference.rb +50 -0
- data/lib/to_factory/options_parser.rb +34 -0
- data/lib/to_factory/parsing/file.rb +1 -0
- data/lib/to_factory/parsing/syntax.rb +6 -17
- data/lib/to_factory/representation.rb +27 -0
- data/lib/to_factory/version.rb +1 -1
- data/lib/to_factory.rb +4 -4
- data/spec/example_factories/new_syntax/user_admin_root.rb +21 -0
- data/spec/example_factories/new_syntax/user_admin_super_admin.rb +4 -4
- data/spec/example_factories/old_syntax/user_admin_root.rb +21 -0
- data/spec/example_factories/old_syntax/user_admin_super_admin.rb +4 -3
- data/spec/integration/file_sync_spec.rb +9 -3
- data/spec/integration/file_writer_spec.rb +5 -3
- data/spec/integration/to_factory_method_spec.rb +17 -11
- data/spec/unit/collation_spec.rb +25 -18
- data/spec/unit/file_writer_spec.rb +4 -2
- data/spec/unit/finders/factory_spec.rb +2 -3
- data/spec/unit/generator_spec.rb +13 -16
- data/spec/unit/parsing/file_spec.rb +10 -11
- data/spec/unit/parsing/klass_inference_spec.rb +15 -16
- data/to_factory.gemspec +0 -1
- metadata +21 -32
- data/lib/to_factory/definition_group.rb +0 -47
- data/lib/to_factory/parsing/klass_inference.rb +0 -34
- data/spec/unit/definition_group_spec.rb +0 -19
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
ToFactory
|
1
|
+
ToFactory :wrench:
|
2
2
|
=========
|
3
3
|
|
4
4
|
[](https://travis-ci.org/markburns/to_factory)
|
@@ -16,11 +16,10 @@ Easily add factories with valid data for an existing project.
|
|
16
16
|
* unintrusively update factory files in place
|
17
17
|
* Parses and writes both new `FactoryGirl`, syntax or older `Factory.define` syntax
|
18
18
|
|
19
|
-
Tested against Ruby 1.8.7, 1.9.3, 2.0.0, 2.1.x, 2.2.0
|
19
|
+
Tested against Ruby 1.8.7, 1.9.2, 1.9.3, 2.0.0, 2.1.x, 2.2.0
|
20
20
|
|
21
21
|
|
22
|
-
|
23
|
-
___________
|
22
|
+
## Installation :file_folder:
|
24
23
|
|
25
24
|
```ruby
|
26
25
|
|
@@ -31,20 +30,21 @@ group :test, :development do
|
|
31
30
|
end
|
32
31
|
```
|
33
32
|
|
34
|
-
|
35
|
-
#Warning
|
33
|
+
## Warning :warning:
|
36
34
|
`ToFactory` writes into the `spec/factories` folder. Whilst it
|
37
35
|
is tested and avoids overwriting existing factories,
|
38
36
|
it is recommended that you execute after committing or when in a known
|
39
37
|
safe state.
|
40
38
|
|
41
|
-
|
39
|
+
|
40
|
+
|
42
41
|
```bash
|
43
42
|
git add spec/factories
|
44
43
|
git commit -m "I know what I am doing"
|
45
44
|
rails c
|
46
45
|
>ToFactory()
|
47
46
|
```
|
47
|
+
## Example :computer:
|
48
48
|
|
49
49
|
```ruby
|
50
50
|
#Generate all factories
|
@@ -87,10 +87,7 @@ ToFactory :admin => User.last
|
|
87
87
|
|
88
88
|
```
|
89
89
|
|
90
|
-
|
91
|
-
* Factory generation does not follow a hierarchical order, so factory files may require manual editing for now.
|
92
|
-
|
93
|
-
#Other useful projects
|
90
|
+
### Other useful projects
|
94
91
|
|
95
92
|
If you are adding specs to an existing project you may want to look at:
|
96
93
|
|
data/lib/to_factory/collation.rb
CHANGED
@@ -2,32 +2,58 @@ module ToFactory
|
|
2
2
|
AlreadyExists = Class.new ArgumentError
|
3
3
|
|
4
4
|
class Collation
|
5
|
-
def self.
|
6
|
-
|
5
|
+
def self.organize(a,b)
|
6
|
+
new(a, b).organize
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
+
def self.representations_from(a,b)
|
10
|
+
new(a, b).representations
|
9
11
|
end
|
10
12
|
|
11
|
-
def
|
12
|
-
|
13
|
+
def initialize(a, b)
|
14
|
+
@a = a
|
15
|
+
@b = b
|
16
|
+
end
|
13
17
|
|
14
|
-
|
18
|
+
def organize
|
19
|
+
representations.group_by(&:klass).inject({}) do |o, (klass,r)|
|
20
|
+
o[klass] = r.sort_by(&:hierarchy_order)
|
21
|
+
o
|
22
|
+
end
|
15
23
|
end
|
16
24
|
|
17
|
-
def
|
18
|
-
a
|
19
|
-
|
20
|
-
|
25
|
+
def representations
|
26
|
+
detect_collisions!(@a,@b)
|
27
|
+
|
28
|
+
inference = KlassInference.new(merged)
|
29
|
+
|
30
|
+
merged.each do |r|
|
31
|
+
klass, order = inference.infer(r.name)
|
32
|
+
r.klass = klass
|
33
|
+
r.hierarchy_order = order
|
34
|
+
end
|
35
|
+
|
36
|
+
merged
|
37
|
+
end
|
38
|
+
|
39
|
+
def detect_collisions!(a,b)
|
40
|
+
collisions = []
|
41
|
+
a.each do |x|
|
42
|
+
b.each do |y|
|
43
|
+
collisions << x.name if x.name == y.name
|
21
44
|
end
|
22
45
|
end
|
46
|
+
|
47
|
+
raise_already_exists!(collisions) if collisions.any?
|
23
48
|
end
|
24
49
|
|
25
|
-
|
26
|
-
|
27
|
-
|
50
|
+
private
|
51
|
+
|
52
|
+
def merged
|
53
|
+
@merged ||= @a + @b
|
28
54
|
end
|
29
55
|
|
30
|
-
|
56
|
+
def raise_already_exists!(keys)
|
31
57
|
raise ToFactory::AlreadyExists.new "an item for each of the following keys #{keys} already exists"
|
32
58
|
end
|
33
59
|
end
|
data/lib/to_factory/file_sync.rb
CHANGED
@@ -9,22 +9,24 @@ module ToFactory
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def perform(exclusions=[])
|
12
|
-
|
13
|
-
|
14
|
-
@file_writer.write(definitions)
|
12
|
+
@file_writer.write(all_representations exclusions)
|
15
13
|
end
|
16
14
|
|
17
|
-
def
|
18
|
-
|
15
|
+
def all_representations(exclusions=[])
|
16
|
+
Collation.organize(
|
17
|
+
new_representations(exclusions),
|
18
|
+
existing_representations)
|
19
|
+
end
|
19
20
|
|
21
|
+
def new_representations(exclusions=[])
|
20
22
|
instances = @model_finder.call(exclusions)
|
21
23
|
|
22
|
-
|
24
|
+
instances.map{|r| Representation.from(r) }
|
23
25
|
end
|
24
26
|
|
25
27
|
private
|
26
28
|
|
27
|
-
def
|
29
|
+
def existing_representations
|
28
30
|
@factory_finder.call
|
29
31
|
end
|
30
32
|
|
@@ -5,33 +5,43 @@ module ToFactory
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def write(definitions)
|
8
|
-
definitions.each do |klass,
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
File.open(File.join(ToFactory.factories, "#{name}.rb"), "w") do |f|
|
13
|
-
f << wrap_factories(factories.values)
|
8
|
+
definitions.each do |klass, representations|
|
9
|
+
write_to(name_from klass) do
|
10
|
+
wrap_factories(representations.map(&:definition))
|
14
11
|
end
|
15
12
|
end
|
16
13
|
end
|
17
14
|
|
18
15
|
private
|
19
16
|
|
20
|
-
def
|
17
|
+
def name_from(klass)
|
18
|
+
klass.name.underscore.gsub /^"|"$/, ""
|
19
|
+
end
|
20
|
+
|
21
|
+
def write_to(name)
|
22
|
+
mkdir(name)
|
23
|
+
|
24
|
+
File.open(File.join(ToFactory.factories, "#{name}.rb"), "w") do |f|
|
25
|
+
f << yield
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def wrap_factories(definitions)
|
21
30
|
if ToFactory.new_syntax?
|
22
|
-
modern_header(
|
31
|
+
modern_header(definitions)
|
23
32
|
else
|
24
|
-
|
33
|
+
definitions.join("\n\n")
|
25
34
|
end
|
26
35
|
end
|
27
36
|
|
28
|
-
def modern_header(
|
37
|
+
def modern_header(definitions)
|
29
38
|
out = "FactoryGirl.define do\n"
|
30
|
-
out <<
|
39
|
+
out << definitions.join("\n")
|
31
40
|
out << "\nend\n"
|
32
41
|
end
|
33
42
|
|
34
43
|
def mkdir(name)
|
44
|
+
return unless name.to_s["/"]
|
35
45
|
dir = name.to_s.split("/")[0..-2]
|
36
46
|
FileUtils.mkdir_p File.join(ToFactory.factories, dir)
|
37
47
|
end
|
@@ -2,15 +2,21 @@ module ToFactory
|
|
2
2
|
module Finders
|
3
3
|
class Factory
|
4
4
|
def call
|
5
|
-
|
5
|
+
all = []
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
all_factories = Collation.merge(all_factories, factories)
|
7
|
+
parsed_files.each do |r|
|
8
|
+
all = Collation.representations_from(all, r)
|
11
9
|
end
|
12
10
|
|
13
|
-
|
11
|
+
all
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def parsed_files
|
17
|
+
Dir.glob(File.join(ToFactory.factories, "**/*.rb")).map do |f|
|
18
|
+
ToFactory::Parsing::File.parse(f)
|
19
|
+
end
|
14
20
|
end
|
15
21
|
end
|
16
22
|
end
|
@@ -4,15 +4,9 @@ module ToFactory
|
|
4
4
|
def call(exclusions=[])
|
5
5
|
instances = []
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
klass = rescuing_require file, match
|
11
|
-
break if exclusions.include?(klass)
|
12
|
-
instance = get_active_record_instance(klass)
|
13
|
-
instances << instance if instance
|
14
|
-
break
|
15
|
-
end
|
7
|
+
each_klass(exclusions) do |klass|
|
8
|
+
if instance = get_active_record_instance(klass)
|
9
|
+
instances << instance
|
16
10
|
end
|
17
11
|
end
|
18
12
|
|
@@ -21,6 +15,28 @@ module ToFactory
|
|
21
15
|
|
22
16
|
private
|
23
17
|
|
18
|
+
def each_klass(exclusions)
|
19
|
+
models.each do |file|
|
20
|
+
matching_lines(file) do |match|
|
21
|
+
klass = rescuing_require(file, match)
|
22
|
+
|
23
|
+
break if exclusions.include?(klass) || yield(klass)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def models
|
29
|
+
Dir.glob("#{ToFactory.models}/**/*.rb")
|
30
|
+
end
|
31
|
+
|
32
|
+
def matching_lines(file)
|
33
|
+
File.readlines(file).each do |l|
|
34
|
+
if match = l.match(/class (.*) ?</)
|
35
|
+
yield match
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
24
40
|
def rescuing_require(file, match)
|
25
41
|
require file
|
26
42
|
klass = eval(match[1])
|
@@ -17,35 +17,53 @@ module ToFactory
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def inspect_value(value, nested=false)
|
20
|
-
formatted =
|
20
|
+
formatted = format(value, nested)
|
21
|
+
|
22
|
+
if !value.is_a?(Hash) && !nested
|
23
|
+
formatted = " #{formatted}"
|
24
|
+
end
|
25
|
+
|
26
|
+
formatted
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def format(value, nested)
|
32
|
+
case value
|
21
33
|
when Time, DateTime
|
22
|
-
|
23
|
-
time.gsub(/UTC"$/, "Z\"").gsub(/GMT"$/, "Z\"")
|
34
|
+
inspect_time(value)
|
24
35
|
when BigDecimal
|
25
36
|
value.to_f.inspect
|
26
37
|
when Hash
|
27
|
-
|
28
|
-
formatted_key = inspect_value(key, true)
|
29
|
-
formatted_value = inspect_value(value.fetch(key), true)
|
30
|
-
a << "#{formatted_key} => #{formatted_value}"
|
31
|
-
end.join(', ')
|
32
|
-
|
33
|
-
if nested
|
34
|
-
"{#{formatted}}"
|
35
|
-
else
|
36
|
-
"({#{formatted}})"
|
37
|
-
end
|
38
|
+
inspect_hash(value, nested)
|
38
39
|
when Array
|
39
40
|
value.map{|v| inspect_value(v)}
|
40
41
|
else
|
41
42
|
value.inspect
|
42
43
|
end
|
44
|
+
end
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
+
def inspect_time(value)
|
47
|
+
time = in_utc(value).strftime("%Y-%m-%dT%H:%M%Z").inspect
|
48
|
+
time.gsub(/UTC"$/, "Z\"").gsub(/GMT"$/, "Z\"")
|
49
|
+
end
|
50
|
+
|
51
|
+
def inspect_hash(value, nested)
|
52
|
+
formatted = value.keys.inject([]) do |a, key|
|
53
|
+
a << key_value_pair(key, value)
|
54
|
+
end.join(', ')
|
55
|
+
|
56
|
+
if nested
|
57
|
+
"{#{formatted}}"
|
58
|
+
else
|
59
|
+
"({#{formatted}})"
|
46
60
|
end
|
61
|
+
end
|
47
62
|
|
48
|
-
|
63
|
+
def key_value_pair(key, value)
|
64
|
+
formatted_key = inspect_value(key, true)
|
65
|
+
formatted_value = inspect_value(value.fetch(key), true)
|
66
|
+
"#{formatted_key} => #{formatted_value}"
|
49
67
|
end
|
50
68
|
|
51
69
|
def in_utc(time)
|
@@ -1,42 +1,36 @@
|
|
1
1
|
module ToFactory
|
2
2
|
module Generation
|
3
3
|
class Factory
|
4
|
-
def initialize(
|
5
|
-
|
6
|
-
message = "Generation::Factory requires initializing with an ActiveRecord::Base instance"
|
7
|
-
message << "\n but received #{object.inspect}"
|
8
|
-
raise ToFactory::MissingActiveRecordInstanceException.new(message)
|
9
|
-
end
|
10
|
-
|
11
|
-
@name = add_quotes name
|
12
|
-
@attributes = object.attributes
|
4
|
+
def initialize(representation)
|
5
|
+
@representation = representation
|
13
6
|
end
|
14
7
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
attributes = @attributes.delete_if{|key, _| to_skip.include? key.to_sym}
|
8
|
+
def name
|
9
|
+
add_quotes @representation.name
|
10
|
+
end
|
19
11
|
|
12
|
+
def to_factory
|
13
|
+
header do
|
20
14
|
attributes.map do |attr, value|
|
21
15
|
factory_attribute(attr, value)
|
22
16
|
end.sort.join("\n") << "\n"
|
23
17
|
end
|
24
18
|
end
|
25
19
|
|
26
|
-
def header(
|
20
|
+
def header(&block)
|
27
21
|
if ToFactory.new_syntax?
|
28
|
-
modern_header
|
22
|
+
modern_header &block
|
29
23
|
else
|
30
|
-
header_factory_girl_1
|
24
|
+
header_factory_girl_1 &block
|
31
25
|
end
|
32
26
|
end
|
33
27
|
|
34
|
-
def modern_header(
|
35
|
-
generic_header(
|
28
|
+
def modern_header(&block)
|
29
|
+
generic_header("factory", "", &block)
|
36
30
|
end
|
37
31
|
|
38
|
-
def header_factory_girl_1(
|
39
|
-
generic_header(
|
32
|
+
def header_factory_girl_1(&block)
|
33
|
+
generic_header("Factory.define", " |o|", &block)
|
40
34
|
end
|
41
35
|
|
42
36
|
def factory_attribute(attr, value)
|
@@ -45,14 +39,28 @@ module ToFactory
|
|
45
39
|
|
46
40
|
private
|
47
41
|
|
48
|
-
def
|
49
|
-
|
42
|
+
def attributes
|
43
|
+
to_skip = [:id, :created_at, :updated_at]
|
44
|
+
|
45
|
+
@representation.attributes.delete_if{|key, _| to_skip.include? key.to_sym}
|
46
|
+
end
|
47
|
+
|
48
|
+
def parent_name
|
49
|
+
@representation.parent_name
|
50
|
+
end
|
51
|
+
|
52
|
+
def generic_header(factory_start, block_arg, &block)
|
53
|
+
out = " #{factory_start}(:#{name}#{parent_clause}) do#{block_arg}\n"
|
50
54
|
out << yield.to_s
|
51
55
|
out << " end\n"
|
52
56
|
end
|
53
57
|
|
54
|
-
def parent_clause
|
55
|
-
|
58
|
+
def parent_clause
|
59
|
+
has_parent? ? ", :parent => :#{add_quotes parent_name}" : ""
|
60
|
+
end
|
61
|
+
|
62
|
+
def has_parent?
|
63
|
+
parent_name.to_s.length > 0
|
56
64
|
end
|
57
65
|
|
58
66
|
def add_quotes(name)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ToFactory
|
2
|
+
class CannotInferClass < ArgumentError
|
3
|
+
def initialize(message)
|
4
|
+
super message.inspect
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class KlassInference
|
9
|
+
def initialize(representations)
|
10
|
+
@mapping = {}
|
11
|
+
|
12
|
+
representations.each do |r|
|
13
|
+
set_mapping_from(r)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def infer(factory_name, count=0)
|
18
|
+
count = count + 1
|
19
|
+
result = @mapping[factory_name]
|
20
|
+
return [result, count] if result.is_a? Class
|
21
|
+
|
22
|
+
if result.nil?
|
23
|
+
raise CannotInferClass.new(factory_name)
|
24
|
+
end
|
25
|
+
|
26
|
+
infer(result, count)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def set_mapping_from(r)
|
32
|
+
if parent_klass = to_const(r.parent_name)
|
33
|
+
@mapping[r.parent_name] = parent_klass
|
34
|
+
end
|
35
|
+
|
36
|
+
@mapping[r.name] =
|
37
|
+
if factory_klass = to_const(r.name)
|
38
|
+
factory_klass
|
39
|
+
else
|
40
|
+
r.parent_name
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_const(factory_name)
|
45
|
+
factory_name.to_s.camelize.constantize
|
46
|
+
rescue NameError
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ToFactory
|
2
|
+
class OptionsParser
|
3
|
+
def initialize(options)
|
4
|
+
@options = options
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_instance
|
8
|
+
args = case @options
|
9
|
+
when ActiveRecord::Base
|
10
|
+
from_record(@options)
|
11
|
+
when Array
|
12
|
+
from_array(*@options)
|
13
|
+
end
|
14
|
+
|
15
|
+
Representation.new(*args)
|
16
|
+
end
|
17
|
+
|
18
|
+
def from_record(record)
|
19
|
+
name = calculate_name record.class
|
20
|
+
|
21
|
+
[name, nil, nil, record]
|
22
|
+
end
|
23
|
+
|
24
|
+
def from_array(name, record)
|
25
|
+
parent_name = calculate_name(record.class)
|
26
|
+
parent_name = nil if parent_name.to_s == name.to_s
|
27
|
+
[name, parent_name, nil, record]
|
28
|
+
end
|
29
|
+
|
30
|
+
def calculate_name(klass)
|
31
|
+
klass.name.to_s.underscore
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require "to_factory/parsing/klass_inference"
|
2
|
-
|
3
1
|
module ToFactory
|
4
2
|
module Parsing
|
3
|
+
ParseException = Class.new ::Exception
|
4
|
+
|
5
5
|
class Syntax
|
6
6
|
attr_accessor :contents
|
7
7
|
|
@@ -14,17 +14,12 @@ module ToFactory
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def parse
|
17
|
-
|
18
|
-
|
19
|
-
@klass_inference.setup(all_factories)
|
20
|
-
|
21
|
-
all_factories.each do |factory_name, parent_name, ruby|
|
22
|
-
klass = @klass_inference.infer(factory_name)
|
23
|
-
result[klass] ||= {}
|
24
|
-
result[klass][factory_name] = ruby
|
17
|
+
factories.map do |x|
|
18
|
+
Representation.new(name_from(x), parent_from(x), to_ruby(x))
|
25
19
|
end
|
26
20
|
|
27
|
-
|
21
|
+
rescue Racc::ParseError, StringScanner::Error => e
|
22
|
+
raise ParseException.new("Original exception: #{e.message}\n #{e.backtrace}\nToFactory Error parsing \n#{@contents}\n o")
|
28
23
|
end
|
29
24
|
|
30
25
|
def factories
|
@@ -39,12 +34,6 @@ module ToFactory
|
|
39
34
|
header? ? sexp[3] : sexp
|
40
35
|
end
|
41
36
|
|
42
|
-
def all_factories
|
43
|
-
factories.map do |x|
|
44
|
-
[name_from(x), parent_from(x), to_ruby(x)]
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
37
|
def name_from(sexp)
|
49
38
|
sexp[1][3][1]
|
50
39
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module ToFactory
|
2
|
+
class Representation
|
3
|
+
delegate :attributes, :to => :record
|
4
|
+
attr_accessor :klass, :name, :parent_name, :definition, :hierarchy_order, :record
|
5
|
+
|
6
|
+
def self.from(options)
|
7
|
+
OptionsParser.new(options).get_instance
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(name, parent_name, definition=nil, record=nil)
|
11
|
+
@name, @parent_name, @definition, @record =
|
12
|
+
name.to_s, parent_name.to_s, definition, record
|
13
|
+
end
|
14
|
+
|
15
|
+
def inspect
|
16
|
+
"#<ToFactory::Representation:#{object_id} @name: #{@name.inspect}, @parent_name: #{@parent_name.inspect}, @klass: #{klass_name_inspect}>"
|
17
|
+
end
|
18
|
+
|
19
|
+
def klass_name_inspect
|
20
|
+
@klass.name.inspect rescue "nil"
|
21
|
+
end
|
22
|
+
|
23
|
+
def definition
|
24
|
+
@definition ||= ToFactory::Generation::Factory.new(self).to_factory
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/to_factory/version.rb
CHANGED
data/lib/to_factory.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require "deep_merge"
|
2
|
-
|
3
1
|
require "to_factory/version"
|
4
2
|
require "to_factory/config"
|
5
3
|
require "to_factory/generation/factory"
|
@@ -8,9 +6,11 @@ require "to_factory/collation"
|
|
8
6
|
require "to_factory/file_writer"
|
9
7
|
require "to_factory/finders/model"
|
10
8
|
require "to_factory/finders/factory"
|
11
|
-
require "to_factory/
|
9
|
+
require "to_factory/representation"
|
12
10
|
require "to_factory/file_sync"
|
13
11
|
require "to_factory/parsing/file"
|
12
|
+
require "to_factory/klass_inference"
|
13
|
+
require "to_factory/options_parser"
|
14
14
|
|
15
15
|
module ToFactory
|
16
16
|
class MissingActiveRecordInstanceException < Exception;end
|
@@ -29,7 +29,7 @@ module ToFactory
|
|
29
29
|
|
30
30
|
def definitions
|
31
31
|
results = Finders::Factory.new.call
|
32
|
-
results.map
|
32
|
+
results.map(&:name)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory(:"to_factory/user") do
|
3
|
+
name("User")
|
4
|
+
end
|
5
|
+
|
6
|
+
factory(:root, :parent => :"to_factory/user") do
|
7
|
+
birthday "2014-07-08T15:30Z"
|
8
|
+
email "test@example.com"
|
9
|
+
name "Jeff"
|
10
|
+
some_attributes({:a => 1})
|
11
|
+
some_id 8
|
12
|
+
end
|
13
|
+
|
14
|
+
factory(:admin, :parent => :"to_factory/user") do
|
15
|
+
name("Admin")
|
16
|
+
end
|
17
|
+
|
18
|
+
factory(:super_admin, :parent => :admin) do
|
19
|
+
name("Super Admin")
|
20
|
+
end
|
21
|
+
end
|