fabricas 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6ea7ee05cb9fd845ff15449a531358f93c168e8e
4
+ data.tar.gz: 09af594527a108e52ab1ca2ce405122e13b57055
5
+ SHA512:
6
+ metadata.gz: 7a26f3aab3b18b5ca77832d61fe84d67a91cad11162595523d32635a2d8ec37e5c812d54925c97cfa97e57412a4dd2da1b1c549d144ed3a74706ef6d129bf045
7
+ data.tar.gz: 003ee49dc7f7b7f93ebad20418a8e5fb80aa6d026c1487fafb3e53131c120122ef4d0854b4979514a00645a96b7bcbfe79d0a856377d9c50ac5345d93688d10a
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Julio Lopez
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,114 @@
1
+ Fabricas
2
+ ====
3
+
4
+ Minimalist library for build factories.
5
+
6
+ ## Introduction
7
+
8
+ Fabricas is simple, just a few lines of code. Is framework agnostic, there are no monkey-patch to any class or object and is very useful when you need to build objects fast.
9
+
10
+ ## Installation
11
+
12
+ Installing Fabricas is as simple as running:
13
+
14
+ ```
15
+ $ gem install fabricas
16
+ ```
17
+
18
+ Include Fabricas in your Gemfile with gem 'fabricas' or require it with require 'fabricas'.
19
+
20
+ Usage
21
+ -----
22
+
23
+ ```ruby
24
+ class User
25
+ attr_accessor :name, :email
26
+ end
27
+
28
+ Fabricas.define do
29
+ factory :user do
30
+ name "Julio"
31
+ email "email@gmail.com"
32
+ end
33
+ end
34
+
35
+ user = Fabricas.build :user
36
+ puts user.inspect
37
+ #=> <User @name= "Julio", @email= "email@gmail.com">
38
+
39
+ other_user = Fabricas.build :user, name: "Pedro"
40
+ puts other_user.inspect
41
+ #=> <User @name= "Pedro", @email= "email@gmail.com">
42
+ ```
43
+
44
+ ### Defining a class name
45
+
46
+ You can provide your own class name to your factories using the `class_name` key:
47
+
48
+ ```ruby
49
+ Fabricas.define do
50
+ factory :admin, class_name: "User" do
51
+ name "Big Boss"
52
+ admin true
53
+ end
54
+ end
55
+
56
+ admin = Fabricas.build :admin
57
+ puts admin.inspect
58
+ #=> <User @name= "Big Boss", @admin= true>
59
+ ```
60
+
61
+ ### Sending blocks as attributes
62
+
63
+ Also you can use blocks in your `factory` to send whatever you want.
64
+
65
+ ```ruby
66
+ Fabricas.define do
67
+ factory :user do
68
+ # ...
69
+ password { User.generate_password }
70
+ city { Faker::Address.city }
71
+ end
72
+ end
73
+ ```
74
+
75
+ You can take advantage of them for send other instances.
76
+
77
+ ```ruby
78
+ class Pet
79
+ attr_accessor :name, :age
80
+ end
81
+
82
+ Fabricas.define do
83
+ factory :user do
84
+ # ...
85
+ pet { Fabricas.build :pet }
86
+ end
87
+
88
+ factory :pet do
89
+ name "Firulais"
90
+ age 12
91
+ end
92
+ end
93
+
94
+ user = Fabricas.build :user
95
+ puts user.pet.inspect
96
+ #=> <Pet @name= "Firulais", @age= 12>
97
+ ```
98
+
99
+ ### Dependent Attributes
100
+ Attributes can be built using other attributes
101
+
102
+ ```ruby
103
+ Fabricas.define do
104
+ factory :user do
105
+ name "Julio"
106
+ url "workingawesome.com"
107
+ email { "#{name.downcase}@#{url}" }
108
+ end
109
+ end
110
+
111
+ user = Fabricas.build :user
112
+ puts user.inspect
113
+ #=> <User @name= "Julio", @url="workingawesome.com" @email= "julio@workingawesome.com">
114
+ ```
data/fabricas.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ require "./lib/fabricas"
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "fabricas"
5
+ s.version = Fabricas::VERSION
6
+ s.summary = "Minimalist library for build factories."
7
+ s.description = "Fabricas is simple, just a few lines of code. Is framework agnostic, there are no monkey-patch to any class or object and is very useful when you need to build objects fast."
8
+ s.authors = ["Julio Lopez"]
9
+ s.email = ["ljuliom@gmail.com"]
10
+ s.homepage = "http://github.com/TheBlasfem/fabricas"
11
+ s.files = Dir[
12
+ "LICENSE",
13
+ "README.md",
14
+ "lib/**/*.rb",
15
+ "*.gemspec",
16
+ "test/**/*.rb"
17
+ ]
18
+ s.license = "MIT"
19
+ s.add_development_dependency "cutest", "1.1.3"
20
+ end
data/lib/fabricas.rb ADDED
@@ -0,0 +1,57 @@
1
+ # Copyright (c) 2015 Julio Lopez
2
+
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+ module Fabricas
21
+ VERSION = "1.0.0"
22
+ @factories = {}
23
+ def self.factories; @factories; end
24
+
25
+ def self.define(&block)
26
+ module_eval(&block)
27
+ end
28
+
29
+ def self.factory(klass, args = {}, &block)
30
+ if block_given?
31
+ factories[klass] = CleanRoom.new args.fetch(:class_name, nil)
32
+ factories[klass].instance_eval(&block)
33
+ end
34
+ end
35
+
36
+ def self.build(klass, values = {})
37
+ _i = const_get((factories[klass].class_name || klass).capitalize).new
38
+ attributes = factories[klass].attributes.merge(values)
39
+ attributes.each do |name, value|
40
+ _i.send("#{name}=", value.is_a?(Proc) ? _i.instance_eval(&value) : value)
41
+ end
42
+ _i
43
+ end
44
+
45
+ class CleanRoom < BasicObject
46
+ attr_reader :attributes, :class_name
47
+
48
+ def initialize(class_name)
49
+ @attributes = {}
50
+ @class_name = class_name.downcase.to_sym if class_name
51
+ end
52
+
53
+ def method_missing(method_name, *args, &block)
54
+ attributes[method_name] = args.first || block
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,78 @@
1
+ require File.expand_path("../lib/fabricas", File.dirname(__FILE__))
2
+
3
+ class User
4
+ attr_accessor :name, :email, :pet, :admin, :password, :url
5
+
6
+ def self.generate_password
7
+ "5555"
8
+ end
9
+ end
10
+
11
+ class Pet
12
+ attr_accessor :name, :age, :adopted
13
+ end
14
+
15
+ Fabricas.define do
16
+ factory :user do
17
+ name "Julio"
18
+ url "workingawesome.com"
19
+ email { "#{name.downcase}@#{url}" }
20
+ password { User.generate_password }
21
+ pet { Fabricas.build :pet }
22
+ end
23
+
24
+ factory :admin, class_name: "User" do
25
+ name "Big Boss"
26
+ email "boss@gmail.com"
27
+ admin true
28
+ end
29
+
30
+ factory :pet do
31
+ name "Calvin"
32
+ age 1
33
+ adopted true
34
+ end
35
+ end
36
+
37
+ scope do
38
+ test "build user returns name and email" do
39
+ user = Fabricas.build :user
40
+ assert_equal user.name, "Julio"
41
+ assert_equal user.url, "workingawesome.com"
42
+ end
43
+
44
+ test "build user with name returns the sent name" do
45
+ user = Fabricas.build :user, name: "Pedro"
46
+ assert_equal user.name, "Pedro"
47
+ assert_equal user.url, "workingawesome.com"
48
+ end
49
+
50
+ test "multiple factories" do
51
+ pet = Fabricas.build :pet
52
+ assert_equal pet.name, "Calvin"
53
+ assert_equal pet.age, 1
54
+ assert_equal pet.adopted, true
55
+ end
56
+
57
+ test "factory object instances by proc" do
58
+ user = Fabricas.build :user
59
+ assert_equal user.pet.name, "Calvin"
60
+ assert_equal user.pet.age, 1
61
+ end
62
+
63
+ test "factory run method in proc" do
64
+ user = Fabricas.build :user
65
+ assert_equal user.password, "5555"
66
+ end
67
+
68
+ test "using another class name" do
69
+ admin = Fabricas.build :admin
70
+ assert_equal admin.name, "Big Boss"
71
+ assert_equal admin.admin, true
72
+ end
73
+
74
+ test "dependent attribute" do
75
+ user = Fabricas.build :user
76
+ assert_equal user.email, "julio@workingawesome.com"
77
+ end
78
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fabricas
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Julio Lopez
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cutest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.1.3
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.1.3
27
+ description: Fabricas is simple, just a few lines of code. Is framework agnostic,
28
+ there are no monkey-patch to any class or object and is very useful when you need
29
+ to build objects fast.
30
+ email:
31
+ - ljuliom@gmail.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - LICENSE
37
+ - README.md
38
+ - fabricas.gemspec
39
+ - lib/fabricas.rb
40
+ - test/test_fabricas.rb
41
+ homepage: http://github.com/TheBlasfem/fabricas
42
+ licenses:
43
+ - MIT
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.2.2
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Minimalist library for build factories.
65
+ test_files: []