short_circu_it 0.6.3 → 0.6.4

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
  SHA256:
3
- metadata.gz: ca07490139f5e57b69e2d9403982ce9e144e813b8160ac2fd28b1abe0c886344
4
- data.tar.gz: ac9f15e7d6ab5ea72faa8af8f083152db6d2945cc0da42604696bc5a953a6d8b
3
+ metadata.gz: 8e7f261ac6aaee08daa2c0e9f9aff3e81d6a82dd19f71b8be5f5d6ff590b02cf
4
+ data.tar.gz: 0b0a0069e63dc99f7e471bdb6c53370a3fc1103b3212e0bdf58d0ff2a07ddcd8
5
5
  SHA512:
6
- metadata.gz: 504275f24bbaf3ad12c6e17bd958c777324366aa0ceea3b845d00873d6720ad5f8dbb6ee638fd33bf9ee8dd15827ab0cd8b87e7d9f2f1b7faa8bab3bf1d4cf29
7
- data.tar.gz: 29d0f3fabdf8b3b7ee67f6bd43154a97fca1609888b671d2ac56572c24e54427c8d6d82ab7ff88fcb38ecc30e258bb3fec5ea0b4793a50bcc9f3c067bdc96e48
6
+ metadata.gz: da812e637b60671e65164524f41103f2a96b850bede88267d870a6c28eef0c27067b6817af5773832100efcde5cc5548c394fb5589ae1773cc5a37bac78c0491
7
+ data.tar.gz: 88347985f0e8a7441f18fc675dfbbfd2846b26e964b2fe8ced22eb90f7b8152eecd4a4542783be9a6c6a13b01deae916a23926de037ba870543d57fc6880f0f3
data/README.md CHANGED
@@ -1,9 +1,20 @@
1
- # ShortCircuIt
1
+ # [ShortCircuIt](https://www.youtube.com/watch?v=XtP88AGsslo)
2
2
 
3
3
  [![Build Status](https://semaphoreci.com/api/v1/freshly/spicerack/branches/master/badge.svg)](https://semaphoreci.com/freshly/spicerack)
4
4
  [![Maintainability](https://api.codeclimate.com/v1/badges/7e089c2617c530a85b17/maintainability)](https://codeclimate.com/github/Freshly/spicerack/maintainability)
5
5
  [![Test Coverage](https://api.codeclimate.com/v1/badges/7e089c2617c530a85b17/test_coverage)](https://codeclimate.com/github/Freshly/spicerack/test_coverage)
6
6
 
7
+ * [Installation](#installation)
8
+ * [What's memoization?](#whats-memoization)
9
+ * [Usage](#usage)
10
+ * [Static methods](#static-methods)
11
+ * [Arguments](#arguments)
12
+ * [Instance State](#instance-state)
13
+ * [Observables](#observables)
14
+ * [Development](#development)
15
+ * [Contributing](#contributing)
16
+ * [License](#license)
17
+
7
18
  ## Installation
8
19
 
9
20
  Add this line to your application's Gemfile:
@@ -20,9 +31,114 @@ Or install it yourself as:
20
31
 
21
32
  $ gem install short_circu_it
22
33
 
34
+ ## What's memoization?
35
+
36
+ ShortCircuIt provides method memoization with awareness for arguments, instance state, weather, Oxford commas, or anything else you can think to throw at it.
37
+
38
+ Imagine you have this method in your code, for some reason:
39
+
40
+ ```ruby
41
+ def nth_digit_of_pi(n)
42
+ # MATH
43
+ end
44
+ ```
45
+
46
+ Now imagine you need to show the 1000th digit of pi in three places on a single webpage. Do you calculate it three times, or do you assign it to a variable once and use that variable three times? The latter is memoization; the former is... also an option.
47
+
23
48
  ## Usage
24
49
 
25
- TODO: Write usage instructions here
50
+ ### Static methods
51
+
52
+ In the simplest case, `ShortCircuIt` is no harder to forget than the method name itself:
53
+
54
+ ```ruby
55
+ class TheClassiest
56
+ include ShortCircuIt
57
+
58
+ def how_methodical
59
+ puts "Pity on my sysop!"
60
+ this_must_be_expensive
61
+ end
62
+ memoize :how_methodical
63
+ end
64
+
65
+ the_classiest = TheClassiest.new
66
+ 3.times.map { the_classiest.how_methodical }
67
+ # Pity on my sysop!
68
+ #=> [
69
+ # "One Billion Dollars",
70
+ # "One Billion Dollars",
71
+ # "One Billion Dollars"
72
+ # ]
73
+ ```
74
+
75
+ Even though the method gets called 3 times, the code only gets executed once.
76
+
77
+ ### Arguments
78
+
79
+ But what if your method takes arguments? We gotcha covered - memoization is specific to the arguments passed to the method, so a call with the same arguments will return the memoized value, while a call with different arguments will execute the method again.
80
+
81
+ ```ruby
82
+ the_classiest.how_methodical(1)
83
+ # Pity on my sysop!
84
+ #=> "One Billion Dollars"
85
+
86
+ the_classiest.how_methodical(1)
87
+ #=> "One Billion Dollars"
88
+
89
+ the_classiest.how_methodical(2)
90
+ # Pity on my sysop!
91
+ #=> "Two Billion Dollars"
92
+ ```
93
+
94
+ ### Instance State
95
+
96
+ Sometimes instances are stateful and mutable. By default, ShortCircuIt will watch an object's state via its `hash` value, so the memoization is broken when its attributes change:
97
+
98
+ ```ruby
99
+ the_classiest.how_methodical(1)
100
+ # Pity on my sysop!
101
+ #=> "One Billion Dollars"
102
+
103
+ the_classiest.how_methodical(1)
104
+ #=> "One Billion Dollars"
105
+
106
+ the_classiest.orders_of_magnitude = 8
107
+ the_classiest.how_methodical(1)
108
+ # Pity on my sysop!
109
+ #=> "One Hundred Million Dollars"
110
+ ```
111
+
112
+ ### Observables
113
+
114
+ Maybe I have a method I'd like memoize on a complex object with many unrelated attributes:
115
+
116
+ ```ruby
117
+ class TheAntist
118
+ attr_accessor :root_beer_floats_are_delicious, :physics, :weight_of_the_universe
119
+
120
+ def how_much_ants_can_carry
121
+ # SCIENCE
122
+ end
123
+ memoize :how_much_ants_can_carry, observes: :physics
124
+ # Can also be
125
+ memoize :how_much_ants_can_carry, observes: [:physics, :weight_of_the_universe]
126
+ end
127
+
128
+ antist = TheAntist.new
129
+ antist.how_much_ants_can_carry
130
+ # => .5 oz
131
+
132
+ # When we change an unobserved value, the memoiozation persists:
133
+ antist.root_beer_floats_are_delicious = true
134
+ antist.how_much_ants_can_carry
135
+ # => .5 oz
136
+
137
+ # But if we change the observed value, the memoization is broken:
138
+ antist.physics = :parallel_universe
139
+ antist.how_much_ants_can_carry
140
+ # => 100 lbs
141
+ ```
26
142
 
27
143
  ## Development
28
144
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ShortCircuIt
4
- VERSION = "0.6.3"
4
+ VERSION = "0.6.4"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: short_circu_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Allen Rettberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-29 00:00:00.000000000 Z
11
+ date: 2019-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.6.3
33
+ version: 0.6.4
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.6.3
40
+ version: 0.6.4
41
41
  description: Memoize methods safely with parameter and dependency observation
42
42
  email:
43
43
  - allen.rettberg@freshly.com