to_factory 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/.travis.yml +1 -4
  2. data/README.md +27 -6
  3. data/Rakefile +12 -2
  4. data/lib/to_factory/generation/attribute.rb +22 -16
  5. data/lib/to_factory/generation/factory.rb +0 -1
  6. data/lib/to_factory/parsing/klass_inference.rb +34 -0
  7. data/lib/to_factory/parsing/new_syntax.rb +10 -0
  8. data/lib/to_factory/parsing/old_syntax.rb +4 -0
  9. data/lib/to_factory/parsing/syntax.rb +8 -23
  10. data/lib/to_factory/version.rb +1 -1
  11. data/lib/to_factory.rb +5 -0
  12. data/spec/db/migrate/5_add_serialized_attributes_to_users.rb +9 -0
  13. data/spec/example_factories/new_syntax/admin.rb +1 -0
  14. data/spec/example_factories/new_syntax/admin_with_header.rb +1 -0
  15. data/spec/example_factories/new_syntax/user.rb +1 -0
  16. data/spec/example_factories/new_syntax/user_admin.rb +2 -0
  17. data/spec/example_factories/new_syntax/user_admin_super_admin.rb +13 -0
  18. data/spec/example_factories/new_syntax/user_admin_with_header.rb +2 -0
  19. data/spec/example_factories/new_syntax/user_with_header.rb +1 -0
  20. data/spec/example_factories/old_syntax/admin.rb +1 -0
  21. data/spec/example_factories/old_syntax/user.rb +1 -0
  22. data/spec/example_factories/old_syntax/user_admin.rb +2 -0
  23. data/spec/example_factories/old_syntax/user_admin_super_admin.rb +11 -0
  24. data/spec/example_factories/old_syntax/user_admin_with_header.rb +2 -0
  25. data/spec/example_factories/old_syntax/user_with_header.rb +1 -0
  26. data/spec/integration/config_spec.rb +1 -1
  27. data/spec/integration/{generate_class_method_spec.rb → to_factory_method_spec.rb} +8 -0
  28. data/spec/spec_helper.rb +1 -25
  29. data/spec/support/data_creation.rb +36 -0
  30. data/spec/support/models/user.rb +1 -0
  31. data/spec/unit/generation/attribute_spec.rb +27 -0
  32. data/spec/unit/parsing/file_spec.rb +10 -0
  33. data/spec/unit/parsing/klass_inference_spec.rb +29 -0
  34. data/to_factory.gemspec +1 -1
  35. metadata +20 -9
  36. data/spec/support/terse_expect_syntax.rb +0 -23
data/.travis.yml CHANGED
@@ -7,13 +7,10 @@ rvm:
7
7
  - 2.1.2
8
8
  - 2.1.1
9
9
  - 2.1.0
10
-
11
10
  - 2.0.0
12
-
13
11
  - 1.9.3
14
- - 1.9.2
15
-
16
12
  - 1.8.7
13
+
17
14
  script: "./bin/ci"
18
15
 
19
16
  branches:
data/README.md CHANGED
@@ -11,12 +11,13 @@ ToFactory
11
11
 
12
12
  Easily add factories with valid data for an existing project.
13
13
 
14
- If you find yourself working on a project without tests/factories or only using fixtures,
15
- then use this gem to quickly generate a factory from an existing object.
14
+ * auto-generate all factories
15
+ * adhoc generate from existing records
16
+ * unintrusively update factory files in place
17
+ * Parses and writes both new `FactoryGirl`, syntax or older `Factory.define` syntax
16
18
 
17
- Tested against Ruby 1.8.7, 1.9.2, 1.9.3, 2.0.0, 2.1.x
19
+ Tested against Ruby 1.8.7, 1.9.3, 2.0.0, 2.1.x, 2.2.0
18
20
 
19
- Reads and writes both new `FactoryGirl`, syntax or older `Factory.define` syntax
20
21
 
21
22
  #Installation
22
23
  ___________
@@ -30,12 +31,24 @@ group :test, :development do
30
31
  end
31
32
  ```
32
33
 
33
- #Usage
34
+
35
+ #Warning
36
+ `ToFactory` writes into the `spec/factories` folder. Whilst it
37
+ is tested and avoids overwriting existing factories,
38
+ it is recommended that you execute after committing or when in a known
39
+ safe state.
40
+
41
+ #Example
42
+ ```bash
43
+ git add spec/factories
44
+ git commit -m "I know what I am doing"
45
+ rails c
46
+ >ToFactory()
47
+ ```
34
48
 
35
49
  ```ruby
36
50
  #Generate all factories
37
51
  ToFactory()
38
-
39
52
  #outputs the first record of each ActiveRecord::Base subclass in the models folder
40
53
  #to spec/factories
41
54
 
@@ -50,6 +63,11 @@ ToFactory(exclude: [User, Project])
50
63
  #Use Adhoc instances from the console
51
64
  ToFactory User.last
52
65
 
66
+ #List defined factory names
67
+ ToFactory.definitions
68
+ #=> [:user, :admin, :project]
69
+
70
+
53
71
  #writes to spec/factories/user.rb
54
72
  FactoryGirl.define
55
73
  factory(:user) do |u|
@@ -69,6 +87,9 @@ ToFactory :admin => User.last
69
87
 
70
88
  ```
71
89
 
90
+ #Known bugs/limitations
91
+ * Factory generation does not follow a hierarchical order, so factory files may require manual editing for now.
92
+
72
93
  #Other useful projects
73
94
 
74
95
  If you are adding specs to an existing project you may want to look at:
data/Rakefile CHANGED
@@ -1,14 +1,24 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
3
  namespace :spec do
4
- desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x"
5
- task :migrate_db do
4
+ def setup_db
6
5
  require 'logger'
7
6
  require 'active_record'
8
7
  ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => "spec/db/test.sqlite3")
9
8
  ActiveRecord::Base.logger = Logger.new(File.open('tmp/database.log', 'a'))
9
+ end
10
+
11
+ desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x"
12
+ task :migrate_db do
13
+ setup_db
10
14
  ActiveRecord::Migrator.migrate('spec/db/migrate')
11
15
  end
16
+
17
+ desc "Migrate down"
18
+ task :migrate_down do
19
+ setup_db
20
+ ActiveRecord::Migrator.down('spec/db/migrate')
21
+ end
12
22
  end
13
23
 
14
24
  begin
@@ -7,39 +7,45 @@ module ToFactory
7
7
  end
8
8
 
9
9
  def to_s
10
- attribute = "#{@attribute} #{inspect_value(@value)}"
10
+ setter = "#{@attribute}#{inspect_value(@value)}"
11
11
 
12
12
  if ToFactory.new_syntax?
13
- " #{attribute}"
13
+ " #{setter}"
14
14
  else
15
- " o.#{attribute}"
15
+ " o.#{setter}"
16
16
  end
17
17
  end
18
18
 
19
- def <=>(other)
20
- @attribute <=> other
21
- end
22
-
23
- def ==(other)
24
- to_s == other.to_s
25
- end
26
-
27
- private
28
-
29
- def inspect_value(value)
30
- case value
19
+ def inspect_value(value, nested=false)
20
+ formatted = case value
31
21
  when Time, DateTime
32
22
  time = in_utc(value).strftime("%Y-%m-%dT%H:%M%Z").inspect
33
23
  time.gsub(/UTC"$/, "Z\"").gsub(/GMT"$/, "Z\"")
34
24
  when BigDecimal
35
25
  value.to_f.inspect
36
26
  when Hash
37
- hash = value.inject({}){|result, (k, v)| result[k] = inspect_value(v); result}
27
+ formatted = value.keys.inject([]) do |a, key|
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
38
  when Array
39
39
  value.map{|v| inspect_value(v)}
40
40
  else
41
41
  value.inspect
42
42
  end
43
+
44
+ if !value.is_a?(Hash) && !nested
45
+ formatted = " #{formatted}"
46
+ end
47
+
48
+ formatted
43
49
  end
44
50
 
45
51
  def in_utc(time)
@@ -1,6 +1,5 @@
1
1
  module ToFactory
2
2
  module Generation
3
-
4
3
  class Factory
5
4
  def initialize(object, name)
6
5
  unless object.is_a? ActiveRecord::Base
@@ -0,0 +1,34 @@
1
+ module ToFactory
2
+ module Parsing
3
+ CannotInferClass = Class.new ArgumentError
4
+
5
+ class KlassInference
6
+ def initialize
7
+ @mapping = {}
8
+ end
9
+
10
+ def setup(factory_names_and_parents)
11
+ factory_names_and_parents.each do |factory_name, parent|
12
+ @mapping[factory_name.to_s] = to_const(parent || factory_name)
13
+ end
14
+ end
15
+
16
+ def infer(factory_name)
17
+ result = @mapping[factory_name.to_s]
18
+ return result if result.is_a? Class
19
+
20
+ raise CannotInferClass.new(factory_name) if result.nil?
21
+
22
+ infer(result)
23
+ end
24
+
25
+ private
26
+
27
+ def to_const(factory_name)
28
+ factory_name.to_s.camelize.constantize
29
+ rescue NameError
30
+ factory_name
31
+ end
32
+ end
33
+ end
34
+ end
@@ -4,6 +4,16 @@ module ToFactory
4
4
  def header?
5
5
  sexp[1][1][1] == :FactoryGirl rescue false
6
6
  end
7
+
8
+ def parent_from(x)
9
+ # e.g.
10
+ #s(:call, nil, :factory, s(:lit, :admin), s(:hash, s(:lit, :parent), s(:lit, :"to_factory/user")))
11
+ x[1][4][2][1]
12
+ rescue NoMethodError
13
+ # e.g.
14
+ #s(:call, nil, :factory, s(:lit, :"to_factory/user"))
15
+ x[1][3][1]
16
+ end
7
17
  end
8
18
  end
9
19
  end
@@ -4,6 +4,10 @@ module ToFactory
4
4
  def header?
5
5
  false
6
6
  end
7
+
8
+ def parent_from(x)
9
+ x[1][-1][-1][-1] rescue name_from(x)
10
+ end
7
11
  end
8
12
  end
9
13
  end
@@ -1,3 +1,5 @@
1
+ require "to_factory/parsing/klass_inference"
2
+
1
3
  module ToFactory
2
4
  module Parsing
3
5
  class Syntax
@@ -14,9 +16,10 @@ module ToFactory
14
16
  def parse
15
17
  result = {}
16
18
  @klass_inference = KlassInference.new
19
+ @klass_inference.setup(all_factories)
17
20
 
18
- parse_multiple do |factory_name, parent_name, ruby|
19
- klass = @klass_inference.infer(factory_name, parent_name)
21
+ all_factories.each do |factory_name, parent_name, ruby|
22
+ klass = @klass_inference.infer(factory_name)
20
23
  result[klass] ||= {}
21
24
  result[klass][factory_name] = ruby
22
25
  end
@@ -36,16 +39,12 @@ module ToFactory
36
39
  header? ? sexp[3] : sexp
37
40
  end
38
41
 
39
- def parse_multiple(&block)
40
- factories.each do |x|
41
- yield name_from(x), parent_from(x), to_ruby(x)
42
+ def all_factories
43
+ factories.map do |x|
44
+ [name_from(x), parent_from(x), to_ruby(x)]
42
45
  end
43
46
  end
44
47
 
45
- def parent_from(x)
46
- x[1][-1][-1][-1] rescue name_from(x)
47
- end
48
-
49
48
  def name_from(sexp)
50
49
  sexp[1][3][1]
51
50
  end
@@ -67,20 +66,6 @@ module ToFactory
67
66
  def ruby_parser
68
67
  @ruby_parseer ||= RubyParser.new
69
68
  end
70
-
71
- class KlassInference
72
- def initialize
73
- @mapping = {}
74
- end
75
-
76
- def infer(klass, parent_klass=nil)
77
- @mapping[klass] ||= klass.to_s.camelize.constantize
78
- rescue
79
- infer(parent_klass)
80
- end
81
- end
82
-
83
-
84
69
  end
85
70
  end
86
71
  end
@@ -1,3 +1,3 @@
1
1
  module ToFactory
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/to_factory.rb CHANGED
@@ -26,6 +26,11 @@ module ToFactory
26
26
  rescue NameError, ArgumentError
27
27
  false
28
28
  end
29
+
30
+ def definitions
31
+ results = Finders::Factory.new.call
32
+ results.map{|_, r| r.keys}.flatten
33
+ end
29
34
  end
30
35
  end
31
36
 
@@ -0,0 +1,9 @@
1
+ class AddSerializedAttributesToUsers < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :users, :some_attributes, :text
4
+ end
5
+
6
+ def self.down
7
+ remove_column :users, :some_attributes
8
+ end
9
+ end
@@ -2,5 +2,6 @@ factory(:admin, :parent => :"to_factory/user") do
2
2
  birthday "2014-07-08T15:30Z"
3
3
  email "admin@example.com"
4
4
  name "Admin"
5
+ some_attributes({:a => 1})
5
6
  some_id 9
6
7
  end
@@ -3,6 +3,7 @@ FactoryGirl.define do
3
3
  birthday "2014-07-08T15:30Z"
4
4
  email "admin@example.com"
5
5
  name "Admin"
6
+ some_attributes({:a => 1})
6
7
  some_id 9
7
8
  end
8
9
  end
@@ -2,5 +2,6 @@ factory(:"to_factory/user") do
2
2
  birthday "2014-07-08T15:30Z"
3
3
  email "test@example.com"
4
4
  name "Jeff"
5
+ some_attributes({:a => 1})
5
6
  some_id 8
6
7
  end
@@ -2,6 +2,7 @@ factory(:"to_factory/user") do
2
2
  birthday "2014-07-08T15:30Z"
3
3
  email "test@example.com"
4
4
  name "Jeff"
5
+ some_attributes({:a => 1})
5
6
  some_id 8
6
7
  end
7
8
 
@@ -9,5 +10,6 @@ factory(:admin, :parent => :"to_factory/user") do
9
10
  birthday "2014-07-08T15:30Z"
10
11
  email "admin@example.com"
11
12
  name "Admin"
13
+ some_attributes({:a => 1})
12
14
  some_id 9
13
15
  end
@@ -0,0 +1,13 @@
1
+ FactoryGirl.define do
2
+ factory(:admin, :parent => :"to_factory/user") do
3
+ name "Admin"
4
+ end
5
+
6
+ factory(:super_admin, :parent => :admin) do
7
+ name "Super Admin"
8
+ end
9
+
10
+ factory(:"to_factory/user") do
11
+ name "User"
12
+ end
13
+ end
@@ -3,6 +3,7 @@ FactoryGirl.define do
3
3
  birthday "2014-07-08T15:30Z"
4
4
  email "test@example.com"
5
5
  name "Jeff"
6
+ some_attributes({:a => 1})
6
7
  some_id 8
7
8
  end
8
9
 
@@ -10,6 +11,7 @@ FactoryGirl.define do
10
11
  birthday "2014-07-08T15:30Z"
11
12
  email "admin@example.com"
12
13
  name "Admin"
14
+ some_attributes({:a => 1})
13
15
  some_id 9
14
16
  end
15
17
  end
@@ -3,6 +3,7 @@ FactoryGirl.define do
3
3
  birthday "2014-07-08T15:30Z"
4
4
  email "test@example.com"
5
5
  name "Jeff"
6
+ some_attributes({:a => 1})
6
7
  some_id 8
7
8
  end
8
9
  end
@@ -2,5 +2,6 @@ Factory.define(:admin, :parent => :"to_factory/user") do |o|
2
2
  o.birthday "2014-07-08T15:30Z"
3
3
  o.email "admin@example.com"
4
4
  o.name "Admin"
5
+ o.some_attributes({:a => 1})
5
6
  o.some_id 9
6
7
  end
@@ -2,5 +2,6 @@ Factory.define(:"to_factory/user") do |o|
2
2
  o.birthday "2014-07-08T15:30Z"
3
3
  o.email "test@example.com"
4
4
  o.name "Jeff"
5
+ o.some_attributes({:a => 1})
5
6
  o.some_id 8
6
7
  end
@@ -2,6 +2,7 @@ Factory.define(:"to_factory/user") do |o|
2
2
  o.birthday "2014-07-08T15:30Z"
3
3
  o.email "test@example.com"
4
4
  o.name "Jeff"
5
+ o.some_attributes({:a => 1})
5
6
  o.some_id 8
6
7
  end
7
8
 
@@ -9,5 +10,6 @@ Factory.define(:admin, :parent => :"to_factory/user") do |o|
9
10
  o.birthday "2014-07-08T15:30Z"
10
11
  o.email "admin@example.com"
11
12
  o.name "Admin"
13
+ o.some_attributes({:a => 1})
12
14
  o.some_id 9
13
15
  end
@@ -0,0 +1,11 @@
1
+ Factory.define(:admin, :parent => :"to_factory/user") do |o|
2
+ o.name "Admin"
3
+ end
4
+
5
+ Factory.define(:super_admin, :parent => :admin) do |o|
6
+ o.name "Super Admin"
7
+ end
8
+
9
+ Factory.define(:"to_factory/user") do |o|
10
+ o.name "User"
11
+ end
@@ -2,6 +2,7 @@ Factory.define(:"to_factory/user") do |o|
2
2
  o.birthday "2014-07-08T15:30Z"
3
3
  o.email "test@example.com"
4
4
  o.name "Jeff"
5
+ o.some_attributes({:a => 1})
5
6
  o.some_id 8
6
7
  end
7
8
 
@@ -9,5 +10,6 @@ Factory.define(:admin, :parent => :"to_factory/user") do |o|
9
10
  o.birthday "2014-07-08T15:30Z"
10
11
  o.email "admin@example.com"
11
12
  o.name "Admin"
13
+ o.some_attributes({:a => 1})
12
14
  o.some_id 9
13
15
  end
@@ -2,5 +2,6 @@ Factory.define(:"to_factory/user") do |o|
2
2
  o.birthday "2014-07-08T15:30Z"
3
3
  o.email "test@example.com"
4
4
  o.name "Jeff"
5
+ o.some_attributes({:a => 1})
5
6
  o.some_id 8
6
7
  end
@@ -1,4 +1,4 @@
1
- describe "ToFactory Configuration" do
1
+ describe "ToFactory Configuration" do
2
2
  before do
3
3
  ToFactory.reset_config!
4
4
  end
@@ -15,6 +15,14 @@ describe ToFactory do
15
15
  let(:expected_user_file) { File.read "./spec/example_factories/#{version}_syntax/user_with_header.rb"}
16
16
  let(:expected_project_file) { File.read "./spec/example_factories/#{version}_syntax/project_with_header.rb"}
17
17
 
18
+ describe "ToFactory.definitions" do
19
+ it do
20
+ ToFactory()
21
+ expect(ToFactory.definitions).to match_array ["to_factory/user", "to_factory/project"]
22
+ end
23
+
24
+ end
25
+
18
26
  describe "Object#ToFactory" do
19
27
  it "generates all factories" do
20
28
  ToFactory()
data/spec/spec_helper.rb CHANGED
@@ -26,31 +26,8 @@ require "to_factory"
26
26
 
27
27
  require "./spec/support/models/user"
28
28
  require "./spec/support/models/project"
29
- require "./spec/support/terse_expect_syntax"
30
29
  require "./spec/support/match_sexp"
31
-
32
- module ToFactory::DataCreation
33
- def create_all!
34
- create_user!
35
- create_admin!
36
- end
37
-
38
- def create_project!
39
- ToFactory::Project.create({:name => "My Project", :objective => "easy testing", :some_id => 9 })
40
- end
41
-
42
- def birthday
43
- Time.find_zone("UTC").parse("2014-07-08T15:30Z")
44
- end
45
-
46
- def create_user!
47
- ToFactory::User.create :name => "Jeff", :email => "test@example.com", :some_id => 8, :birthday => birthday
48
- end
49
-
50
- def create_admin!
51
- ToFactory::User.create :name => "Admin", :email => "admin@example.com", :some_id => 9, :birthday => birthday
52
- end
53
- end
30
+ require "./spec/support/data_creation"
54
31
 
55
32
  module ToFactory::SpecSyntaxHelpers
56
33
  def version
@@ -59,7 +36,6 @@ module ToFactory::SpecSyntaxHelpers
59
36
  end
60
37
 
61
38
  RSpec.configure do |config|
62
- config.include TerseExpectSyntax
63
39
  config.include ToFactory::DataCreation
64
40
  config.include ToFactory::SpecSyntaxHelpers
65
41
 
@@ -0,0 +1,36 @@
1
+ module ToFactory::DataCreation
2
+ def create_all!
3
+ create_user!
4
+ create_admin!
5
+ end
6
+
7
+ def create_project!
8
+ ToFactory::Project.create({:name => "My Project", :objective => "easy testing", :some_id => 9 })
9
+ end
10
+
11
+ def birthday
12
+ Time.find_zone("UTC").parse("2014-07-08T15:30Z")
13
+ end
14
+
15
+ def create_user!
16
+ ToFactory::User.create(
17
+ :name => "Jeff",
18
+ :email => "test@example.com",
19
+ :some_attributes => {:a => 1},
20
+ :some_id => 8,
21
+ :birthday => birthday
22
+ )
23
+ end
24
+
25
+ def create_admin!
26
+ ToFactory::User.create(
27
+ :name => "Admin",
28
+ :email => "admin@example.com",
29
+ :some_attributes => {:a => 1},
30
+ :some_id => 9,
31
+ :birthday => birthday
32
+ )
33
+ end
34
+ end
35
+
36
+
@@ -1,3 +1,4 @@
1
1
  class ToFactory::User < ActiveRecord::Base
2
2
  self.table_name = "users"
3
+ serialize :some_attributes, Hash
3
4
  end
@@ -0,0 +1,27 @@
1
+ describe ToFactory::Generation::Attribute do
2
+ let(:attribute) { ToFactory::Generation::Attribute.new(:some_attributes, {:a => 1}) }
3
+
4
+ describe "#to_s" do
5
+ it do
6
+ expect(attribute.to_s).to include "some_attributes({:a => 1})"
7
+ end
8
+ end
9
+
10
+ describe "#inspect_value" do
11
+ it do
12
+ expect(attribute.inspect_value({:a => 1})).to eq "({:a => 1})"
13
+ end
14
+
15
+ it do
16
+ hash = ActiveSupport::OrderedHash.new
17
+ hash[{"with" => :hash}] = "keys"
18
+ hash[2] = "integers"
19
+ hash[:a] = {:nested => "hash"}
20
+
21
+ expected = '({{"with" => :hash} => "keys", 2 => "integers", :a => {:nested => "hash"}})'
22
+
23
+ expect(attribute.inspect_value(hash)).to eq expected
24
+ end
25
+ end
26
+
27
+ end
@@ -36,6 +36,16 @@ describe ToFactory::Parsing::File do
36
36
  end
37
37
 
38
38
  describe "#parse" do
39
+ context "with multiple levels of parent classes" do
40
+ let(:filename) { "spec/example_factories/#{version}_syntax/#{'user_admin_super_admin'}.rb"}
41
+
42
+ it do
43
+ result = parser.parse
44
+
45
+ expect(result[ToFactory::User].keys).to match_array [:super_admin, :admin, :"to_factory/user"]
46
+ end
47
+ end
48
+
39
49
  context "file: user" do
40
50
  let(:filename) { "spec/example_factories/#{version}_syntax/#{'user'}.rb"}
41
51
 
@@ -0,0 +1,29 @@
1
+ describe ToFactory::Parsing::KlassInference do
2
+ let(:inference) { ToFactory::Parsing::KlassInference.new }
3
+
4
+ mappings = #klass, parent, result
5
+ [:admin, :"to_factory/user", ToFactory::User],
6
+ [:some_project, :"to_factory/project", ToFactory::Project],
7
+ [:sub_project, :"some_project", ToFactory::Project],
8
+ [:super_admin, :admin, ToFactory::User],
9
+ [:"to_factory/user", nil, ToFactory::User]
10
+
11
+
12
+ to_infer = mappings.map{|a| a[0..1]}
13
+
14
+ before do
15
+ inference.setup to_infer
16
+ end
17
+
18
+ mappings.each do |klass, parent, expected|
19
+ it "having #{klass} and #{parent.inspect} implies #{expected} "do
20
+ result = inference.infer(klass)
21
+ expect(result).to eq expected
22
+ end
23
+ end
24
+
25
+ it do
26
+
27
+ expect(lambda{inference.infer("unknown")}).to raise_error
28
+ end
29
+ end
data/to_factory.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Mark Burns"]
10
10
  spec.email = ["markthedeveloper@gmail.com"]
11
11
  spec.summary = %q{Turn ActiveRecord instances into factories}
12
- spec.description = %q{ActiveRecord::Base#to_factory method to create factory_girl definitions from real data}
12
+ spec.description = %q{Autogenerate and append/create factory_girl definitions from the console}
13
13
  spec.homepage = ""
14
14
  spec.license = "MIT"
15
15
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: to_factory
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mark Burns
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2015-01-05 00:00:00 +00:00
18
+ date: 2015-01-08 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -173,7 +173,7 @@ dependencies:
173
173
  version: "10.0"
174
174
  type: :development
175
175
  version_requirements: *id010
176
- description: ActiveRecord::Base#to_factory method to create factory_girl definitions from real data
176
+ description: Autogenerate and append/create factory_girl definitions from the console
177
177
  email:
178
178
  - markthedeveloper@gmail.com
179
179
  executables: []
@@ -202,6 +202,7 @@ files:
202
202
  - lib/to_factory/generation/attribute.rb
203
203
  - lib/to_factory/generation/factory.rb
204
204
  - lib/to_factory/parsing/file.rb
205
+ - lib/to_factory/parsing/klass_inference.rb
205
206
  - lib/to_factory/parsing/new_syntax.rb
206
207
  - lib/to_factory/parsing/old_syntax.rb
207
208
  - lib/to_factory/parsing/syntax.rb
@@ -210,37 +211,42 @@ files:
210
211
  - spec/db/migrate/2_create_projects.rb
211
212
  - spec/db/migrate/3_create_not_namespaced.rb
212
213
  - spec/db/migrate/4_add_birthday_to_users.rb
214
+ - spec/db/migrate/5_add_serialized_attributes_to_users.rb
213
215
  - spec/example_factories/new_syntax/admin.rb
214
216
  - spec/example_factories/new_syntax/admin_with_header.rb
215
217
  - spec/example_factories/new_syntax/project_with_header.rb
216
218
  - spec/example_factories/new_syntax/user.rb
217
219
  - spec/example_factories/new_syntax/user_admin.rb
220
+ - spec/example_factories/new_syntax/user_admin_super_admin.rb
218
221
  - spec/example_factories/new_syntax/user_admin_with_header.rb
219
222
  - spec/example_factories/new_syntax/user_with_header.rb
220
223
  - spec/example_factories/old_syntax/admin.rb
221
224
  - spec/example_factories/old_syntax/project_with_header.rb
222
225
  - spec/example_factories/old_syntax/user.rb
223
226
  - spec/example_factories/old_syntax/user_admin.rb
227
+ - spec/example_factories/old_syntax/user_admin_super_admin.rb
224
228
  - spec/example_factories/old_syntax/user_admin_with_header.rb
225
229
  - spec/example_factories/old_syntax/user_with_header.rb
226
230
  - spec/integration/config_spec.rb
227
231
  - spec/integration/file_sync_spec.rb
228
232
  - spec/integration/file_writer_spec.rb
229
- - spec/integration/generate_class_method_spec.rb
230
233
  - spec/integration/lint_spec.rb
234
+ - spec/integration/to_factory_method_spec.rb
231
235
  - spec/spec_helper.rb
236
+ - spec/support/data_creation.rb
232
237
  - spec/support/match_sexp.rb
233
238
  - spec/support/models/not_active_record.rb
234
239
  - spec/support/models/project.rb
235
240
  - spec/support/models/user.rb
236
- - spec/support/terse_expect_syntax.rb
237
241
  - spec/unit/collation_spec.rb
238
242
  - spec/unit/definition_group_spec.rb
239
243
  - spec/unit/file_writer_spec.rb
240
244
  - spec/unit/finders/factory_spec.rb
241
245
  - spec/unit/finders/model_spec.rb
246
+ - spec/unit/generation/attribute_spec.rb
242
247
  - spec/unit/generator_spec.rb
243
248
  - spec/unit/parsing/file_spec.rb
249
+ - spec/unit/parsing/klass_inference_spec.rb
244
250
  - tmp/.keep
245
251
  - to_factory.gemspec
246
252
  has_rdoc: true
@@ -282,34 +288,39 @@ test_files:
282
288
  - spec/db/migrate/2_create_projects.rb
283
289
  - spec/db/migrate/3_create_not_namespaced.rb
284
290
  - spec/db/migrate/4_add_birthday_to_users.rb
291
+ - spec/db/migrate/5_add_serialized_attributes_to_users.rb
285
292
  - spec/example_factories/new_syntax/admin.rb
286
293
  - spec/example_factories/new_syntax/admin_with_header.rb
287
294
  - spec/example_factories/new_syntax/project_with_header.rb
288
295
  - spec/example_factories/new_syntax/user.rb
289
296
  - spec/example_factories/new_syntax/user_admin.rb
297
+ - spec/example_factories/new_syntax/user_admin_super_admin.rb
290
298
  - spec/example_factories/new_syntax/user_admin_with_header.rb
291
299
  - spec/example_factories/new_syntax/user_with_header.rb
292
300
  - spec/example_factories/old_syntax/admin.rb
293
301
  - spec/example_factories/old_syntax/project_with_header.rb
294
302
  - spec/example_factories/old_syntax/user.rb
295
303
  - spec/example_factories/old_syntax/user_admin.rb
304
+ - spec/example_factories/old_syntax/user_admin_super_admin.rb
296
305
  - spec/example_factories/old_syntax/user_admin_with_header.rb
297
306
  - spec/example_factories/old_syntax/user_with_header.rb
298
307
  - spec/integration/config_spec.rb
299
308
  - spec/integration/file_sync_spec.rb
300
309
  - spec/integration/file_writer_spec.rb
301
- - spec/integration/generate_class_method_spec.rb
302
310
  - spec/integration/lint_spec.rb
311
+ - spec/integration/to_factory_method_spec.rb
303
312
  - spec/spec_helper.rb
313
+ - spec/support/data_creation.rb
304
314
  - spec/support/match_sexp.rb
305
315
  - spec/support/models/not_active_record.rb
306
316
  - spec/support/models/project.rb
307
317
  - spec/support/models/user.rb
308
- - spec/support/terse_expect_syntax.rb
309
318
  - spec/unit/collation_spec.rb
310
319
  - spec/unit/definition_group_spec.rb
311
320
  - spec/unit/file_writer_spec.rb
312
321
  - spec/unit/finders/factory_spec.rb
313
322
  - spec/unit/finders/model_spec.rb
323
+ - spec/unit/generation/attribute_spec.rb
314
324
  - spec/unit/generator_spec.rb
315
325
  - spec/unit/parsing/file_spec.rb
326
+ - spec/unit/parsing/klass_inference_spec.rb
@@ -1,23 +0,0 @@
1
- module TerseExpectSyntax
2
- class Returner
3
- def initialize(to_call)
4
- @to_call=to_call
5
- end
6
- def r(*args)
7
- @to_call.call(*args)
8
- end
9
- end
10
-
11
- #x( @a, :b, "c").r d
12
- #becomes
13
- #expect(@a).to_receive(:b).with("c").and_return d
14
- def x(target, expected_method, *received_args)
15
- receiver = expect(target).to receive(expected_method)
16
- if received_args.any?
17
- receiver = receiver.with(*received_args)
18
- end
19
-
20
-
21
- Returner.new(lambda {|*return_args| receiver.and_return(*return_args) })
22
- end
23
- end