adaptor 0.1.0 → 0.2.1

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: e0990c06482fe55cec104a9f0f0587f1b0d00a6b5187bfbb05d16e6acdff87f9
4
- data.tar.gz: 624998b5b711ceb962a592be32c456ad0f248aa52b410e2b7672aaad1c6a07ff
3
+ metadata.gz: 2cec000085cd4c4fbeee7ca6dc0ba9443733f5dcd981167e948fe9f5e78a209d
4
+ data.tar.gz: 71dc57e3c8157ecd56eb8cdf43434a873ec9d4369bb6ffb437446d023a67fb53
5
5
  SHA512:
6
- metadata.gz: 9d58b8bfa436860609a2cdbafcdea3750caa8ce0a1b0bd152755e4f74e5292769830c46033e0c31983c444cf218a9f3cd1ac350ac4fc4cab62ea06080469ef51
7
- data.tar.gz: 6008e017efe35b30848983df4a392825bf217230ffb1ab1e2aca0d8cf299da41ed1bd7e78533c23cfa89bd5b542d90654e880a5a7c5221684d4366eaaee696e7
6
+ metadata.gz: cef2a653b2e6f619d0d792f77aaa8969c39d66adb629926a5cacec055a9c56790cdb0c89821b755120c4e6e8d1eb33891e286e479e8666b69d8967ac67a89d5a
7
+ data.tar.gz: e25535ef085921a51ed8c04c4d9fb3e0aa5af09bde3229817a1a655f7a326f7fa1332d22c8b7e521ca816a5d1323847725814ceaa9bae947eefdac4caee13703
@@ -5,6 +5,7 @@ AllCops:
5
5
  Include:
6
6
  - '**/Gemfile'
7
7
  - '**/Rakefile'
8
+ - '**/*.rb'
8
9
  Exclude:
9
10
  - 'bin/*'
10
11
  - 'db/**/*'
@@ -52,7 +53,7 @@ Style/SignalException:
52
53
  Style/BracesAroundHashParameters:
53
54
  EnforcedStyle: context_dependent
54
55
 
55
- Lint/EndAlignment:
56
+ Layout/EndAlignment:
56
57
  EnforcedStyleAlignWith: variable
57
58
  AutoCorrect: true
58
59
 
@@ -0,0 +1,29 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
+ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.2.1]
11
+
12
+ ### Fixed
13
+
14
+ - Fixed support for multiple arguments
15
+
16
+ ## [0.2.0]
17
+
18
+ ### Added
19
+
20
+ - Added support for multiple arguments
21
+
22
+ ## [0.1.0]
23
+
24
+ Initial release.
25
+
26
+ [Unreleased]: https://github.com/aldesantis/adaptor/compare/v0.2.0...HEAD
27
+ [0.2.1]: https://github.com/aldesantis/adaptor/compare/v0.2.0...v0.2.1
28
+ [0.2.0]: https://github.com/aldesantis/adaptor/compare/v0.1.0...v0.2.0
29
+ [0.1.0]: https://github.com/aldesantis/adaptor/tree/v0.1.0
data/Gemfile CHANGED
@@ -4,3 +4,5 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in adaptor.gemspec
6
6
  gemspec
7
+
8
+ gem 'pry'
@@ -1,25 +1,31 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- adaptor (0.1.0)
4
+ adaptor (0.2.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  ast (2.4.0)
10
- coveralls (0.8.21)
10
+ coderay (1.1.2)
11
+ coveralls (0.8.22)
11
12
  json (>= 1.8, < 3)
12
- simplecov (~> 0.14.1)
13
+ simplecov (~> 0.16.1)
13
14
  term-ansicolor (~> 1.3)
14
15
  thor (~> 0.19.4)
15
16
  tins (~> 1.6)
16
17
  diff-lcs (1.3)
17
- docile (1.1.5)
18
+ docile (1.3.1)
19
+ jaro_winkler (1.5.1)
18
20
  json (2.1.0)
21
+ method_source (0.9.0)
19
22
  parallel (1.12.1)
20
- parser (2.4.0.2)
21
- ast (~> 2.3)
22
- powerpack (0.1.1)
23
+ parser (2.5.1.2)
24
+ ast (~> 2.4.0)
25
+ powerpack (0.1.2)
26
+ pry (0.11.3)
27
+ coderay (~> 1.1.0)
28
+ method_source (~> 0.9.0)
23
29
  rainbow (3.0.0)
24
30
  rake (10.5.0)
25
31
  rspec (3.7.0)
@@ -35,18 +41,19 @@ GEM
35
41
  diff-lcs (>= 1.2.0, < 2.0)
36
42
  rspec-support (~> 3.7.0)
37
43
  rspec-support (3.7.1)
38
- rubocop (0.52.1)
44
+ rubocop (0.58.1)
45
+ jaro_winkler (~> 1.5.1)
39
46
  parallel (~> 1.10)
40
- parser (>= 2.4.0.2, < 3.0)
47
+ parser (>= 2.5, != 2.5.1.1)
41
48
  powerpack (~> 0.1)
42
49
  rainbow (>= 2.2.2, < 4.0)
43
50
  ruby-progressbar (~> 1.7)
44
51
  unicode-display_width (~> 1.0, >= 1.0.1)
45
- rubocop-rspec (1.22.2)
46
- rubocop (>= 0.52.1)
52
+ rubocop-rspec (1.27.0)
53
+ rubocop (>= 0.56.0)
47
54
  ruby-progressbar (1.9.0)
48
- simplecov (0.14.1)
49
- docile (~> 1.1.0)
55
+ simplecov (0.16.1)
56
+ docile (~> 1.1)
50
57
  json (>= 1.8, < 3)
51
58
  simplecov-html (~> 0.10.0)
52
59
  simplecov-html (0.10.2)
@@ -54,7 +61,7 @@ GEM
54
61
  tins (~> 1.0)
55
62
  thor (0.19.4)
56
63
  tins (1.16.3)
57
- unicode-display_width (1.3.0)
64
+ unicode-display_width (1.4.0)
58
65
 
59
66
  PLATFORMS
60
67
  ruby
@@ -63,10 +70,11 @@ DEPENDENCIES
63
70
  adaptor!
64
71
  bundler (~> 1.16)
65
72
  coveralls (~> 0.8)
73
+ pry
66
74
  rake (~> 10.0)
67
75
  rspec (~> 3.0)
68
76
  rubocop (~> 0.52)
69
77
  rubocop-rspec (~> 1.22)
70
78
 
71
79
  BUNDLED WITH
72
- 1.16.1
80
+ 1.16.2
data/README.md CHANGED
@@ -1,9 +1,8 @@
1
1
  # Adaptor
2
2
 
3
- [![Build Status](https://travis-ci.org/aldesantis/adaptor-rb.svg?branch=master)](https://travis-ci.org/aldesantis/adaptor-rb)
4
- [![Dependency Status](https://gemnasium.com/badges/github.com/aldesantis/adaptor-rb.svg)](https://gemnasium.com/github.com/aldesantis/adaptor-rb)
5
- [![Coverage Status](https://coveralls.io/repos/github/aldesantis/adaptor-rb/badge.svg?branch=master)](https://coveralls.io/github/aldesantis/adaptor-rb?branch=master)
6
- [![Maintainability](https://api.codeclimate.com/v1/badges/e51e8d7489eb72ab97ba/maintainability)](https://codeclimate.com/github/aldesantis/adaptor-rb/maintainability)
3
+ [![Build Status](https://travis-ci.org/aldesantis/adaptor.svg?branch=master)](https://travis-ci.org/aldesantis/adaptor)
4
+ [![Coverage Status](https://coveralls.io/repos/github/aldesantis/adaptor/badge.svg?branch=master)](https://coveralls.io/github/aldesantis/adaptor?branch=master)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/e51e8d7489eb72ab97ba/maintainability)](https://codeclimate.com/github/aldesantis/adaptor/maintainability)
7
6
 
8
7
  Adaptor makes it easy to implement the [Adapter pattern](https://en.wikipedia.org/wiki/Adapter_pattern) in Ruby.
9
8
 
@@ -25,7 +24,7 @@ Or install it yourself as:
25
24
 
26
25
  ## Usage
27
26
 
28
- ### Single-Adaptor Mode
27
+ ### Single adaptor mode
29
28
 
30
29
  You can use the library in single-adaptor mode:
31
30
 
@@ -33,25 +32,33 @@ You can use the library in single-adaptor mode:
33
32
  module DocumentProcessor
34
33
  class Pdf
35
34
  include Adaptor
36
-
35
+
37
36
  def self.supports?(document)
38
37
  document.mime_type == 'application/pdf'
39
38
  end
40
-
39
+
40
+ def initialize(document)
41
+ @document = document
42
+ end
43
+
41
44
  def build_thumbnail
42
- # ...
45
+ # something with @document
43
46
  end
44
47
  end
45
-
46
- class Word
48
+
49
+ class Word
47
50
  include Adaptor
48
-
51
+
49
52
  def self.supports?(document)
50
53
  document.mime_type == 'application/msword'
51
54
  end
52
-
55
+
56
+ def initialize(document)
57
+ @document = document
58
+ end
59
+
53
60
  def build_thumbnail
54
- # ...
61
+ # something with @document
55
62
  end
56
63
  end
57
64
  end
@@ -61,12 +68,12 @@ module DocumentProcessor
61
68
  register Pdf, Word
62
69
  end
63
70
 
64
- # You can use #load_adaptor! if you want to raise an
65
- # Adaptor::NoAdaptorError when no adaptor is found.
66
- thumbnail = DocumentProcessor.load_adaptor(object).build_thumbnail
71
+ # You can use #load_adaptor! if you want to raise an
72
+ # Adaptor::NoAdaptorError when no adaptor is found.
73
+ thumbnail = DocumentProcessor.load_adaptor(document).build_thumbnail
67
74
  ```
68
75
 
69
- ### Multiple-Adaptor Mode
76
+ ### Multiple adaptor mode
70
77
 
71
78
  If it suits your use case, you can use multiple-adaptor mode:
72
79
 
@@ -74,31 +81,31 @@ If it suits your use case, you can use multiple-adaptor mode:
74
81
  module NotificationProcessor
75
82
  class Email
76
83
  include Adaptor
77
-
84
+
78
85
  def self.supports?(notification)
79
86
  notification.user.email.present?
80
87
  end
81
-
88
+
82
89
  def initialize(notification)
83
90
  @notification = notification
84
91
  end
85
-
92
+
86
93
  def deliver
87
94
  # ...
88
95
  end
89
96
  end
90
-
91
- class Sms
97
+
98
+ class Sms
92
99
  include Adaptor
93
-
100
+
94
101
  def self.supports?(notification)
95
102
  notification.user.phone.present?
96
103
  end
97
-
104
+
98
105
  def initialize(notification)
99
106
  @notification = notification
100
107
  end
101
-
108
+
102
109
  def deliver
103
110
  # ...
104
111
  end
@@ -110,15 +117,71 @@ module MultipleAdaptorLoader
110
117
  register Email, Sms
111
118
  end
112
119
 
113
- # You can use #load_adaptors! if you want to raise an
114
- # Adaptor::NoAdaptorError when no adaptors are found.
115
- NotificationProcessor.load_adaptors(notifications).each(&:deliver)
120
+ # You can use #load_adaptors! if you want to raise an
121
+ # Adaptor::NoAdaptorError when no adaptors are found.
122
+ NotificationProcessor.load_adaptors(notification).each(&:deliver)
123
+ ```
124
+
125
+ ### Multiple arguments
126
+
127
+ Note that there is no limit to the number of arguments you can pass to the adaptors' `.supports?`
128
+ and `.new` methods. Here's an example that checks support only with one argument, but initializes
129
+ with multiple:
130
+
131
+ ```ruby
132
+ module DocumentProcessor
133
+ class Pdf
134
+ include Adaptor
135
+
136
+ def self.supports?(document)
137
+ document.mime_type == 'application/pdf'
138
+ end
139
+
140
+ def initialize(document, options)
141
+ @document = document
142
+ @options = options
143
+ end
144
+
145
+ def build_thumbnail
146
+ # something with @document and @options
147
+ end
148
+ end
149
+
150
+ class Word
151
+ include Adaptor
152
+
153
+ def self.supports?(document)
154
+ document.mime_type == 'application/msword'
155
+ end
156
+
157
+ def initialize(document, options)
158
+ @document = document
159
+ @options = options
160
+ end
161
+
162
+ def build_thumbnail
163
+ # something with @document and @options
164
+ end
165
+ end
166
+ end
167
+
168
+ module DocumentProcessor
169
+ include Adaptor::Loader
170
+ register Pdf, Word
171
+ end
172
+
173
+ # You can use #load_adaptor! if you want to raise an
174
+ # Adaptor::NoAdaptorError when no adaptor is found.
175
+ thumbnail = DocumentProcessor.load_adaptor(document, stamp: true).build_thumbnail
116
176
  ```
117
177
 
178
+ As you can see, whatever you pass to `.load_adaptor` or `.load_adaptors` will be forwarded to
179
+ `.supports?` and `.new`, according to the methods' respective arity.
180
+
118
181
  ## Contributing
119
182
 
120
- Bug reports and pull requests are welcome on GitHub at https://github.com/aldesantis/adaptor-rb. This
121
- project is intended to be a safe, welcoming space for collaboration, and contributors are expected
183
+ Bug reports and pull requests are welcome on GitHub at https://github.com/aldesantis/adaptor. This
184
+ project is intended to be a safe, welcoming space for collaboration, and contributors are expected
122
185
  to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
123
186
 
124
187
  ## License
@@ -127,5 +190,5 @@ The gem is available as open source under the terms of the [MIT License](https:/
127
190
 
128
191
  ## Code of Conduct
129
192
 
130
- Everyone interacting in the Adaptor project’s codebases, issue trackers, chat rooms and mailing
193
+ Everyone interacting in the Adaptor project’s codebases, issue trackers, chat rooms and mailing
131
194
  lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/adaptor/blob/master/CODE_OF_CONDUCT.md).
@@ -32,46 +32,65 @@ module Adaptor
32
32
 
33
33
  # Loads the first available adaptor for the given object.
34
34
  #
35
- # @param [Object] object the object to load the adaptor for
35
+ # @param [Array] args any arguments to pass to the adaptor's +.supports?+ and +.new+
36
36
  #
37
37
  # @return [Object|NilClass] an instance of the adpator or nil if no adaptor was found
38
- def load_adaptor(object)
39
- adaptors.find { |adaptor_klass| adaptor_klass.supports?(object) }&.new(object)
38
+ def load_adaptor(*args)
39
+ adaptor_klass = adaptors.find do |klass|
40
+ adaptor_supports?(klass, args)
41
+ end
42
+
43
+ instantiate_adaptor(adaptor_klass, args) if adaptor_klass
40
44
  end
41
45
 
42
46
  # Loads the first available adaptor for the given object.
43
47
  #
44
- # @param [Object] object the object to load the adaptor for
48
+ # @param [Array] args any arguments to pass to the adaptor's +.supports?+ and +.new+
45
49
  #
46
50
  # @return [Object] an instance of the adaptor
47
51
  #
48
52
  # @raise [NoAdaptorError] when no adaptor was found
49
- def load_adaptor!(object)
50
- load_adaptor(object) || fail(NoAdaptorError, "No adaptor found for #{object}")
53
+ def load_adaptor!(*args)
54
+ load_adaptor(*args) || fail(NoAdaptorError, "No adaptor found for #{args.inspect}")
51
55
  end
52
56
 
53
57
  # Loads all the adaptors which support the given object.
54
58
  #
55
- # @param [Object] object the object to load the adaptors for
59
+ # @param [Array] args any arguments to pass to the adaptors' +.supports?+ and +.new+
56
60
  #
57
61
  # @return [Array] instances of compatible adaptors
58
- def load_adaptors(object)
62
+ def load_adaptors(*args)
59
63
  adaptors.map do |adaptor_klass|
60
- next unless adaptor_klass.supports?(object)
61
- adaptor_klass.new(object)
64
+ next unless adaptor_supports?(adaptor_klass, args)
65
+ instantiate_adaptor(adaptor_klass, args)
62
66
  end.compact
63
67
  end
64
68
 
65
69
  # Loads all the adaptors which support the given object.
66
70
  #
67
- # @param [Object] object the object to load the adaptors for
71
+ # @param [Array] args any arguments to pass to the adaptors' +.supports?+ and +.new+
68
72
  #
69
73
  # @return [Array] instances of compatible adaptors
70
74
  #
71
75
  # @raise [NoAdaptorError] when no adaptors are found
72
- def load_adaptors!(object)
73
- adaptors = load_adaptors(object)
74
- adaptors.any? ? adaptors : fail(NoAdaptorError, "No adaptors found for #{object}")
76
+ def load_adaptors!(*args)
77
+ adaptors = load_adaptors(*args)
78
+ adaptors.any? ? adaptors : fail(NoAdaptorError, "No adaptors found for #{args.inspect}")
79
+ end
80
+
81
+ private
82
+
83
+ def adaptor_supports?(adaptor, args)
84
+ adaptor.supports?(*cut_args(args, method: adaptor.method(:supports?)))
85
+ end
86
+
87
+ def instantiate_adaptor(adaptor, args)
88
+ adaptor.new(*cut_args(args, method: adaptor.method(:new)))
89
+ end
90
+
91
+ def cut_args(args, method:)
92
+ arity = method.arity
93
+ arity.negative? ? args : args[0..(arity - 1)]
75
94
  end
76
95
  end
77
96
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Adaptor
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adaptor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alessandro Desantis
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-13 00:00:00.000000000 Z
11
+ date: 2018-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coveralls
@@ -105,6 +105,7 @@ files:
105
105
  - ".rspec"
106
106
  - ".rubocop.yml"
107
107
  - ".travis.yml"
108
+ - CHANGELOG.md
108
109
  - CODE_OF_CONDUCT.md
109
110
  - Gemfile
110
111
  - Gemfile.lock
@@ -138,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
139
  version: '0'
139
140
  requirements: []
140
141
  rubyforge_project:
141
- rubygems_version: 2.7.5
142
+ rubygems_version: 2.7.7
142
143
  signing_key:
143
144
  specification_version: 4
144
145
  summary: Adaptor makes it easy to implement the Adapter pattern in Ruby.