hexx 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e71da2454f5770b15da144731907f77d705259f6
4
- data.tar.gz: 683c0e424c30d3a28fef7f0ceab28eae8421964f
3
+ metadata.gz: 44ade515af4a4044dce3725cf4a30ed2aef4da8e
4
+ data.tar.gz: 1c456b7fb78fe55d509019f03c0fbbce27a8f777
5
5
  SHA512:
6
- metadata.gz: 0ec0862dbf0553ecfcbb213bc266ef4aacf780dea390ddf42473a9068c937f269776e816e30dbe5623dd744c0e36a7e0c8ecaa2b8e9725593b422bf21b82c6be
7
- data.tar.gz: 9549db59cfde983b9781bb2bd8a13ba68eefddaf7a75b04278d0b4b8b39ee197593062e0833a3dabcebdf91a9e412a2085ce31c22e961d3564951a3e066ac5ed
6
+ metadata.gz: 255b6f79bd8726ffae49218d4f66ea397766ae79d265a2cdd353306217b5beedb73286e3c620f8ee45f2e42e94bf8ebf353452d9e504bdb35340009d1ac9a629
7
+ data.tar.gz: acdc38e43842a7be485378975c1b3dacc7e99b4ee0c53c500f2f35c369f70da4a60242712067d7bea8bb9dd9e692641adbce06659dc6736db7555423852c5c84
data/README.rdoc CHANGED
@@ -14,6 +14,10 @@ Provides:
14
14
  * +Service+ base class for decoupling a domain business logics from a controller
15
15
  * +Models+ module for extending domain models.
16
16
 
17
+ The module is expected to be used in PORO domain. For usage in active record
18
+ domains consider { hexx-active_record }[https://github.com/nepalez/hexx-active_record]
19
+ gem instead.
20
+
17
21
  == Installation
18
22
 
19
23
  Add this line to your application's Gemfile:
@@ -28,16 +32,16 @@ Or install it yourself as:
28
32
 
29
33
  $ gem install hexx
30
34
 
31
- == A pattern
35
+ == Pattern
36
+
37
+ Service objects decouple business logics from:
32
38
 
33
- Service objects decouple business logics from both:
34
39
  * Domain _models_ (entities).
35
40
  * Delivery mechanism _controllers_ (such as Rails framework).
36
41
 
37
- Following object oriented architecture service objects exploit the
38
- *Observer* (Listener) pattern, using the
39
- { Wisper }[https://github.com/krisleech/wisper] gem. A service doesn't
40
- return their result to caller but notifies its subscribers instead.
42
+ To follow object oriented architecture Hexx services exploit the
43
+ *Observer* (Listener) pattern via { Wisper }[https://github.com/krisleech/wisper]
44
+ gem.
41
45
 
42
46
  Some examples of this pattern implementation are available at the
43
47
  { wisper gem wiki }[https://github.com/krisleech/wisper/wiki].
@@ -48,7 +52,7 @@ A typical service object is shown below:
48
52
 
49
53
  require 'hexx'
50
54
 
51
- class GetItem < Hexx::Service
55
+ class AddItem < Hexx::Service
52
56
 
53
57
  # whitelists parameters and defines corresponding attributes.
54
58
  allow_params :name
@@ -58,8 +62,7 @@ A typical service object is shown below:
58
62
 
59
63
  # runs a service
60
64
  def run
61
-
62
- # runs some
65
+ # a wrapper sends :error notification to listeners in case of any exception raised.
63
66
  transaction
64
67
  MyModel.save! name: name # name is defined by allow_params helper.
65
68
  publish :success # notifies its listeners.
@@ -67,39 +70,43 @@ A typical service object is shown below:
67
70
  end
68
71
  end
69
72
 
70
- Usage of the service (in a Rails controller):
73
+ Usage of the service (with a Rails controller):
71
74
 
72
75
  class ItemsController < ActionController::Base
73
76
 
74
77
  # Creates an item with given name
75
- def show
76
- service = GetItem.new params.allow(:name)
78
+ def create
79
+ service = AddItem.new params.allow(:name)
77
80
  service.subscribe self, prefix: :on
78
81
  service.run
79
82
  end
80
83
 
81
84
  # Publishes a success message
82
- def success
83
- render "created"
85
+ def on_created(item, messages)
86
+ @item, @messages = item, messages
87
+ render "created", status: 201
84
88
  end
85
89
 
86
90
  # Publishes an error messages
87
- def error(messages)
91
+ def on_error(messages)
88
92
  @messages = messages
89
93
  render "error"
90
94
  end
95
+ end
96
+
97
+ The controller knows nothing about the action itself. It only needs to
98
+ sort out a request and send it to a corresponding service.
91
99
 
92
- Note the controller knows nothing about the action itself. It responsible only
93
- for selection of proper service and responding to its results.
100
+ Any controller action does one thing only.
94
101
 
95
- Also note any controller action does one thing only. The +show+ action
96
- are requested by a client. The +on_success+ and +on_error+ are called by
97
- a service and reports to a client.
102
+ * +create+ action sorts out requests.
103
+ * both +on_success+ and +on_created+ listens to services and report their
104
+ results back to client.
98
105
 
99
106
  === Models and Entities
100
107
 
101
- The module also defines module <tt>Hexx::Models</tt> to extend domain models
102
- (entities). This allows coercion of model attributes with +attr_coerced+ helper:
108
+ The module also defines <tt>Hexx::Models</tt> module to extend domain models
109
+ (entities). This allows coercion of attributes with +attr_coerced+ helper:
103
110
 
104
111
  class User
105
112
  extend Hexx::Models
@@ -114,8 +121,8 @@ The module also defines module <tt>Hexx::Models</tt> to extend domain models
114
121
  user.name.class
115
122
  # => ActiveSupport::Multibyte::Chars
116
123
 
117
- The method defines (or redefines) both attribute getter and setter. You can use
118
- it to transform values by default:
124
+ The method redefines both getter and setter and can be used for value
125
+ preparation:
119
126
 
120
127
  class StrippedString < String
121
128
  def initialize(value)
@@ -133,7 +140,7 @@ it to transform values by default:
133
140
 
134
141
  == Relevant Links
135
142
 
136
- 1:: Matt Wynne's talk {Hexagonal Rails}[http://www.confreaks.com/videos/977-goruco2012-hexagonal-rails]
143
+ * Matt Wynne's talk {Hexagonal Rails}[http://www.confreaks.com/videos/977-goruco2012-hexagonal-rails]
137
144
 
138
145
  == License
139
146
 
data/lib/hexx/models.rb CHANGED
@@ -1,5 +1,4 @@
1
- lib = File.dirname __FILE__
2
- Dir[File.join(lib, "models/**/*.rb")].each { |file| require file }
1
+ require_relative "models/base_coercer"
3
2
 
4
3
  module Hexx
5
4
 
@@ -1,3 +1,5 @@
1
+ require_relative "invalid"
2
+
1
3
  module Hexx
2
4
  class Service
3
5
 
data/lib/hexx/service.rb CHANGED
@@ -1,5 +1,8 @@
1
- lib = File.dirname __FILE__
2
- Dir[File.join(lib, "service/**/*.rb")].each { |file| require file }
1
+ def service_modules
2
+ Dir[File.expand_path("../service/*.rb", __FILE__)]
3
+ end
4
+
5
+ service_modules.each { |file| require file }
3
6
 
4
7
  module Hexx
5
8
 
data/lib/hexx/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  module Hexx
3
3
 
4
4
  # Current release.
5
- VERSION = "2.0.1"
5
+ VERSION = "2.0.2"
6
6
  end
data/lib/hexx.rb CHANGED
@@ -1,10 +1,8 @@
1
1
  require "active_model"
2
2
  require "wisper"
3
3
 
4
- # Gem files.
5
- lib = File.dirname __FILE__
6
- Dir[File.join(lib, "hexx/*.rb")].each { |file| require file }
7
-
8
- # Namespace for the gem.
9
- module Hexx
4
+ def files
5
+ @files ||= Dir[File.expand_path("../hexx/**/*.rb", __FILE__)]
10
6
  end
7
+
8
+ files.each { |file| require file }
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,11 @@
1
- root = File.dirname File.dirname(__FILE__)
1
+ require "coveralls"
2
+
3
+ # Application root
4
+ root = File.expand_path "../..", __FILE__
2
5
 
3
6
  # Support files and Rspec settings
4
7
  Dir[File.join(root, "spec/initializers/*.rb")].each { |file| require file }
5
8
 
6
9
  # Application files
10
+ Coveralls.wear!
7
11
  require File.join(root, "lib/hexx.rb")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hexx
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kozin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-01 00:00:00.000000000 Z
11
+ date: 2014-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -53,75 +53,75 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.7'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: inch
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '10.3'
61
+ version: '0.5'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '10.3'
68
+ version: '0.5'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rspec
70
+ name: metric_fu
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.0'
75
+ version: '4.11'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '3.0'
82
+ version: '4.11'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rubocop
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.23'
89
+ version: '10.3'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.23'
96
+ version: '10.3'
97
97
  - !ruby/object:Gem::Dependency
98
- name: inch
98
+ name: rspec
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.5'
103
+ version: '3.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.5'
110
+ version: '3.0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: metric_fu
112
+ name: rubocop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '4.11'
117
+ version: '0.23'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '4.11'
124
+ version: '0.23'
125
125
  description: Defines domain service object and model attributes coercion.
126
126
  email: andrew.kozin@gmail.com
127
127
  executables: []
@@ -149,7 +149,6 @@ files:
149
149
  - spec/hexx/service/invalid_spec.rb
150
150
  - spec/hexx/service/message_spec.rb
151
151
  - spec/hexx/service_spec.rb
152
- - spec/initializers/coveralls.rb
153
152
  - spec/initializers/focus.rb
154
153
  - spec/initializers/garbage_collection.rb
155
154
  - spec/initializers/i18n.rb
@@ -189,7 +188,6 @@ test_files:
189
188
  - spec/initializers/garbage_collection.rb
190
189
  - spec/initializers/i18n.rb
191
190
  - spec/initializers/focus.rb
192
- - spec/initializers/coveralls.rb
193
191
  - spec/initializers/random_order.rb
194
192
  - spec/initializers/rspec.rb
195
193
  - Rakefile
@@ -1,3 +0,0 @@
1
- # Checking test coverage
2
- require "coveralls"
3
- Coveralls.wear!