zyra 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 00f7455045c5d24031d971b23b6e4aacea3e256de330600fd03993798c447b70
4
- data.tar.gz: ab6f1d457d198075c2c41040cfeced8417f003c2ead58f0ac14747e8dddb08b4
3
+ metadata.gz: 5cb11a8449da1cdc0b87c0600b96c3b7e9c76b024b95bc4a722b764570296f50
4
+ data.tar.gz: 5848a55463e899d78ff4c28dd6ae81993916cd449b3dfd35692bb47f46777452
5
5
  SHA512:
6
- metadata.gz: fb9d2ef90e2ab27699c3dbb97b24a651e8341e6064eeb1a7e9497775039f3fc551c2f1f513b7bd44e301b63ef18c1d8fe556cd7c01ff284e71699cab6f3b3e02
7
- data.tar.gz: 61ac5329ed5bc9f015415bca09336be77580a9eb746d4f40bf88bee4696bb5893257ea91912dc3e3e318436a01952c6e1738566775971f5471a39f39d35fd4ba
6
+ metadata.gz: 5b13ca88db8dfa338c68f4af3177d39202d2274a88ec0738a7146b59619e6ccb3369277280e0954fe68150e43ed3f8aac1566d95802c79a552b74db340235f96
7
+ data.tar.gz: ff5cfc24cbc93e90107ec311b1c6baf25c9fc81d9e8aba0bb89ba1f2d876cf93198f6769a5fcf21d3db5db670e4ad399a1762081a41cf21cdd848d46bbf0dc8f
data/.circleci/config.yml CHANGED
@@ -7,8 +7,12 @@ workflows:
7
7
  filters:
8
8
  tags:
9
9
  only: /.*/
10
+ - checks:
11
+ filters:
12
+ tags:
13
+ only: /.*/
10
14
  - build-and-release:
11
- requires: [test]
15
+ requires: [test, checks]
12
16
  filters:
13
17
  tags:
14
18
  only: /\d+\.\d+\.\d+/
@@ -18,7 +22,7 @@ workflows:
18
22
  jobs:
19
23
  test:
20
24
  docker:
21
- - image: darthjee/circleci_ruby_270:1.1.0
25
+ - image: darthjee/circleci_rails_gems:1.1.0
22
26
  environment:
23
27
  PROJECT: zyra
24
28
  steps:
@@ -32,12 +36,22 @@ jobs:
32
36
  - run:
33
37
  name: RSpec
34
38
  command: bundle exec rspec
35
- - run:
36
- name: Rubocop
37
- command: rubocop
38
39
  - run:
39
40
  name: Coverage Test Report
40
41
  command: cc-test-reporter after-build --exit-code $?
42
+ checks:
43
+ docker:
44
+ - image: darthjee/circleci_rails_gems:1.1.0
45
+ environment:
46
+ PROJECT: zyra
47
+ steps:
48
+ - checkout
49
+ - run:
50
+ name: Bundle Install
51
+ command: bundle install
52
+ - run:
53
+ name: Rubocop
54
+ command: rubocop
41
55
  - run:
42
56
  name: Yardstick coverage check
43
57
  command: bundle exec rake verify_measurements
@@ -52,7 +66,7 @@ jobs:
52
66
  command: check_specs
53
67
  build-and-release:
54
68
  docker:
55
- - image: darthjee/circleci_ruby_270:1.1.0
69
+ - image: darthjee/circleci_rails_gems:1.1.0
56
70
  environment:
57
71
  PROJECT: zyra
58
72
  steps:
data/Dockerfile CHANGED
@@ -1,6 +1,6 @@
1
1
  FROM darthjee/scripts:0.3.1 as scripts
2
2
 
3
- FROM darthjee/ruby_270:1.1.0 as base
3
+ FROM darthjee/rails_gems:1.1.0 as base
4
4
 
5
5
  COPY --chown=app:app ./ /home/app/app/
6
6
 
@@ -0,0 +1,7 @@
1
+ FROM darthjee/scripts:0.3.1 as scripts
2
+
3
+ FROM darthjee/circleci_rails_gems:1.1.0 as base
4
+
5
+ COPY --chown=circleci:circleci ./ /home/circleci/project/
6
+
7
+ RUN bundle install
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- Jace
1
+ Zyra
2
2
  ====
3
3
  [![Code Climate](https://codeclimate.com/github/darthjee/zyra/badges/gpa.svg)](https://codeclimate.com/github/darthjee/zyra)
4
4
  [![Test Coverage](https://codeclimate.com/github/darthjee/zyra/badges/coverage.svg)](https://codeclimate.com/github/darthjee/zyra/coverage)
@@ -11,7 +11,7 @@ Jace
11
11
 
12
12
  Yard Documentation
13
13
  -------------------
14
- [https://www.rubydoc.info/gems/zyra/0.0.1](https://www.rubydoc.info/gems/zyra/0.0.1)
14
+ [https://www.rubydoc.info/gems/zyra/0.0.2](https://www.rubydoc.info/gems/zyra/0.0.2)
15
15
 
16
16
  Installation
17
17
  ---------------
@@ -1,2 +1,3 @@
1
1
  ignore:
2
2
  - lib/zyra/version.rb
3
+ - lib/zyra/exceptions.rb
data/config/yardstick.yml CHANGED
@@ -1,4 +1,4 @@
1
- threshold: 100
1
+ threshold: 96
2
2
  require_exact_threshold: false
3
3
  rules:
4
4
  ApiTag::Presence:
@@ -15,13 +15,25 @@ rules:
15
15
  exclude: []
16
16
  ExampleTag:
17
17
  enabled: true
18
- exclude: []
18
+ exclude:
19
+ - Zyra.register
20
+ - Zyra.after
21
+ - Zyra.build
22
+ - Zyra.create
23
+ - Zyra::Builder#after
24
+ - Zyra::Builder#build
25
+ - Zyra::Builder#create
26
+ - Zyra::Registry#register
19
27
  ReturnTag:
20
28
  enabled: true
21
- exclude: []
29
+ exclude:
30
+ - Zyra.after
31
+ - Zyra.build
32
+ - Zyra.create
22
33
  Summary::Presence:
23
34
  enabled: true
24
- exclude: []
35
+ exclude:
36
+ - Zyra::Builder#initialize
25
37
  Summary::Length:
26
38
  enabled: true
27
39
  exclude: []
data/docker-compose.yml CHANGED
@@ -21,3 +21,14 @@ services:
21
21
  <<: *base
22
22
  depends_on: [base_build]
23
23
  command: /bin/bash -c 'rspec && yard && rake yardstick_measure && rake verify_measurements'
24
+
25
+ circleci:
26
+ <<: *base
27
+ build:
28
+ context: ./
29
+ dockerfile: Dockerfile.circleci
30
+ command: echo done
31
+ image: zyra_circleci
32
+ working_dir: /home/circleci/project
33
+ volumes:
34
+ - .:/home/circleci/project
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zyra
4
+ # @api private
5
+ # @author Darthjee
6
+ #
7
+ # Class responsible for building a model
8
+ class Builder
9
+ # @param model_class [Class] Model class to be initialized
10
+ # into a model
11
+ def initialize(model_class)
12
+ @model_class = model_class
13
+ end
14
+
15
+ # @api public
16
+ # Builds an instance of the registered model class
17
+ #
18
+ # @param attributes [Hash] attributes to be set in the model
19
+ # @param block [Proc] block to be ran after where more attributes
20
+ # will be set
21
+ #
22
+ # @yield [Object] Instance of the model class
23
+ #
24
+ # @return [Object] an instance of model class
25
+ def build(**attributes, &block)
26
+ block ||= proc {}
27
+
28
+ model_class.new(attributes).tap(&block).tap do |model|
29
+ event_registry.trigger(:build, model)
30
+ end
31
+ end
32
+
33
+ # @api public
34
+ # Creates an instance of the registered model class
35
+ #
36
+ # This behaves like {#build}, but persists the entry
37
+ #
38
+ # @param (see #build)
39
+ # @yield (see #build)
40
+ # @return (see #build)
41
+ def create(**attributes, &block)
42
+ model = build(**attributes, &block)
43
+
44
+ event_registry.trigger(:create, model) do
45
+ model.tap(&:save)
46
+ end
47
+ end
48
+
49
+ # @api public
50
+ # Register a handler on a certain event
51
+ #
52
+ # Possible events are +build+, +create+
53
+ #
54
+ # @param event [Symbol,String] event to be watched.
55
+ # @param block [Proc] block to be executed when the event is called
56
+ #
57
+ # @yield [Object] the model built
58
+ #
59
+ # @return [Builder] the builder itself
60
+ def after(event, &block)
61
+ tap { event_registry.register(event, &block) }
62
+ end
63
+
64
+ # Checks if another builder is equal to the current builder
65
+ #
66
+ # This is used mostly for rspec expectations
67
+ #
68
+ # @param other [Object] other object to be compared
69
+ #
70
+ # @return [TrueClass,FalseClass]
71
+ def ==(other)
72
+ return unless other.class == self.class
73
+
74
+ other.model_class == model_class
75
+ end
76
+
77
+ protected
78
+
79
+ # @method model_class
80
+ # @api private
81
+ #
82
+ # Model class to be initialized into a model
83
+ #
84
+ # @return [Class]
85
+ attr_reader :model_class
86
+
87
+ # @private
88
+ #
89
+ # Event registry
90
+ #
91
+ # The event registry will contain all handlers for
92
+ # post build or creating events
93
+ #
94
+ # @return [Jace::Registry]
95
+ def event_registry
96
+ @event_registry ||= Jace::Registry.new
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sinclair'
4
+ require 'jace'
5
+
6
+ module Zyra
7
+ module Exceptions
8
+ class BuilderNotRegistered < StandardError; end
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Zyra
4
+ # @api private
5
+ #
6
+ # Registry of all registered builders
7
+ class Registry
8
+ # (see Zyra.register)
9
+ def register(klass, key = klass.name.gsub(/::([A-Z])/, '_\1').downcase)
10
+ registry[key.to_sym] = Builder.new(klass)
11
+ end
12
+
13
+ # Returns a registered builder
14
+ #
15
+ # when the builder was not registerd, +nil+ is returned
16
+ #
17
+ # @param key [String,Symbol] key under which the builder is registered
18
+ #
19
+ # @return [Zyra::Builder]
20
+ def builder_for(key)
21
+ registry[key.to_sym]
22
+ end
23
+
24
+ private
25
+
26
+ # @private
27
+ #
28
+ # Registry store for all builders
29
+ #
30
+ # @return [Hash] map of all registered builders
31
+ def registry
32
+ @registry ||= {}
33
+ end
34
+ end
35
+ end
data/lib/zyra/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Zyra
4
- VERSION = '0.0.1'
3
+ module Zyra
4
+ VERSION = '0.0.2'
5
5
  end
data/lib/zyra.rb CHANGED
@@ -1,7 +1,119 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'sinclair'
4
+ require 'jace'
5
+
3
6
  # @api public
4
7
  # @author darthjee
5
- class Zyra
8
+ #
9
+ # Zyra allows builders to be registered to ease up
10
+ # seeding
11
+ module Zyra
6
12
  autoload :VERSION, 'zyra/version'
13
+
14
+ autoload :Builder, 'zyra/builder'
15
+ autoload :Exceptions, 'zyra/exceptions'
16
+ autoload :Registry, 'zyra/registry'
17
+
18
+ class << self
19
+ # @method .register
20
+ # @api public
21
+ #
22
+ # Register a new builder
23
+ #
24
+ # The builder will focus on one class and be registered under a
25
+ # symbol key
26
+ #
27
+ # @param klass [Class] Model class to be used by the builder
28
+ #
29
+ # @overload register(klass)
30
+ # When the key is not provided, it is infered from the class name
31
+ #
32
+ # @overload register(klass, key)
33
+ # @param key [String,Symbol] key to be used when storyin the builder
34
+ #
35
+ # @return [Zyra::Builder] registered builder
36
+ delegate :register, to: :registry
37
+
38
+ # Register a handler on a certain event
39
+ #
40
+ # Possible events are +build+, +create+
41
+ #
42
+ # @param key [String,Symbol] key under which the {Builder builder}
43
+ # is {Registry registered}
44
+ # @param (see Builder#after)
45
+ #
46
+ # @yield [Object] the model built
47
+ #
48
+ # @return (see Builder#after)
49
+ def after(key, event, &block)
50
+ builder_for(key).after(event, &block)
51
+ end
52
+
53
+ # Builds an instance of the registered model class
54
+ #
55
+ # @param key [String,Symbol] key under which the {Builder builder}
56
+ # is {Registry registered}
57
+ # @param (see Builder#build)
58
+ #
59
+ # @yield (see Builder#build)
60
+ #
61
+ # @return (see Builder#build)
62
+ #
63
+ # @see .register
64
+ # @see Builder#build
65
+ def build(key, **attributes, &block)
66
+ builder_for(key).build(**attributes, &block)
67
+ end
68
+
69
+ # Creates an instance of the registered model class
70
+ #
71
+ # This behaves like {.build}, but persists the entry
72
+ #
73
+ # @param (see .build)
74
+ # @yield (see .build)
75
+ # @return (see .build)
76
+ #
77
+ # @see .register
78
+ # @see Builder#create
79
+ def create(key, **attributes, &block)
80
+ builder_for(key).create(**attributes, &block)
81
+ end
82
+
83
+ # @api private
84
+ #
85
+ # Resets the state of the registry
86
+ #
87
+ # This is mainly used for testing
88
+ #
89
+ # @return [NilClass]
90
+ def reset
91
+ @registry = nil
92
+ end
93
+
94
+ private
95
+
96
+ # @private
97
+ # @api private
98
+ #
99
+ # Returns a registered builder for a key
100
+ #
101
+ # @param key [String,Symbol] key under which the {Builder builder}
102
+ # is {Registry registered}
103
+ #
104
+ # @return [Builder]
105
+ def builder_for(key)
106
+ registry.builder_for(key) || raise(Exceptions::BuilderNotRegistered)
107
+ end
108
+
109
+ # @private
110
+ # @api private
111
+ #
112
+ # Returns the registry containing all the builders
113
+ #
114
+ # @return [Registry]
115
+ def registry
116
+ @registry ||= Registry.new
117
+ end
118
+ end
7
119
  end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Zyra::Builder do
6
+ subject(:builder) { described_class.new(model_class) }
7
+
8
+ let(:model_class) { User }
9
+
10
+ describe '#build' do
11
+ it do
12
+ expect(builder.build).to be_a(model_class)
13
+ end
14
+
15
+ it do
16
+ expect(builder.build)
17
+ .not_to be_persisted
18
+ end
19
+
20
+ context 'when attributes are given' do
21
+ let(:name) { SecureRandom.hex(10) }
22
+
23
+ it 'initializes the model with the given attribute' do
24
+ expect(builder.build(name: name).name)
25
+ .to eq(name)
26
+ end
27
+ end
28
+
29
+ context 'when a block is given' do
30
+ let(:name) { SecureRandom.hex(10) }
31
+
32
+ it 'initializes the model with the given attribute' do
33
+ value = name
34
+ expect(builder.build { |model| model.name = value }.name)
35
+ .to eq(name)
36
+ end
37
+ end
38
+
39
+ context 'when building has an after build handler' do
40
+ let(:name) { SecureRandom.hex(10) }
41
+
42
+ before do
43
+ value = name
44
+ builder.after(:build) { |model| model.name = value }
45
+ end
46
+
47
+ it 'runs the event handler' do
48
+ expect(builder.build.name)
49
+ .to eq(name)
50
+ end
51
+ end
52
+ end
53
+
54
+ describe '#create' do
55
+ it do
56
+ expect(builder.create).to be_a(model_class)
57
+ end
58
+
59
+ it do
60
+ expect(builder.create)
61
+ .to be_persisted
62
+ end
63
+
64
+ context 'when attributes are given' do
65
+ let(:name) { SecureRandom.hex(10) }
66
+
67
+ it 'initializes the model with the given attribute' do
68
+ expect(builder.create(name: name).name)
69
+ .to eq(name)
70
+ end
71
+ end
72
+
73
+ context 'when a block is given' do
74
+ let(:name) { SecureRandom.hex(10) }
75
+
76
+ it 'initializes the model with the given attribute' do
77
+ value = name
78
+ expect(builder.create { |model| model.name = value }.name)
79
+ .to eq(name)
80
+ end
81
+ end
82
+
83
+ context 'when building has an after build handler' do
84
+ let(:name) { SecureRandom.hex(10) }
85
+
86
+ before do
87
+ value = name
88
+ builder.after(:build) { |model| model.name = "#{value}#{model.id}" }
89
+ end
90
+
91
+ it 'runs the event handler' do
92
+ expect(builder.create.name)
93
+ .to eq(name)
94
+ end
95
+ end
96
+
97
+ context 'when building has an after create handler' do
98
+ let(:name) { SecureRandom.hex(10) }
99
+
100
+ before do
101
+ value = name
102
+ builder.after(:create) { |model| model.name = "#{value}#{model.id}" }
103
+ end
104
+
105
+ it 'runs the event handler' do
106
+ model = builder.create
107
+ expect(model.name)
108
+ .to eq("#{name}#{model.id}")
109
+ end
110
+ end
111
+ end
112
+
113
+ describe '#after' do
114
+ let(:name) { SecureRandom.hex(10) }
115
+
116
+ it 'register a handler to be ran after an event' do
117
+ value = name
118
+
119
+ expect { builder.after(:build) { |model| model.name = value } }
120
+ .to change { builder.build.name }
121
+ .from(nil).to(name)
122
+ end
123
+
124
+ it do
125
+ expect(builder.after(:build) {})
126
+ .to be(builder)
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Zyra::Registry do
6
+ let(:registry) { described_class.new }
7
+
8
+ describe '#register' do
9
+ context 'when providing symbol alias' do
10
+ let(:key) { :user_alias }
11
+
12
+ it 'creates a builder for the given class' do
13
+ expect(registry.register(User, key))
14
+ .to eq(Zyra::Builder.new(User))
15
+ end
16
+
17
+ it 'register builder under the key' do
18
+ expect { registry.register(User, key) }
19
+ .to change { registry.builder_for(key) }
20
+ .from(nil).to(Zyra::Builder.new(User))
21
+ end
22
+ end
23
+
24
+ context 'when providing string alias' do
25
+ let(:key) { 'user' }
26
+
27
+ it 'creates a builder for the given class' do
28
+ expect(registry.register(User, key))
29
+ .to eq(Zyra::Builder.new(User))
30
+ end
31
+
32
+ it 'register builder under the key' do
33
+ expect { registry.register(User, key) }
34
+ .to change { registry.builder_for(key) }
35
+ .from(nil).to(Zyra::Builder.new(User))
36
+ end
37
+ end
38
+
39
+ context 'when not providing an alias' do
40
+ let(:key) { :user }
41
+
42
+ it 'creates a builder for the given class' do
43
+ expect(registry.register(User))
44
+ .to eq(Zyra::Builder.new(User))
45
+ end
46
+
47
+ it 'register builder under the correct key' do
48
+ expect { registry.register(User) }
49
+ .to change { registry.builder_for(key) }
50
+ .from(nil).to(Zyra::Builder.new(User))
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#builder_for' do
56
+ let(:key) { :user }
57
+
58
+ context 'when there is no builder registered' do
59
+ it do
60
+ expect(registry.builder_for(key))
61
+ .to be_nil
62
+ end
63
+ end
64
+
65
+ context 'when there is no builder registered on a symbol key' do
66
+ before do
67
+ registry.register(User, :user)
68
+ end
69
+
70
+ it do
71
+ expect(registry.builder_for(key))
72
+ .to eq(Zyra::Builder.new(User))
73
+ end
74
+
75
+ context 'when passing a string key' do
76
+ let(:key) { 'user' }
77
+
78
+ it do
79
+ expect(registry.builder_for(key))
80
+ .to eq(Zyra::Builder.new(User))
81
+ end
82
+ end
83
+ end
84
+
85
+ context 'when there is no builder registered on a string key' do
86
+ before do
87
+ registry.register(User, 'user')
88
+ end
89
+
90
+ it do
91
+ expect(registry.builder_for(key))
92
+ .to eq(Zyra::Builder.new(User))
93
+ end
94
+
95
+ context 'when passing a string key' do
96
+ let(:key) { 'user' }
97
+
98
+ it do
99
+ expect(registry.builder_for(key))
100
+ .to eq(Zyra::Builder.new(User))
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -3,6 +3,155 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Zyra do
6
- it 'does something' do
6
+ before { described_class.reset }
7
+
8
+ describe '.build' do
9
+ let(:model_class) { User }
10
+ let(:key) { :user }
11
+
12
+ context 'when a builder has not been registered' do
13
+ it do
14
+ expect { described_class.build(key) }
15
+ .to raise_error(Zyra::Exceptions::BuilderNotRegistered)
16
+ end
17
+ end
18
+
19
+ context 'when a builder has been registered' do
20
+ before do
21
+ described_class.register(model_class)
22
+ end
23
+
24
+ it do
25
+ expect(described_class.build(key)).to be_a(model_class)
26
+ end
27
+
28
+ it do
29
+ expect(described_class.build(key))
30
+ .not_to be_persisted
31
+ end
32
+
33
+ context 'when attributes are given' do
34
+ let(:name) { SecureRandom.hex(10) }
35
+
36
+ it 'initializes the model with the given attribute' do
37
+ expect(described_class.build(key, name: name).name)
38
+ .to eq(name)
39
+ end
40
+ end
41
+
42
+ context 'when a block is given' do
43
+ let(:name) { SecureRandom.hex(10) }
44
+
45
+ it 'initializes the model with the given attribute' do
46
+ value = name
47
+ expect(described_class.build(key) { |model| model.name = value }.name)
48
+ .to eq(name)
49
+ end
50
+ end
51
+
52
+ context 'when building has an after build handler' do
53
+ let(:name) { SecureRandom.hex(10) }
54
+
55
+ before do
56
+ value = name
57
+ described_class.after(:user, :build) do |model|
58
+ model.name = value
59
+ end
60
+ end
61
+
62
+ it 'runs the event handler' do
63
+ expect(described_class.build(key) .name)
64
+ .to eq(name)
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ describe '.create' do
71
+ let(:model_class) { User }
72
+ let(:key) { :user }
73
+
74
+ context 'when a builder has not been registered' do
75
+ it do
76
+ expect { described_class.create(key) }
77
+ .to raise_error(Zyra::Exceptions::BuilderNotRegistered)
78
+ end
79
+ end
80
+
81
+ context 'when a builder has been registered' do
82
+ before do
83
+ described_class.register(model_class)
84
+ end
85
+
86
+ it do
87
+ expect(described_class.create(key)).to be_a(model_class)
88
+ end
89
+
90
+ it do
91
+ expect(described_class.create(key))
92
+ .to be_persisted
93
+ end
94
+
95
+ context 'when attributes are given' do
96
+ let(:name) { SecureRandom.hex(10) }
97
+
98
+ it 'initializes the model with the given attribute' do
99
+ expect(described_class.create(key, name: name).name)
100
+ .to eq(name)
101
+ end
102
+ end
103
+
104
+ context 'when a block is given' do
105
+ let(:name) { SecureRandom.hex(10) }
106
+
107
+ it 'initializes the model with the given attribute' do
108
+ value = name
109
+ model = described_class.create(key) { |mdl| mdl.name = value }
110
+ expect(model.name)
111
+ .to eq(name)
112
+ end
113
+ end
114
+
115
+ context 'when building has an after build handler' do
116
+ let(:name) { SecureRandom.hex(10) }
117
+
118
+ before do
119
+ value = name
120
+ described_class.after(:user, :build) do |model|
121
+ model.name = value
122
+ end
123
+ end
124
+
125
+ it 'runs the event handler' do
126
+ expect(described_class.create(key) .name)
127
+ .to eq(name)
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ describe '.after' do
134
+ let(:model_class) { User }
135
+ let(:key) { :user }
136
+ let(:name) { SecureRandom.hex(10) }
137
+
138
+ context 'when a builder has been registered' do
139
+ before do
140
+ described_class.register(model_class)
141
+ end
142
+
143
+ it 'register a handler to be ran after an event' do
144
+ value = name
145
+
146
+ expect { described_class.after(key, :build) { |m| m.name = value } }
147
+ .to change { described_class.build(key).name }
148
+ .from(nil).to(name)
149
+ end
150
+
151
+ it do
152
+ expect(described_class.after(key, :build) {})
153
+ .to be_a(Zyra::Builder)
154
+ end
155
+ end
7
156
  end
8
157
  end
data/spec/spec_helper.rb CHANGED
@@ -11,6 +11,11 @@ SimpleCov.start 'gem'
11
11
  require 'zyra'
12
12
  require 'pry-nav'
13
13
 
14
+ require 'active_record'
15
+ ActiveRecord::Base.establish_connection(
16
+ adapter: 'sqlite3', database: ':memory:'
17
+ )
18
+
14
19
  support_files = File.expand_path('spec/support/**/*.rb')
15
20
 
16
21
  Dir[support_files].sort.each { |file| require file }
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class User < ActiveRecord::Base
4
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Schema.define do
4
+ self.verbose = false
5
+
6
+ create_table :users, force: true do |t|
7
+ t.string :name
8
+ t.string :email
9
+ end
10
+ end
data/zyra.gemspec CHANGED
@@ -19,6 +19,10 @@ Gem::Specification.new do |gem|
19
19
  gem.test_files = gem.files.grep(%r{^(test|gem|features)/})
20
20
  gem.require_paths = ['lib']
21
21
 
22
+ gem.add_runtime_dependency 'jace', '>= 0.1.1'
23
+ gem.add_runtime_dependency 'sinclair', '>= 1.8.0'
24
+
25
+ gem.add_development_dependency 'activerecord', '5.2.8.1'
22
26
  gem.add_development_dependency 'bundler', '2.3.20'
23
27
  gem.add_development_dependency 'pry', '0.14.1'
24
28
  gem.add_development_dependency 'pry-nav', '1.0.0'
@@ -33,6 +37,7 @@ Gem::Specification.new do |gem|
33
37
  gem.add_development_dependency 'rubocop-rspec', '1.38.1'
34
38
  gem.add_development_dependency 'rubycritic', '4.7.0'
35
39
  gem.add_development_dependency 'simplecov', '0.21.2'
40
+ gem.add_development_dependency 'sqlite3', '1.4.2'
36
41
  gem.add_development_dependency 'yard', '0.9.27'
37
42
  gem.add_development_dependency 'yardstick', '0.9.9'
38
43
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zyra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - DarthJee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-31 00:00:00.000000000 Z
11
+ date: 2022-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jace
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: sinclair
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.8.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 5.2.8.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 5.2.8.1
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: bundler
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +248,20 @@ dependencies:
206
248
  - - '='
207
249
  - !ruby/object:Gem::Version
208
250
  version: 0.21.2
251
+ - !ruby/object:Gem::Dependency
252
+ name: sqlite3
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - '='
256
+ - !ruby/object:Gem::Version
257
+ version: 1.4.2
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - '='
263
+ - !ruby/object:Gem::Version
264
+ version: 1.4.2
209
265
  - !ruby/object:Gem::Dependency
210
266
  name: yard
211
267
  requirement: !ruby/object:Gem::Requirement
@@ -247,6 +303,7 @@ files:
247
303
  - ".rubocop.yml"
248
304
  - ".rubocop_todo.yml"
249
305
  - Dockerfile
306
+ - Dockerfile.circleci
250
307
  - Gemfile
251
308
  - LICENSE
252
309
  - README.md
@@ -257,12 +314,19 @@ files:
257
314
  - config/yardstick.yml
258
315
  - docker-compose.yml
259
316
  - lib/zyra.rb
317
+ - lib/zyra/builder.rb
318
+ - lib/zyra/exceptions.rb
319
+ - lib/zyra/registry.rb
260
320
  - lib/zyra/version.rb
261
321
  - spec/integration/readme/.keep
262
322
  - spec/integration/yard/.keep
323
+ - spec/lib/zyra/builder_spec.rb
324
+ - spec/lib/zyra/registry_spec.rb
263
325
  - spec/lib/zyra_spec.rb
264
326
  - spec/spec_helper.rb
265
327
  - spec/support/models/.keep
328
+ - spec/support/models/user.rb
329
+ - spec/support/schema.rb
266
330
  - spec/support/shared_examples/.keep
267
331
  - zyra.gemspec
268
332
  - zyra.jpg