smart_init 1.1.0 → 2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1446b96b76289a0090e6db9d241ecb6e7b5de6db
4
- data.tar.gz: 94a722499a830e6c2801672bab387f5398d99572
3
+ metadata.gz: b2c532785dd60c1023dcf402b5ae50bc61bdbb3d
4
+ data.tar.gz: f5df63f9c507164ac2d01065982a8b95743ff63e
5
5
  SHA512:
6
- metadata.gz: a7d717a769b6ef64d4f40a45de80641c5118f913707abcec203bb715bb455a05aba094984dcafeb08e4d36bfdb87b6274aa88a241f6265fb16ceb23c68a8adfc
7
- data.tar.gz: 63c1b848ab85ddcf6f3f8e3ad38258771a23e5c163f41530ffcf7378b45ae76b5ded98753d4fedee3a3c33157e31376b678a2083706fe71c207c6949f66c6158
6
+ metadata.gz: 158fcaf311d75218bfe9ce6c551c3c18708527c38fc134baabd992af737ec30f4059663abac00b32689c603025f33a03b362c300a50a2a1e683016f7951b8f67
7
+ data.tar.gz: ba253f3ecccd16e07ecca148fc05bf0a51616aed0821e05aaf67d51ef63cd453f9cae9fe76245ff59aeeb4b6b5178c24b3c6532666d03dcba97350403c2cc754
data/.gitignore CHANGED
@@ -3,3 +3,5 @@ Gemfile.lock
3
3
  pkg/
4
4
  *.gem
5
5
  coverage/
6
+ .byebug_history
7
+
data/.travis.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  rvm:
2
- - 2.2.0
2
+ - 2.2.5
3
3
  - 2.3.0
4
4
  - 2.3.1
5
5
  - 2.4.0
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Do you find yourself writing a lot of boilerplate code like that?
4
4
 
5
- ``` ruby
5
+ ```ruby
6
6
  def initialize(network_provider, api_token)
7
7
  @network_provider = network_provider
8
8
  @api_token = api_token
@@ -11,6 +11,8 @@ end
11
11
 
12
12
  Gem provides a simple DSL for getting rid of it. It offers an alternative to using `Struct.new` which does not check for number of parameters provided in initializer, exposes getters and instantiates unecessary class instances.
13
13
 
14
+ **Smart Init** offers a unified api for stateless service objects, accepting values in initializer and exposing one public class method `call` which instantiates new objects and accepts arguments passed to initializer.
15
+
14
16
  ## Installation
15
17
 
16
18
  In your Gemfile
@@ -19,7 +21,9 @@ In your Gemfile
19
21
  gem 'smart_init'
20
22
  ```
21
23
 
22
- Then you can use it either by extending a module:
24
+ ## Keyword arguments API
25
+
26
+ You can use it either by extending a module:
23
27
 
24
28
  ```ruby
25
29
  class ApiClient
@@ -42,7 +46,7 @@ end
42
46
  Now you can just:
43
47
 
44
48
  ```ruby
45
- object = ApiClient.new(Faraday.new, 'secret_token')
49
+ object = ApiClient.new(network_provider: Faraday.new, api_token: 'secret_token')
46
50
  # <ApiClient:0x007fa16684ec20 @network_provider=Faraday<...>, @api_token="secret_token">
47
51
  ```
48
52
 
@@ -60,8 +64,46 @@ class Calculator < SmartInit::Base
60
64
  end
61
65
  end
62
66
 
63
- Calculator.call(data) => data
67
+ Calculator.call(data: data) => result
68
+ ```
69
+
70
+ ### Default arguments
71
+
72
+ You can use keyword based, default argument values:
73
+
74
+ ```ruby
75
+ class Added < SmartInit::Base
76
+ initialize_with :num_a, num_b: 2
77
+ is_callable
78
+
79
+ def call
80
+ num_a + num_b
81
+ end
82
+ end
83
+
84
+ Adder.call(num_a: 2) => 4
85
+ Adder.call(num_a: 2, num_b: 3) => 5
86
+
64
87
  ```
65
88
 
66
- It provides a unified api for stateless service objects, accepting values in initializer and exposing one public method `call` which accepts no arguments.
89
+ ## Legacy API
90
+
91
+ Alternatively you can use standard API without keyword arguments:
92
+
93
+ ```ruby
94
+ class Calculator < SmartInit::Base
95
+ initialize_with :data
96
+ is_callable
97
+
98
+ def call
99
+ ...
100
+ result
101
+ end
102
+ end
103
+
104
+ Calculator.call(data) => result
105
+ ```
106
+
107
+ This API does not support default argument values though.
108
+
67
109
 
@@ -24,6 +24,43 @@ module SmartInit
24
24
  attr_reader *attributes
25
25
  end
26
26
  end
27
+
28
+ def initialize_with_keywords *attributes
29
+ class_variable_set(:@@_attributes, attributes)
30
+ @@_attributes = attributes
31
+
32
+ required_attrs = attributes.select { |attr| attr.is_a?(Symbol) }
33
+ default_value_attrs = attributes.select { |attr| attr.is_a?(Hash) }.first || {}
34
+
35
+ class_variable_set(:@@_required_attrs, required_attrs)
36
+ class_variable_set(:@@_default_value_attrs, default_value_attrs)
37
+ @@_required_attrs = required_attrs
38
+ @@_default_value_attrs = default_value_attrs
39
+
40
+ class_eval <<-METHOD
41
+ def initialize(#{(@@_required_attrs + @@_default_value_attrs.keys).compact.map { |a| @@_default_value_attrs[a] ? "#{a.to_s}: '#{@@_default_value_attrs.fetch(a)}'" : "#{a}:" }.join(', ')})
42
+ @@_required_attrs&.each do |attribute|
43
+ instance_variable_set(
44
+ "@"+ attribute.to_s,
45
+ eval(attribute.to_s)
46
+ )
47
+ end
48
+
49
+ @@_default_value_attrs&.keys.each do |attribute|
50
+ instance_variable_set(
51
+ "@"+ attribute.to_s,
52
+ eval(attribute.to_s)
53
+ )
54
+ end
55
+ end
56
+ METHOD
57
+
58
+ instance_eval do
59
+ private
60
+
61
+ attr_reader *(required_attrs + default_value_attrs&.keys)
62
+ end
63
+ end
27
64
  end
28
65
 
29
66
  class SmartInit::Base
@@ -1,3 +1,3 @@
1
1
  module SmartInit
2
- VERSION = "1.1.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -0,0 +1,46 @@
1
+ require "test/unit"
2
+ require "byebug"
3
+ require_relative '../lib/smart_init/main'
4
+
5
+ class TestKeywords
6
+ extend SmartInit
7
+ initialize_with_keywords :attribute_1, :attribute_2
8
+ is_callable
9
+
10
+ def call
11
+ [attribute_1, attribute_2]
12
+ end
13
+ end
14
+
15
+ class TestKeywordsDefaults
16
+ extend SmartInit
17
+ initialize_with_keywords :attribute_1, attribute_2: "default_value_2", attribute_3: "default_value_3"
18
+ is_callable
19
+
20
+ def call
21
+ [attribute_1, attribute_2, attribute_3]
22
+ end
23
+ end
24
+
25
+ class KeywordsApiTest < Test::Unit::TestCase
26
+ def test_keywords
27
+ assert_equal TestKeywords.call(attribute_1: "a", attribute_2: "b"), ["a", "b"]
28
+
29
+ assert_raise ArgumentError do
30
+ TestKeywords.new(
31
+ attribute_1: "a"
32
+ )
33
+ end
34
+ end
35
+
36
+ def test_keywords_defaults
37
+ assert_equal TestKeywordsDefaults.call(attribute_1: "a"), ["a", "default_value_2", "default_value_3"]
38
+ assert_equal TestKeywordsDefaults.call(attribute_1: "a", attribute_2: "b"), ["a", "b", "default_value_3"]
39
+ end
40
+
41
+ private
42
+
43
+ def test_object
44
+ @_test_object ||= TestClass.new("attr_1_value", "attr_2_value")
45
+ end
46
+ end
@@ -1,5 +1,6 @@
1
1
  require "test/unit"
2
- require 'smart_init'
2
+ require "byebug"
3
+ require_relative '../lib/smart_init/main'
3
4
 
4
5
  class TestClass
5
6
  extend SmartInit
@@ -20,7 +21,11 @@ class TestNoInit
20
21
  end
21
22
  end
22
23
 
23
- class SmartInitTest < Test::Unit::TestCase
24
+ def test_object
25
+ @_test_object ||= TestClass.new("attr_1_value", "attr_2_value")
26
+ end
27
+
28
+ class StandardApiTest < Test::Unit::TestCase
24
29
  def test_number_of_attributes
25
30
  assert_nothing_raised do
26
31
  TestClass.new(
@@ -55,12 +60,4 @@ class SmartInitTest < Test::Unit::TestCase
55
60
  def test_is_callable_no_initializers
56
61
  assert_equal TestNoInit.call, 'result'
57
62
  end
58
-
59
- private
60
-
61
- def test_object
62
- @_test_object ||= TestClass.new("attr_1_value", "attr_2_value")
63
- end
64
63
  end
65
-
66
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_init
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - pawurb
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-28 00:00:00.000000000 Z
11
+ date: 2018-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -55,7 +55,8 @@ files:
55
55
  - lib/smart_init/main.rb
56
56
  - lib/smart_init/version.rb
57
57
  - smart_init.gemspec
58
- - test/test_smart_init.rb
58
+ - test/test_keywords_api.rb
59
+ - test/test_standard_api.rb
59
60
  homepage: http://github.com/pawurb/smart_init
60
61
  licenses:
61
62
  - MIT
@@ -76,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
77
  version: '0'
77
78
  requirements: []
78
79
  rubyforge_project:
79
- rubygems_version: 2.6.8
80
+ rubygems_version: 2.6.14
80
81
  signing_key:
81
82
  specification_version: 4
82
83
  summary: Remove Ruby initializer boilerplate code