power_converter 0.0.1.pre → 0.0.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
  SHA1:
3
- metadata.gz: ccd70818d69d9990e821703b4e8a9e49856001b8
4
- data.tar.gz: 2cea00042a024b0ad259dc4f3e09970f0d837fa8
3
+ metadata.gz: 1ffe8e4ed7f1e0bdafe8e06f34abca7936df05eb
4
+ data.tar.gz: 7be13e121f7797f707da2627fa048a7117d2888c
5
5
  SHA512:
6
- metadata.gz: 972d7539a37881439fd8a29319d6493439dc52c1d4468f1601e084058ead91228ac942f145071d06469a3d3c7343c507db3a40d132664fc51589feab7fb0c074
7
- data.tar.gz: 06fed58b0a0d17409979f0a121060322c6020483976ab9fb49acfa300cf084f6f632c83e05a71a937fd376fcb169127e320ce8e7e60c1fb98ad2d77cbfdfd47b
6
+ metadata.gz: 6b61649071f7d32ed30c86ce4f4dc09a1a442f0d49c6ac8d255a7ab03b1e0c2b1326557e559a5e90a5d4b79fadca90c0e3f9628cd10ed05f6e46095cea677b2f
7
+ data.tar.gz: a25a41c2d57a8241a307905ba9d9e6264d0133888bc56b181b52bddbc3beb0583b4816c7093234499bcd827b21be73c435a583e3c8353786832f76ca312aea33
data/README.md CHANGED
@@ -1,3 +1,22 @@
1
1
  # PowerConverter
2
2
 
3
+ [![Build Status](https://travis-ci.org/jeremyf/power_converter.png?branch=master)](https://travis-ci.org/jeremyf/power_converter)
4
+ [![Documentation Status](http://inch-ci.org/github/jeremyf/power_converter.svg?branch=master)](http://inch-ci.org/github/jeremyf/power_converter)
5
+ [![APACHE 2 License](http://img.shields.io/badge/APACHE2-license-blue.svg)](./LICENSE)
6
+
3
7
  A placeholder for implementing a conversion module pattern.
8
+
9
+ Exposing a means of registering conversions. These can be accessed at the module
10
+ level:
11
+
12
+ ```ruby
13
+ PowerConverter.define_conversion_for :boolean do |input|
14
+ case input
15
+ when false, 0, '0', 'false', 'no', nil then false
16
+ else
17
+ true
18
+ end
19
+ end
20
+
21
+ PowerConverter.convert(object, to: :boolean)
22
+ ```
@@ -1,5 +1,155 @@
1
1
  require "power_converter/version"
2
2
 
3
+ # PowerConverter is a composition service module. It provides a way to define
4
+ # conversion methods.
5
+ #
6
+ # What is a conversion method?
7
+ #
8
+ # > A well-established Ruby idiom for methods which "do the right thing" to
9
+ # > convery any reasonable input value into a desired class.
10
+ # >
11
+ # > http://devblog.avdi.org/2012/05/07/a-ruby-conversion-idiom/
12
+ #
13
+ # Why conversion methods?
14
+ #
15
+ # Because software is all about addressing a mapping problem. In my experience
16
+ # it has also exposed a means for easing the movement across application design
17
+ # boundaries.
3
18
  module PowerConverter
4
- # Your code goes here...
19
+ # When you tried to find a named_converter and it did not exist, this is a
20
+ # reasonable exception to expect.
21
+ class ConverterNotFoundError < RuntimeError
22
+ # @param named_converter [#to_s]
23
+ # @param defined_converter_names [Array]
24
+ #
25
+ # @example
26
+ # raise ConverterNotFoundError.new(:boolean, [:hello, :world])
27
+ def initialize(named_converter, defined_converter_names)
28
+ super("Unable to find PowerConverter for #{named_converter} in #{defined_converter_names.inspect}")
29
+ end
30
+ end
31
+
32
+ module_function
33
+
34
+ # @api public
35
+ # @since 0.0.1
36
+ #
37
+ # Responsible for defining a conversion method and a "shovel-ready" conversion
38
+ # module; because maybe you want a mixin for convenience reasons.
39
+ #
40
+ # @param named_conversion [String,Symbol] the name of the conversion that you
41
+ # are declaring.
42
+ # @param converter [#call] the callable object that will perform the
43
+ # conversion.
44
+ # @yield [value] A block that will be used to convert the given value
45
+ # to the named thing.
46
+ # @yieldreturn returns the named thing.
47
+ #
48
+ # @return void
49
+ #
50
+ # @example
51
+ # PowerConverter.define_conversion_for :boolean do |input|
52
+ # case input
53
+ # when false, 0, '0', 'false', 'no', nil then false
54
+ # else
55
+ # true
56
+ # end
57
+ # end
58
+ # @see http://devblog.avdi.org/2012/05/07/a-ruby-conversion-idiom/ Avdi
59
+ # Grimm's post on "A Ruby Conversion Idiom"
60
+ #
61
+ # @see Kernel#Array for inspiration
62
+ #
63
+ # @note The conversion module/method that is created may not adhear to the
64
+ # exact idiom (a method defined in CamelCase)
65
+ #
66
+ # @todo Make sure that the converter requires at least one parameter.
67
+ def define_conversion_for(named_conversion, &converter)
68
+ @defined_conversions ||= {}
69
+ @defined_conversions[named_conversion.to_s] = converter
70
+ end
71
+
72
+ # @api public
73
+ # @since 0.0.1
74
+ #
75
+ # Convert the given `value` via the named `:to` converter.
76
+ #
77
+ # @param value [Object] the thing that you will be converting
78
+ # @param [Hash] options the options used to perform the conversion
79
+ # @option options [Symbol] :to the named_conversion that has been registered
80
+ #
81
+ # @raise [ConverterNotFoundError] if the named converter is not found
82
+ #
83
+ # @see PowerConverter.define_conversion_for
84
+ #
85
+ # @example
86
+ # PowerConverter.convert('true', to: :boolean)
87
+ #
88
+ # @todo I want to:
89
+ # * raise an exception if I'm unable to convert an object
90
+ # * auto-handle :to_<named_conversion> so I don't need to worry about
91
+ # registering that.
92
+ def convert(value, options = {})
93
+ converter_for(options.fetch(:to)).call(value)
94
+ end
95
+
96
+ # @api public
97
+ # @since 0.0.1
98
+ #
99
+ # The means for mixing in a private conversion method; Perhaps as policy you
100
+ # don't want to expose the public conversion method but instead prefer to
101
+ # leverage private methods.
102
+ #
103
+ # @param named_conversion [String,Symbol] the name of the conversion that you
104
+ # are requesting be wrapped in a conversion module.
105
+ #
106
+ # @return [Module] a conversion module to use for mixing in behavior
107
+ #
108
+ # @example
109
+ # class Foo
110
+ # attr_accessor :bar
111
+ # include PowerConverter.module_for(:boolean)
112
+ # def bar_as_boolean
113
+ # convert_to_boolean(@bar)
114
+ # end
115
+ # end
116
+ def module_for(named_conversion)
117
+ converter = converter_for(named_conversion)
118
+ Module.new do
119
+ define_method("convert_to_#{named_conversion}", &converter)
120
+ private "convert_to_#{named_conversion}"
121
+ end
122
+ end
123
+
124
+ # @api public
125
+ # @since 0.0.1
126
+ #
127
+ # Given the `named_conversion` find and retrieve the defined converter.
128
+ #
129
+ # @param named_conversion [String,Symbol]
130
+ #
131
+ # @return [#call] a registered converter
132
+ #
133
+ # @raise [ConverterNotFoundError] if the named converter is not found
134
+ #
135
+ # @see PowerConverter.define_conversion_for
136
+ #
137
+ # @example
138
+ # PowerConverter.converter_for(:boolean).call(value)
139
+ def converter_for(named_conversion)
140
+ @defined_conversions.fetch(named_conversion.to_s)
141
+ rescue KeyError
142
+ raise ConverterNotFoundError.new(named_conversion, defined_converter_names)
143
+ end
144
+
145
+ # @api public
146
+ # @since 0.0.1
147
+ #
148
+ # A convenience method for seeing the names of all converters that have been
149
+ # defined.
150
+ #
151
+ # @return [Array] of the registered converter's names
152
+ def defined_converter_names
153
+ @defined_conversions.keys
154
+ end
5
155
  end
@@ -1,3 +1,5 @@
1
+ # :nodoc:
1
2
  module PowerConverter
2
- VERSION = "0.0.1.pre"
3
+ # :nodoc:
4
+ VERSION = "0.0.1"
3
5
  end
@@ -8,16 +8,19 @@ Gem::Specification.new do |spec|
8
8
  spec.version = PowerConverter::VERSION
9
9
  spec.authors = ["Jeremy Friesen"]
10
10
  spec.email = ["jeremy.n.friesen@gmail.com"]
11
- spec.summary = %q{A template for generating and exposing conversion methods/modules.}
12
- spec.description = %q{A template for generating and exposing conversion methods/modules.}
11
+ spec.summary = %q{A lightweight library to define object conversion methods/modules.}
12
+ spec.description = %q{A lightweight library to define object conversion methods/modules.}
13
13
  spec.homepage = "https://github.com/jeremyf/power_converter"
14
14
  spec.license = "APACHE2"
15
15
 
16
- spec.files = `git ls-files -z`.split("\x0")
16
+ spec.files = `git ls-files -z -- lib/* bin/* LICENSE README.md CHANGELOG.md power_converter.gemspec`.split("\x0")
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.required_ruby_version = '~> 2.0'
21
22
  spec.add_development_dependency "bundler", "~> 1.7"
22
23
  spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "minitest", "~> 5.5"
25
+ spec.add_development_dependency "rubocop", "~> 0.2"
23
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: power_converter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.pre
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Friesen
@@ -38,18 +38,43 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
- description: A template for generating and exposing conversion methods/modules.
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.2'
69
+ description: A lightweight library to define object conversion methods/modules.
42
70
  email:
43
71
  - jeremy.n.friesen@gmail.com
44
72
  executables: []
45
73
  extensions: []
46
74
  extra_rdoc_files: []
47
75
  files:
48
- - ".gitignore"
49
- - Gemfile
50
76
  - LICENSE
51
77
  - README.md
52
- - Rakefile
53
78
  - lib/power_converter.rb
54
79
  - lib/power_converter/version.rb
55
80
  - power_converter.gemspec
@@ -63,18 +88,18 @@ require_paths:
63
88
  - lib
64
89
  required_ruby_version: !ruby/object:Gem::Requirement
65
90
  requirements:
66
- - - ">="
91
+ - - "~>"
67
92
  - !ruby/object:Gem::Version
68
- version: '0'
93
+ version: '2.0'
69
94
  required_rubygems_version: !ruby/object:Gem::Requirement
70
95
  requirements:
71
- - - ">"
96
+ - - ">="
72
97
  - !ruby/object:Gem::Version
73
- version: 1.3.1
98
+ version: '0'
74
99
  requirements: []
75
100
  rubyforge_project:
76
101
  rubygems_version: 2.4.3
77
102
  signing_key:
78
103
  specification_version: 4
79
- summary: A template for generating and exposing conversion methods/modules.
104
+ summary: A lightweight library to define object conversion methods/modules.
80
105
  test_files: []
data/.gitignore DELETED
@@ -1,14 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.bundle
11
- *.so
12
- *.o
13
- *.a
14
- mkmf.log
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in power_converter.gemspec
4
- gemspec
data/Rakefile DELETED
@@ -1,2 +0,0 @@
1
- require "bundler/gem_tasks"
2
-