to_factory 2.0.0 → 3.0.0.pre.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/test.yml +35 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop-disabled.yml +95 -0
  5. data/.rubocop-enabled.yml +1194 -0
  6. data/.rubocop.yml +938 -0
  7. data/CHANGELOG.md +11 -0
  8. data/Gemfile +6 -1
  9. data/README.md +11 -10
  10. data/Rakefile +17 -9
  11. data/lib/to_factory/collation.rb +9 -9
  12. data/lib/to_factory/file_sync.rb +11 -11
  13. data/lib/to_factory/file_writer.rb +18 -2
  14. data/lib/to_factory/finders/factory.rb +8 -2
  15. data/lib/to_factory/finders/model.rb +11 -13
  16. data/lib/to_factory/generation/attribute.rb +10 -12
  17. data/lib/to_factory/generation/factory.rb +3 -3
  18. data/lib/to_factory/klass_inference.rb +4 -6
  19. data/lib/to_factory/options_parser.rb +4 -4
  20. data/lib/to_factory/parsing/file.rb +87 -14
  21. data/lib/to_factory/representation.rb +9 -6
  22. data/lib/to_factory/version.rb +1 -1
  23. data/lib/to_factory.rb +7 -17
  24. data/spec/db/migrate/1_create_users.rb +4 -4
  25. data/spec/db/migrate/2_create_projects.rb +4 -4
  26. data/spec/db/migrate/3_create_not_namespaced.rb +4 -4
  27. data/spec/db/migrate/4_add_birthday_to_users.rb +3 -3
  28. data/spec/db/migrate/5_add_serialized_attributes_to_users.rb +3 -3
  29. data/spec/example_factories/admin.rb +6 -6
  30. data/spec/example_factories/admin_with_header.rb +7 -7
  31. data/spec/example_factories/inherited_project_with_header.rb +7 -0
  32. data/spec/example_factories/project_with_header.rb +4 -4
  33. data/spec/example_factories/user.rb +5 -5
  34. data/spec/example_factories/user_admin.rb +11 -11
  35. data/spec/example_factories/user_admin_root.rb +12 -12
  36. data/spec/example_factories/user_admin_super_admin.rb +6 -6
  37. data/spec/example_factories/user_admin_with_header.rb +12 -12
  38. data/spec/example_factories/user_with_header.rb +6 -6
  39. data/spec/integration/empty_factory_file_spec.rb +19 -0
  40. data/spec/integration/file_sync_spec.rb +16 -24
  41. data/spec/integration/file_writer_spec.rb +13 -9
  42. data/spec/integration/lint_spec.rb +4 -3
  43. data/spec/integration/multiple_to_factory_calls_spec.rb +96 -0
  44. data/spec/integration/non_active_record_classes_spec.rb +40 -0
  45. data/spec/integration/to_factory_method_spec.rb +21 -20
  46. data/spec/spec_helper.rb +9 -18
  47. data/spec/support/broken_models/invalid_ruby_file.rb +1 -0
  48. data/spec/support/broken_models/project.rb +3 -0
  49. data/spec/support/data_creation.rb +11 -13
  50. data/spec/support/match_sexp.rb +0 -1
  51. data/spec/support/non_active_record/inherited_project.rb +3 -0
  52. data/spec/support/non_active_record/project.rb +3 -0
  53. data/spec/support/non_active_record/some_other_service_inheriting_from_something_else.rb +4 -0
  54. data/spec/support/non_active_record/some_service.rb +2 -0
  55. data/spec/support/non_active_record/something_else.rb +2 -0
  56. data/spec/support/ruby_parser_exception_causing_string.rb +29 -29
  57. data/spec/unit/collation_spec.rb +9 -10
  58. data/spec/unit/file_writer_spec.rb +4 -8
  59. data/spec/unit/finders/factory_spec.rb +7 -9
  60. data/spec/unit/finders/model_spec.rb +35 -8
  61. data/spec/unit/generation/attribute_spec.rb +22 -22
  62. data/spec/unit/generation/factory_spec.rb +38 -14
  63. data/spec/unit/parsing/file_spec.rb +9 -9
  64. data/spec/unit/parsing/klass_inference_spec.rb +5 -7
  65. data/to_factory.gemspec +17 -15
  66. metadata +109 -44
  67. data/.travis.yml +0 -14
  68. data/lib/to_factory/parsing/syntax.rb +0 -83
@@ -1,13 +1,13 @@
1
- class CreateUsers < ActiveRecord::Migration
2
- def self.up
1
+ class CreateUsers < ActiveRecord::Migration[6.1]
2
+ def up
3
3
  create_table :users do |t|
4
- t.column :name, :string, :null => false
4
+ t.column :name, :string, null: false
5
5
  t.column :email, :string
6
6
  t.integer :some_id
7
7
  end
8
8
  end
9
9
 
10
- def self.down
10
+ def down
11
11
  drop_table :users
12
12
  end
13
13
  end
@@ -1,13 +1,13 @@
1
- class CreateProjects < ActiveRecord::Migration
2
- def self.up
1
+ class CreateProjects < ActiveRecord::Migration[6.1]
2
+ def up
3
3
  create_table :projects do |t|
4
- t.column :name, :string, :null => false
4
+ t.column :name, :string, null: false
5
5
  t.column :objective, :string
6
6
  t.integer :some_id
7
7
  end
8
8
  end
9
9
 
10
- def self.down
10
+ def down
11
11
  drop_table :projects
12
12
  end
13
13
  end
@@ -1,11 +1,11 @@
1
- class CreateNotNamespaced < ActiveRecord::Migration
2
- def self.up
1
+ class CreateNotNamespaced < ActiveRecord::Migration[6.1]
2
+ def up
3
3
  create_table :not_namespaced_active_record_class_but_long_enough_it_shouldnt_cause_conflicts do |t|
4
- t.column :name, :string, :null => false
4
+ t.column :name, :string, null: false
5
5
  end
6
6
  end
7
7
 
8
- def self.down
8
+ def down
9
9
  drop_table :not_namespaced_active_record_class_but_long_enough_it_shouldnt_cause_conflicts
10
10
  end
11
11
  end
@@ -1,9 +1,9 @@
1
- class AddBirthdayToUsers < ActiveRecord::Migration
2
- def self.up
1
+ class AddBirthdayToUsers < ActiveRecord::Migration[6.1]
2
+ def up
3
3
  add_column :users, :birthday, :datetime
4
4
  end
5
5
 
6
- def self.down
6
+ def down
7
7
  remove_column :users, :birthday
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
- class AddSerializedAttributesToUsers < ActiveRecord::Migration
2
- def self.up
1
+ class AddSerializedAttributesToUsers < ActiveRecord::Migration[6.1]
2
+ def up
3
3
  add_column :users, :some_attributes, :text
4
4
  end
5
5
 
6
- def self.down
6
+ def down
7
7
  remove_column :users, :some_attributes
8
8
  end
9
9
  end
@@ -1,7 +1,7 @@
1
- factory(:admin, :parent => :"to_factory/user") do
2
- birthday "2014-07-08T15:30 UTC"
3
- email "admin@example.com"
4
- name "Admin"
5
- some_attributes({:a => 1})
6
- some_id 9
1
+ factory(:admin, parent: :"to_factory/user") do
2
+ birthday { "2014-07-08T15:30 UTC" }
3
+ email {"admin@example.com"}
4
+ name {"Admin"}
5
+ some_attributes {{a: 1}}
6
+ some_id { 9 }
7
7
  end
@@ -1,9 +1,9 @@
1
- FactoryGirl.define do
2
- factory(:admin, :parent => :"to_factory/user") do
3
- birthday "2014-07-08T15:30 UTC"
4
- email "admin@example.com"
5
- name "Admin"
6
- some_attributes({:a => 1})
7
- some_id 9
1
+ FactoryBot.define do
2
+ factory(:admin, parent: :"to_factory/user") do
3
+ birthday { "2014-07-08T15:30 UTC" }
4
+ email { "admin@example.com" }
5
+ name {"Admin" }
6
+ some_attributes { {a: 1 } }
7
+ some_id { 9 }
8
8
  end
9
9
  end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory(:"to_factory/inherited_project") do
3
+ name { "My Project" }
4
+ objective { "easy testing" }
5
+ some_id { 9 }
6
+ end
7
+ end
@@ -1,7 +1,7 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory(:"to_factory/project") do
3
- name "My Project"
4
- objective "easy testing"
5
- some_id 9
3
+ name { "My Project" }
4
+ objective { "easy testing" }
5
+ some_id { 9 }
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  factory(:"to_factory/user") do
2
- birthday "2014-07-08T15:30 UTC"
3
- email "test@example.com"
4
- name "Jeff"
5
- some_attributes({:a => 1})
6
- some_id 8
2
+ birthday {"2014-07-08T15:30 UTC"}
3
+ email {"test@example.com"}
4
+ name {"Jeff"}
5
+ some_attributes {{a: 1}}
6
+ some_id { 8 }
7
7
  end
@@ -1,15 +1,15 @@
1
1
  factory(:"to_factory/user") do
2
- birthday "2014-07-08T15:30 UTC"
3
- email "test@example.com"
4
- name "Jeff"
5
- some_attributes({:a => 1})
6
- some_id 8
2
+ birthday { "2014-07-08T15:30 UTC" }
3
+ email { "test@example.com" }
4
+ name { "Jeff" }
5
+ some_attributes { {a: 1 } }
6
+ some_id { 8 }
7
7
  end
8
8
 
9
- factory(:admin, :parent => :"to_factory/user") do
10
- birthday "2014-07-08T15:30 UTC"
11
- email "admin@example.com"
12
- name "Admin"
13
- some_attributes({:a => 1})
14
- some_id 9
9
+ factory(:admin, parent: :"to_factory/user") do
10
+ birthday {"2014-07-08T15:30 UTC"}
11
+ email {"admin@example.com"}
12
+ name {"Admin"}
13
+ some_attributes { {a: 1 } }
14
+ some_id { 9 }
15
15
  end
@@ -1,21 +1,21 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory(:"to_factory/user") do
3
- name("User")
3
+ name {"User"}
4
4
  end
5
5
 
6
- factory(:root, :parent => :"to_factory/user") do
7
- birthday "2014-07-08T15:30 UTC"
8
- email "test@example.com"
9
- name "Jeff"
10
- some_attributes({:a => 1})
11
- some_id 8
6
+ factory(:admin, parent: :"to_factory/user") do
7
+ name {"Admin"}
12
8
  end
13
9
 
14
- factory(:admin, :parent => :"to_factory/user") do
15
- name("Admin")
10
+ factory(:root, parent: :"to_factory/user") do
11
+ birthday {"2014-07-08T15:30 UTC"}
12
+ email {"test@example.com"}
13
+ name {"Jeff"}
14
+ some_attributes {{a: 1}}
15
+ some_id { 8 }
16
16
  end
17
17
 
18
- factory(:super_admin, :parent => :admin) do
19
- name("Super Admin")
18
+ factory(:super_admin, parent: :admin) do
19
+ name {"Super Admin"}
20
20
  end
21
21
  end
@@ -1,13 +1,13 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory(:"to_factory/user") do
3
- name "User"
3
+ name {"User"}
4
4
  end
5
5
 
6
- factory(:admin, :parent => :"to_factory/user") do
7
- name "Admin"
6
+ factory(:admin, parent: :"to_factory/user") do
7
+ name {"Admin" }
8
8
  end
9
9
 
10
- factory(:super_admin, :parent => :admin) do
11
- name "Super Admin"
10
+ factory(:super_admin, parent: :admin) do
11
+ name {"Super Admin"}
12
12
  end
13
13
  end
@@ -1,17 +1,17 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory(:"to_factory/user") do
3
- birthday "2014-07-08T15:30 UTC"
4
- email "test@example.com"
5
- name "Jeff"
6
- some_attributes({:a => 1})
7
- some_id 8
3
+ birthday {"2014-07-08T15:30 UTC"}
4
+ email {"test@example.com"}
5
+ name {"Jeff"}
6
+ some_attributes {{a: 1}}
7
+ some_id { 8 }
8
8
  end
9
9
 
10
- factory(:admin, :parent => :"to_factory/user") do
11
- birthday "2014-07-08T15:30 UTC"
12
- email "admin@example.com"
13
- name "Admin"
14
- some_attributes({:a => 1})
15
- some_id 9
10
+ factory(:admin, parent: :"to_factory/user") do
11
+ birthday {"2014-07-08T15:30 UTC"}
12
+ email {"admin@example.com"}
13
+ name {"Admin"}
14
+ some_attributes {{a: 1}}
15
+ some_id { 9 }
16
16
  end
17
17
  end
@@ -1,9 +1,9 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory(:"to_factory/user") do
3
- birthday "2014-07-08T15:30 UTC"
4
- email "test@example.com"
5
- name "Jeff"
6
- some_attributes({:a => 1})
7
- some_id 8
3
+ birthday { "2014-07-08T15:30 UTC" }
4
+ email { "test@example.com" }
5
+ name { "Jeff" }
6
+ some_attributes { {:a => 1} }
7
+ some_id { 8 }
8
8
  end
9
9
  end
@@ -0,0 +1,19 @@
1
+ describe "Empty File spec" do
2
+ let(:user) { create_user! }
3
+
4
+ context "with an empty factory file" do
5
+ before do
6
+ user
7
+ FileUtils.mkdir_p "./tmp/factories/to_factory"
8
+
9
+ File.open("./tmp/factories/to_factory/empty.rb", "w") do |f|
10
+ f << " "
11
+ f << "\n "
12
+ end
13
+ end
14
+
15
+ it "doesn't blow up" do
16
+ ToFactory(empty: OpenStruct.new({ attributes: {} }), user: user)
17
+ end
18
+ end
19
+ end
@@ -1,28 +1,25 @@
1
1
  describe "FileSync" do
2
- let(:user) { create_user! }
3
- let(:admin) { create_admin! }
4
- let(:project) { create_project! }
5
- let(:version) { "new" }
2
+ let(:user) { create_user! }
3
+ let(:admin) { create_admin! }
4
+ let(:project) { create_project! }
6
5
  let(:expected_user_file) { File.read("./spec/example_factories/user.rb") }
7
6
  let(:expected_user_with_header_file) { File.read("./spec/example_factories/user_with_header.rb") }
8
7
  let(:expected_admin_file) { File.read("./spec/example_factories/admin.rb") }
9
8
  let(:user_with_header) { File.read("./spec/example_factories/user_with_header.rb") }
10
9
  let(:user_admin_with_header) { File.read("./spec/example_factories/user_admin_with_header.rb") }
11
10
 
12
-
13
- before do
14
- FileUtils.rm_rf "./tmp/factories"
15
- end
16
-
17
11
  def user_file
18
- File.read("./tmp/factories/to_factory/user.rb") rescue nil
12
+ File.read("./tmp/factories/to_factory/user.rb")
13
+ rescue
14
+ nil
19
15
  end
20
16
 
21
17
  def project_file
22
- File.read("./tmp/factories/to_factory/project.rb") rescue nil
18
+ File.read("./tmp/factories/to_factory/project.rb")
19
+ rescue
20
+ nil
23
21
  end
24
22
 
25
-
26
23
  context "with no arguments" do
27
24
  before do
28
25
  user
@@ -33,7 +30,7 @@ describe "FileSync" do
33
30
  sync = ToFactory::FileSync.new
34
31
  sync.perform
35
32
 
36
- expect(user_file ).to match_sexp expected_user_with_header_file
33
+ expect(user_file).to match_sexp expected_user_with_header_file
37
34
  end
38
35
  end
39
36
 
@@ -42,13 +39,11 @@ describe "FileSync" do
42
39
  sync = ToFactory::FileSync.new(user)
43
40
  sync.perform
44
41
 
45
- expect(user_file ).to match_sexp user_with_header
42
+ expect(user_file).to match_sexp user_with_header
46
43
  expect(project_file).to eq nil
47
44
  end
48
45
  end
49
46
 
50
-
51
-
52
47
  context "with a pre-existing file" do
53
48
  let(:sync) { ToFactory::FileSync.new(user) }
54
49
  before do
@@ -57,26 +52,23 @@ describe "FileSync" do
57
52
  end
58
53
 
59
54
  it "raises an error" do
60
- expect(lambda{ sync.perform }).to raise_error ToFactory::AlreadyExists
55
+ expect { sync.perform }.to raise_error ToFactory::AlreadyExists
61
56
  end
62
57
 
63
58
  context "with a named factory" do
64
59
  it do
65
- sync = ToFactory::FileSync.new({:admin => admin})
60
+ sync = ToFactory::FileSync.new(admin: admin)
66
61
  sync.perform
67
62
 
68
63
  parser = ToFactory::Parsing::File.new(user_file)
69
64
  result = parser.parse
70
- admin= result.find{|r| r.name == "admin"}
71
- user= result.find{|r| r.name == "to_factory/user"}
72
-
65
+ admin = result.find { |r| r.name == "admin" }
66
+ user = result.find { |r| r.name == "to_factory/user" }
73
67
 
74
68
  expect(admin.definition).to match_sexp expected_admin_file
75
69
  expect(user.definition).to match_sexp expected_user_file
76
70
 
77
- expect(lambda{
78
- sync.perform
79
- }).to raise_error ToFactory::AlreadyExists
71
+ expect { sync.perform }.to raise_error ToFactory::AlreadyExists
80
72
  end
81
73
  end
82
74
  end
@@ -1,18 +1,22 @@
1
1
  describe ToFactory::FileWriter do
2
- let(:fw) { ToFactory::FileWriter.new }
3
- let(:expected) { File.read "./spec/example_factories/user_with_header.rb"}
4
- let(:user_file_contents) { File.read "./tmp/factories/to_factory/user.rb"}
2
+ let(:file_writer) { ToFactory::FileWriter.new }
3
+ let(:user_file_contents) { File.read "./tmp/factories/to_factory/user.rb" }
5
4
  let!(:user) { create_user! }
6
- let!(:admin) { create_admin! }
5
+ let!(:admin) { create_admin! }
6
+ let(:file_sync) { ToFactory::FileSync.new }
7
+ let(:representations) { file_sync.all_representations }
7
8
 
8
- it do
9
- fs = ToFactory::FileSync.new
10
- representations = fs.all_representations
11
- #sanity check generation isn't broken
9
+ let(:expected) { File.read "./spec/example_factories/user_with_header.rb" }
10
+
11
+ before do
12
+ # sanity check generation isn't broken
12
13
  expect(representations.keys).to eq ["to_factory/user"]
13
14
  expect(representations.values[0][0]).to be_a ToFactory::Representation
15
+ end
16
+
17
+ it 'writes correctly' do
18
+ file_writer.write representations
14
19
 
15
- fw.write representations
16
20
  expect(user_file_contents).to match_sexp expected
17
21
  end
18
22
  end
@@ -1,12 +1,13 @@
1
1
  context "full integration" do
2
2
  let(:user) do
3
- ToFactory::User.create :name => "Jeff", :email => "test@example.com", :some_id => 8, :birthday => Time.now
3
+ ToFactory::User.create name: "Jeff", email: "test@example.com", some_id: 8, birthday: Time.now
4
4
  end
5
5
 
6
6
  it "#to_factory linting the output" do
7
7
  ToFactory(user)
8
+ require 'factory_bot'
9
+
8
10
  load "./tmp/factories/to_factory/user.rb"
9
- FactoryGirl.lint
11
+ FactoryBot.lint
10
12
  end
11
13
  end
12
-
@@ -0,0 +1,96 @@
1
+ describe ToFactory do
2
+ let!(:user) { create_user! }
3
+
4
+ def user_file
5
+ File.read("./tmp/factories/to_factory/user.rb")
6
+ rescue
7
+ nil
8
+ end
9
+
10
+ let(:expected_user_file) { File.read "./spec/example_factories/user_with_header.rb" }
11
+
12
+ context "single call" do
13
+ before do
14
+ ToFactory()
15
+ end
16
+ it "renders a single factory correctly" do
17
+ expect(user_file).to match_sexp expected_user_file
18
+ end
19
+ end
20
+
21
+ context "two calls" do
22
+ before do
23
+ ToFactory()
24
+ ToFactory(user_2: ToFactory::User.first)
25
+ end
26
+
27
+ it "renders two factories correctly" do
28
+ expect(user_file).to eq <<-FACTORY.strip_heredoc
29
+ FactoryBot.define do
30
+ factory(:"to_factory/user") do
31
+ birthday { "2014-07-08T15:30 UTC" }
32
+ email { "test@example.com" }
33
+ name { "Jeff" }
34
+ some_attributes { { :a => 1 } }
35
+ some_id { 8 }
36
+ end
37
+
38
+ factory(:user_2, :parent => :"to_factory/user") do
39
+ birthday { "2014-07-08T15:30 UTC" }
40
+ email { "test@example.com" }
41
+ name { "Jeff" }
42
+ some_attributes { {:a => 1} }
43
+ some_id { 8 }
44
+ end
45
+ end
46
+ FACTORY
47
+ end
48
+ end
49
+
50
+ context "multiple calls" do
51
+ before do
52
+ ToFactory()
53
+ ToFactory(user_2: ToFactory::User.first)
54
+ ToFactory(user_3: ToFactory::User.first)
55
+ ToFactory(user_4: ToFactory::User.first)
56
+ end
57
+
58
+ it "renders multiple factories correctly" do
59
+ expect(user_file).to match_sexp <<-FACTORY
60
+ FactoryBot.define do
61
+ factory(:"to_factory/user") do
62
+ birthday { "2014-07-08T15:30 UTC" }
63
+ email { "test@example.com" }
64
+ name { "Jeff" }
65
+ some_attributes { {:a => 1} }
66
+ some_id { 8 }
67
+ end
68
+
69
+ factory(:user_2, :parent => :"to_factory/user") do
70
+ birthday { "2014-07-08T15:30 UTC" }
71
+ email { "test@example.com" }
72
+ name { "Jeff" }
73
+ some_attributes { {:a => 1} }
74
+ some_id { 8 }
75
+ end
76
+
77
+ factory(:user_3, :parent => :"to_factory/user") do
78
+ birthday { "2014-07-08T15:30 UTC" }
79
+ email { "test@example.com" }
80
+ name { "Jeff" }
81
+ some_attributes { {:a => 1} }
82
+ some_id { 8 }
83
+ end
84
+
85
+ factory(:user_4, :parent => :"to_factory/user") do
86
+ birthday { "2014-07-08T15:30 UTC" }
87
+ email { "test@example.com" }
88
+ name { "Jeff" }
89
+ some_attributes { {:a => 1} }
90
+ some_id { 8 }
91
+ end
92
+ end
93
+ FACTORY
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,40 @@
1
+ describe "non active record classes" do
2
+ let!(:project) { create_project! }
3
+
4
+ def project_file
5
+ File.read("./tmp/factories/to_factory/project.rb")
6
+ rescue
7
+ nil
8
+ end
9
+
10
+ def inherited_project_file
11
+ File.read("./tmp/factories/to_factory/inherited_project.rb")
12
+ rescue
13
+ nil
14
+ end
15
+
16
+ let(:expected_project_file) { File.read "./spec/example_factories/project_with_header.rb" }
17
+ let(:expected_inherited_project_file) { File.read "./spec/example_factories/inherited_project_with_header.rb" }
18
+
19
+ context "given a folder with non active record models in" do
20
+ before do
21
+ ToFactory.models = "./spec/support/non_active_record"
22
+ ToFactory()
23
+ end
24
+
25
+ it "creates an ordinary factory correctly" do
26
+ expect(project_file).to match_sexp expected_project_file
27
+ end
28
+
29
+ context "STI" do
30
+ it "creates a single factory correctly" do
31
+ expect(inherited_project_file).to match_sexp expected_inherited_project_file
32
+ end
33
+ end
34
+
35
+ it "doesn't create other factories" do
36
+ count = Dir.glob("./tmp/factories/*.rb").length
37
+ expect(count).to eq 0
38
+ end
39
+ end
40
+ end