necklace 0.0.0 → 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: c437405b1a9c7a7e6469a0ddadc9d55f83d71bed
4
- data.tar.gz: 31c0a4d2e599bc23a39030b48797c1b782feb75c
3
+ metadata.gz: 55f8bb4fe12f5436ceed69e294e00383353c72e4
4
+ data.tar.gz: 30c503d917f93039cbd2cfdefed3209c10163811
5
5
  SHA512:
6
- metadata.gz: 1a67b9d08b3004ad8c794a0525c127df0568ecc3a1b010fb5d7dbba0df2c939f34ff23b216aec5ad8ce9b0086cd1fb2d6989c395e8830c88a3140963b65532da
7
- data.tar.gz: e5e6d5830ff89a15ff0e4f9ff12326d3cca74491a51a1020bd389c9ab1cf6866ce091b5be979d29717700d61400b9313773b00f1511731300b5b584a70dc1331
6
+ metadata.gz: cb43fb6ab10775f0003e57910859615fa7d7e62b1075ac39f939b63d88cfcc75b7608197cc02dbe3291e2da57bc21d5a1f6e142cdcbe37e4d9bb72bc1e8b9e15
7
+ data.tar.gz: d38e77087e6ead1b1257cd0579e8f0dc8666ee73afdd4fd36f7a2ddff2210917dce1ac35c17b35ccd751417a26798059de2c700f86b924c2c06db3ff87a6999c
data/.gitignore ADDED
@@ -0,0 +1,35 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /vendor/bundle
26
+ /lib/bundler/man/
27
+
28
+ # for a library or gem, you might want to ignore these files since the code is
29
+ # intended to run in multiple environments; otherwise, check them in:
30
+ # Gemfile.lock
31
+ # .ruby-version
32
+ # .ruby-gemset
33
+
34
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
35
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ ruby '2.1.5'
4
+
5
+ # Specify your gem's dependencies in synxis.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,47 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ necklace (0.0.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ coderay (1.1.0)
10
+ diff-lcs (1.2.5)
11
+ docile (1.1.5)
12
+ method_source (0.8.2)
13
+ multi_json (1.11.0)
14
+ pry (0.10.1)
15
+ coderay (~> 1.1.0)
16
+ method_source (~> 0.8.1)
17
+ slop (~> 3.4)
18
+ rake (10.4.2)
19
+ rspec (3.2.0)
20
+ rspec-core (~> 3.2.0)
21
+ rspec-expectations (~> 3.2.0)
22
+ rspec-mocks (~> 3.2.0)
23
+ rspec-core (3.2.2)
24
+ rspec-support (~> 3.2.0)
25
+ rspec-expectations (3.2.0)
26
+ diff-lcs (>= 1.2.0, < 2.0)
27
+ rspec-support (~> 3.2.0)
28
+ rspec-mocks (3.2.1)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.2.0)
31
+ rspec-support (3.2.2)
32
+ simplecov (0.9.2)
33
+ docile (~> 1.1.0)
34
+ multi_json (~> 1.0)
35
+ simplecov-html (~> 0.9.0)
36
+ simplecov-html (0.9.0)
37
+ slop (3.6.0)
38
+
39
+ PLATFORMS
40
+ ruby
41
+
42
+ DEPENDENCIES
43
+ necklace!
44
+ pry
45
+ rake
46
+ rspec
47
+ simplecov
data/README.md ADDED
@@ -0,0 +1,121 @@
1
+ # Necklace
2
+
3
+ ## What/Why
4
+
5
+ Ports the `->` macro from Clojure to make long chains of Enumerable more
6
+ readable
7
+
8
+ Usually when chaining method calls in ruby, the names of the methods are
9
+ descriptive and the chain is readable. (Note that this may violate the Law of
10
+ Demeter, but this is simply an example). One can imagine something like
11
+
12
+ ```ruby
13
+ food_processor.add(vinegar)
14
+ .add(garlic)
15
+ .add(pepper)
16
+ .start
17
+ .drizzle(oil)
18
+ ```
19
+
20
+ Where each method returns `self` and the chain describes the actions.
21
+
22
+ However, with Enumerable, because the methods are more abstract, readability is
23
+ often sacrificed when chaining operations:
24
+
25
+ ```ruby
26
+ [1, 3, 5, 7, 9].map do |n|
27
+ n + 1
28
+ end.map do |n|
29
+ n * 2
30
+ end.map |n|
31
+ n - 3
32
+ end.select |n|
33
+ n.even?
34
+ end
35
+ ```
36
+
37
+ Two possible solutions are to name only the inner methods:
38
+
39
+ ```ruby
40
+ [1, 3, 5, 7, 9].map do |n|
41
+ increment(n)
42
+ end.map do |n|
43
+ double(n)
44
+ end.map |n|
45
+ subtract(n, 3)
46
+ end.select |n|
47
+ n.even?
48
+ end
49
+ ```
50
+
51
+ or extract each transformation in a method and call them inside-out -
52
+ lisp-style:
53
+
54
+ ```ruby
55
+ even(
56
+ subtract_three(
57
+ double(
58
+ incrememnt([1, 3, 5, 7, 9])
59
+ )
60
+ )
61
+ )
62
+ ```
63
+
64
+ This last looks a lot like a lisp, and Clojure has a macro to make calls like
65
+ this easier to read:
66
+
67
+ ```clojure
68
+ (-> [1, 3, 5, 7, 9]
69
+ increment
70
+ double
71
+ subtract_three
72
+ even
73
+ )
74
+ ```
75
+
76
+ **Necklace** attempts to replicate at least some aspects of the Clojure
77
+ threading macros (`->`, `->>`) in ruby so that long chains of enumerable
78
+ transformations can be called without sacrificing readablility.
79
+
80
+ ## Usage
81
+
82
+ simply `include Necklace` in a class
83
+
84
+ Then define methods that take each successive result as their argument.
85
+
86
+ Then call `through` with the enumerable as the first argument and an array of
87
+ symbols corresponding to the method names as the second argument.
88
+
89
+ ```ruby
90
+ through([1, 3, 5, 7, 9],
91
+ [:increment,
92
+ :double,
93
+ :subtract_three,
94
+ :even
95
+ ]
96
+ )
97
+ ```
98
+
99
+ ## License
100
+ ### MIT
101
+
102
+ ```
103
+ Copyright (c) 2015 Stuart Terrett
104
+
105
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
106
+ this software and associated documentation files (the "Software"), to deal in
107
+ the Software without restriction, including without limitation the rights to
108
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
109
+ the Software, and to permit persons to whom the Software is furnished to do so,
110
+ subject to the following conditions:
111
+
112
+ The above copyright notice and this permission notice shall be included in all
113
+ copies or substantial portions of the Software.
114
+
115
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
116
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
117
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
118
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
119
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
120
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
121
+ ```
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ desc 'Default: run specs.'
6
+ task :default => :spec
7
+
8
+ desc 'Run specs'
9
+ RSpec::Core::RakeTask.new(:spec)
10
+
11
+ desc 'Generate code coverage'
12
+ RSpec::Core::RakeTask.new(:coverage)
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/lib/necklace.rb CHANGED
@@ -1,3 +1,7 @@
1
1
  module Necklace
2
-
2
+ def through(enumerable, methods)
3
+ methods.reduce(enumerable) do |result, method|
4
+ send(method, result)
5
+ end
6
+ end
3
7
  end
data/necklace.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'necklace'
3
+ s.version = '0.0.1'
4
+ s.date = '2010-04-28'
5
+ s.summary = "Clojures -> macro for ruby"
6
+ s.description = "Implements Clojures threading macros for Ruby Enumerable methods"
7
+ s.authors = ["Stuart Terrett"]
8
+ s.email = 'shterrett@gmail.com'
9
+ s.files = ["lib/necklace.rb"]
10
+ s.homepage = 'http://github.com/shterrett/necklace'
11
+ s.license = 'MIT'
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
16
+ s.require_paths = ['lib']
17
+
18
+ s.add_development_dependency('rake')
19
+ s.add_development_dependency('rspec')
20
+ s.add_development_dependency('simplecov')
21
+ s.add_development_dependency('pry')
22
+ end
@@ -0,0 +1,18 @@
1
+ require 'simplecov'
2
+
3
+ SimpleCov.start do
4
+ add_filter 'spec/'
5
+ end
6
+
7
+ # encoding: utf-8
8
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
9
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
10
+
11
+ Dir['./spec/shared/**/*.rb'].sort.each { |f| require f }
12
+ require_relative '../lib/necklace'
13
+
14
+ require 'rspec'
15
+
16
+ RSpec.configure do |config|
17
+ config.order = 'random'
18
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Threading enumerable as argument' do
4
+ it 'passes the given enumerable to the function named by the symbol in an array' do
5
+ class Test
6
+ include Necklace
7
+
8
+ def increment(numbers)
9
+ numbers.map { |n| n + 1 }
10
+ end
11
+
12
+ def test_increment
13
+ through([1, 3, 5, 7, 9],
14
+ [:increment]
15
+ )
16
+ end
17
+ end
18
+
19
+ test = Test.new
20
+ expect(test.test_increment).to eq([2, 4, 6, 8, 10])
21
+ end
22
+
23
+ it 'passes the result of each method to the next from top to bottom' do
24
+ class Test
25
+ include Necklace
26
+
27
+ def increment(numbers)
28
+ numbers.map { |n| n + 1 }
29
+ end
30
+
31
+ def double(numbers)
32
+ numbers.map { |n| n * 2 }
33
+ end
34
+
35
+ def test_increment_double
36
+ through([1, 3, 5, 7 , 9],
37
+ [:increment,
38
+ :double
39
+ ]
40
+ )
41
+ end
42
+
43
+ def test_double_increment
44
+ through([1, 3, 5, 7, 9],
45
+ [:double,
46
+ :increment
47
+ ]
48
+ )
49
+ end
50
+ end
51
+
52
+ test = Test.new
53
+
54
+ expect(test.test_increment_double).to eq([4, 8, 12, 16, 20])
55
+ expect(test.test_double_increment).to eq([3, 7, 11, 15, 19])
56
+ end
57
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: necklace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stuart Terrett
@@ -9,14 +9,79 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2010-04-28 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
13
69
  description: Implements Clojures threading macros for Ruby Enumerable methods
14
70
  email: shterrett@gmail.com
15
71
  executables: []
16
72
  extensions: []
17
73
  extra_rdoc_files: []
18
74
  files:
75
+ - ".gitignore"
76
+ - Gemfile
77
+ - Gemfile.lock
78
+ - README.md
79
+ - Rakefile
80
+ - VERSION
19
81
  - lib/necklace.rb
82
+ - necklace.gemspec
83
+ - spec/spec_helper.rb
84
+ - spec/threading_arguments_spec.rb
20
85
  homepage: http://github.com/shterrett/necklace
21
86
  licenses:
22
87
  - MIT
@@ -41,4 +106,6 @@ rubygems_version: 2.2.2
41
106
  signing_key:
42
107
  specification_version: 4
43
108
  summary: Clojures -> macro for ruby
44
- test_files: []
109
+ test_files:
110
+ - spec/spec_helper.rb
111
+ - spec/threading_arguments_spec.rb