its-it 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f1f6a4b053ef34ba91f453a9ca02fb417c272ff809388495a7305ffa0df48d32
4
+ data.tar.gz: 494832c699a13a34401757bc915e62eaf94e3c147d29e8fe5517448b4696e8e2
5
+ SHA512:
6
+ metadata.gz: 3e40f49a07ecb80ea873b3bf78d415bd96b357f6e3c1f478f3f306adfda1b326c71a99fd07874fb34d2871a2a50309f43b4efe22c99de1e3ffb9126a751e6a18
7
+ data.tar.gz: 9d7889759739aa30597012fbb23aac386f404df0ed9f256f518fc9f3c2f8347c9964c8bcb152924e55911318b645a8ce6cfcb9def0e2767017f420bab1ab1c76
data/.rspec CHANGED
@@ -1 +1,2 @@
1
1
  --color
2
+ --format d
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.1.9
5
+ - 2.2.5
6
+ - 2.3.1
7
+
8
+ before_install: gem install bundler -v ">= 1.10.0" --conservative
@@ -0,0 +1,151 @@
1
+ # its-it
2
+
3
+
4
+ ## Overview
5
+
6
+ This gem defines kernel methods `its` and `it` that queue and defer method
7
+ calls. This is handy for list comprehension and case statements.
8
+
9
+ [![Gem Version](https://badge.fury.io/rb/its-it.png)](http://badge.fury.io/rb/its-it)
10
+ [![Build Status](https://secure.travis-ci.org/ronen/its-it.png)](http://travis-ci.org/ronen/its-it)
11
+ [![Dependency Status](https://gemnasium.com/ronen/its-it.png)](https://gemnasium.com/ronen/its-it)
12
+
13
+ ## List Comprehension
14
+
15
+ `its` and `it` extend the Symbol#to_proc idiom to support chaining multiple
16
+ methods.
17
+
18
+ When performing a list comprehension ruby, you can use a block argument:
19
+
20
+
21
+ ```ruby
22
+ users.map{ |user| user.contact }
23
+ ```
24
+
25
+ Or, to avoid needing the block and and extra parameter, you can use the `Symbol#to_proc` shortcut:
26
+
27
+ ```ruby
28
+ users.map &:contact
29
+ ```
30
+
31
+ But if you want to chain several methods, such as:
32
+
33
+ ```ruby
34
+ users.map{ |user| user.contact.last_name.capitalize }
35
+ ```
36
+
37
+ The `Symbol#to_proc` shortcut doesn't help much. At best, if you're willing to accept intermediate arrays, you can do:
38
+
39
+ ```ruby
40
+ users.map(&:contact).map(&:last_name).map(&:capitalize)
41
+ ```
42
+
43
+ To improve the situation, this gem provides a Kernel method `its`, which lets you get the same shortcut advantages as `Symbol#to_proc` but supports chaining:
44
+
45
+ ```ruby
46
+ users.map &its.contact.last_name.capitalize
47
+ ```
48
+
49
+ Also, `its` supports arguments and blocks, allowing you to do things like
50
+
51
+ ```ruby
52
+ users.map &its.contact.last_name[0,3].capitalize
53
+ users.select &its.contact.last_name.length > 10
54
+ users.select(&its.addresses.any? { |address| airline.flies_to address.city })
55
+ ```
56
+
57
+ As a syntactic sugar, `it` is an alias for `its`, to use with methods that describe actions rather than posessives. For example:
58
+
59
+ ```ruby
60
+ items.map &it.to_s.capitalize
61
+ ```
62
+
63
+ ### Hash comprehensions
64
+
65
+ When used with hash comprehensions, the `|key, val|` pair of arguments are presented to `its` as a tuple that can be accessed array-like via `[0]` or `[1]` and/or struct-like via `#key` and `#value` methods. E.g.
66
+
67
+ ```ruby
68
+ {dogs: 1, cats: 2, goats:3}.select &its.key =~ /^c/ # => {cats: 2}
69
+ {dogs: 1, cats: 2, goats:3}.select &its.value.even? # => {cats: 2}
70
+ {dogs: 1, cats: 2, goats:3}.select &its[1].even? # => {cats: 2}
71
+ ```
72
+
73
+ ## Case statements
74
+
75
+ `its` and `it` similarly extend Ruby's `case` mechanism to support testing
76
+ arbitrary methods, minimizing the need to create temporary variables. That is, instead of:
77
+
78
+ ```ruby
79
+ maxlen = arrays.map(&size).max
80
+ case
81
+ when maxlen > 10000 then "too big"
82
+ when maxlen < 10 then "too small"
83
+ else "okay"
84
+ end
85
+ ```
86
+
87
+ You can use `it`:
88
+
89
+ ```ruby
90
+ case arrays.map(&size).max
91
+ when it > 1000 then "too big"
92
+ when it < 10 then "too small"
93
+ else "okay"
94
+ end
95
+ ```
96
+
97
+ Of course method chanining can be used here too:
98
+
99
+ ```ruby
100
+ case users.first
101
+ when its.name == "Gimme Cookie" then ...
102
+ when its.name.length > 10 then ...
103
+ else ...
104
+ end
105
+ ```
106
+
107
+ ## Under the hood
108
+
109
+ The `it` method creates an instance of the `ItsIt::It` class, which uses `method_missing` to capture and queue up all
110
+ methods and their arguments except for `:to_proc` and `:===` (and
111
+ also excepting `:respond_to? :to_proc` and `:respond_to? :===`).
112
+
113
+ `:to_proc` returns a proc that will evaluate the method queue on a given
114
+ argument. `:===` takes an argument and evaluates that proc, returning the
115
+ result.
116
+
117
+ ## Installation
118
+
119
+ Install as usual from http://rubygems.org via
120
+
121
+ ```bash
122
+ $ gem install "its-it"
123
+ ```
124
+
125
+ or in a Gemfile
126
+
127
+ ```ruby
128
+ gem "its-it"
129
+ ```
130
+
131
+ ## Compatibility
132
+
133
+ Tested on MRI ruby 2.7.1
134
+
135
+ (MRI ruby 1.9.3, 2.1.9, 2.2.5, and 2.3.1 were supported up through version 1.3.0)
136
+
137
+ (MRI ruby 1.8.7 was supported up through version 1.1.1)
138
+
139
+ ## History
140
+
141
+ Release Notes
142
+
143
+ * 2.0.0 Switch to Ruby 2.7 keyword syntax. No other breaking changes.
144
+ * 1.3.0 Add `#key` and `#value` for Hash comprehensions; plus minor internal cleanup.
145
+ * 1.2.1 Don't leak all of ItsIt into main, just ItsIt::Kernel. Thanks to [klg](https://github.com/kjg)
146
+ * 1.2.0 Add support for Hash comprehensions; drop support for ruby 1.8.7
147
+ * 1.1.1 Remove dependency on BlankSlate
148
+
149
+ This gem is orignally based on Jay Philips'
150
+ [methodphitamine](https://github.com/jicksta/methodphitamine) gem. It has been made available on [rubygems.org](http://rubygems.org), and updated over the years.
151
+
data/Rakefile CHANGED
@@ -1,43 +1,20 @@
1
1
  require 'rubygems'
2
-
3
- begin
4
- require 'bundler'
5
- rescue LoadError
6
- $stderr.puts "You must install bundler - run `gem install bundler`"
7
- end
8
-
9
- begin
10
- Bundler.setup
11
- rescue Bundler::BundlerError => e
12
- $stderr.puts e.message
13
- $stderr.puts "Run `bundle install` to install missing gems"
14
- exit e.status_code
15
- end
16
- require 'rake'
17
-
18
- require 'bueller'
19
- Bueller::Tasks.new
2
+ require "bundler/gem_tasks"
20
3
 
21
4
  require 'rspec/core/rake_task'
22
5
  RSpec::Core::RakeTask.new(:spec) do |spec|
23
6
  spec.rspec_opts = '-Ispec'
24
7
  end
25
8
 
26
- RSpec::Core::RakeTask.new(:rcov) do |spec|
27
- spec.rspec_opts = '-Ispec'
28
- spec.rcov = true
29
- end
30
-
31
9
  task :default => :spec
32
10
 
33
- require 'rake/rdoctask'
11
+ require 'rdoc/task'
34
12
  Rake::RDocTask.new do |rdoc|
35
13
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
36
14
 
37
15
  rdoc.main = 'README.rdoc'
38
16
  rdoc.rdoc_dir = 'rdoc'
39
- rdoc.title = "its-it #{version}"
17
+ rdoc.title = "enumerable_hashify #{version}"
40
18
  rdoc.rdoc_files.include('README*')
41
19
  rdoc.rdoc_files.include('lib/**/*.rb')
42
20
  end
43
-
@@ -23,9 +23,9 @@ for ruby 1.9 and gemspec compatibility and adding the case statement functionali
23
23
  }
24
24
  s.extra_rdoc_files = [
25
25
  "LICENSE.txt",
26
- "README.rdoc"
27
26
  ]
28
27
 
28
+ s.required_ruby_version = '~> 2.7'
29
29
  s.required_rubygems_version = Gem::Requirement.new('>= 1.3.7')
30
30
  s.rubygems_version = '1.3.7'
31
31
  s.specification_version = 3
@@ -35,10 +35,10 @@ for ruby 1.9 and gemspec compatibility and adding the case statement functionali
35
35
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
36
36
  s.require_paths = ['lib']
37
37
 
38
- s.add_runtime_dependency 'blankslate'
39
- s.add_development_dependency 'rspec'
38
+ s.add_development_dependency 'rake'
39
+ s.add_development_dependency 'rdoc'
40
+ s.add_development_dependency 'rspec', "~> 3.0"
40
41
  s.add_development_dependency 'bundler'
41
- s.add_development_dependency 'bueller'
42
42
  s.add_development_dependency 'simplecov'
43
43
  s.add_development_dependency 'simplecov-gem-adapter'
44
44
 
@@ -4,5 +4,4 @@ require 'its-it/it'
4
4
  require 'its-it/kernel'
5
5
  require 'its-it/version'
6
6
 
7
- include ItsIt
8
7
  include ItsIt::Kernel
@@ -1,5 +1,3 @@
1
- require 'blankslate'
2
-
3
1
  # This module contains an It class which queues any methods called on it
4
2
  # and can be converted into a Proc. The Proc it generates executes the queued
5
3
  # methods in the order received on the argument passed to the block, allowing
@@ -8,38 +6,46 @@ require 'blankslate'
8
6
  # (1..10).select &it % 2 == 0
9
7
  #
10
8
  module ItsIt
11
-
9
+
12
10
  # The class instantiated by the <code>it</code> and <code>its</code> kernel methods.
13
- class It < BlankSlate
11
+ class It < BasicObject
12
+
13
+ instance_methods.map(&:to_s).each do |method|
14
+ undef_method method unless method.start_with? "__"
15
+ end
14
16
 
15
17
  def initialize #:nodoc:
16
- @methods = []
18
+ @queue = []
17
19
  end
18
20
 
19
- def method_missing(*args, &block)
20
- @methods << [args, block] unless args.first == :respond_to? and [:to_proc, :===].include?(args[1])
21
+ def method_missing(method, *args, **kw, &block)
22
+ @queue << [method, args, kw, block] unless method == :respond_to? and [:to_proc, :===].include?(args.first.to_sym)
21
23
  self
22
24
  end
23
-
25
+
26
+ module KeyValAccessors
27
+ def key
28
+ self[0]
29
+ end
30
+ def value
31
+ self[1]
32
+ end
33
+ end
34
+
24
35
  def to_proc
25
- lambda do |obj|
26
- @methods.inject(obj) do |current,(args,block)|
27
- current.send(*args, &block)
36
+ Kernel.send :proc do |*obj|
37
+ case obj.size
38
+ when 1 then obj = obj.shift # array comprehension, gets one arg
39
+ when 2 then obj.extend(KeyValAccessors) # hash comprehension, gets two args
28
40
  end
41
+ @queue.inject(obj) { |chain,(method, args, kw, block)| chain.send(method, *args, **kw, &block) }
29
42
  end
30
43
  end
31
44
 
32
45
  def ===(obj)
33
- to_proc.call(obj)
46
+ self.to_proc.call(obj)
34
47
  end
35
48
 
36
- # Used for testing. This method is hidden but can be revealed using
37
- # ItsIt::It.reveal(:method_queue)
38
- def method_queue
39
- @methods
40
- end
41
- hide(:method_queue)
42
-
43
49
  end
44
50
 
45
51
  end
@@ -1,3 +1,3 @@
1
1
  module ItsIt
2
- VERSION = "1.1.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -1,75 +1,91 @@
1
1
  require File.dirname(__FILE__) + "/spec_helper"
2
2
 
3
- describe "An It instance" do
4
-
5
- before :all do
6
- ItsIt::It.reveal(:method_queue)
7
- end
8
-
9
- before:each do
10
- @it = ItsIt::It.new
11
- end
12
-
13
- it "should queue a single simple method" do
14
- @it.foo
15
- queue = @it.method_queue
16
- queue.size.should == 1
17
- queue.first.size.should == 2
18
- queue.first.last.should be_nil # No block, ergo nil
19
- end
20
-
21
- it "should store arguments" do
22
- @it.bar(:qaz, :qwerty)
23
- @it.method_queue.first.should == [[:bar, :qaz, :qwerty], nil]
24
- end
25
-
26
- it "should store a block" do
27
- @it.map { }
28
- @it.method_queue.first.last.should be_kind_of(Proc)
29
- end
30
-
31
- it "should allow chaining blocks" do
32
- @it.map {}.inject {}.select {}.sexypants {}
33
- blocks = @it.method_queue.map { |x| x.last }
34
- blocks.size.should == 4
35
- blocks.each do |block|
36
- block.should be_kind_of(Proc)
37
- end
3
+ describe ItsIt::It do
4
+
5
+ TestString = "This is a test"
6
+
7
+ it "should start with identity via to_proc" do
8
+ expect(it.to_proc.call(TestString)).to eq(TestString)
9
+ end
10
+
11
+ it "should start with identity via ===" do
12
+ expect(it === TestString).to eq(TestString)
13
+ end
14
+
15
+ it "should work with a simple method via to_proc" do
16
+ expect((it.length).to_proc.call(TestString)).to eq(TestString.length)
17
+ end
18
+
19
+ it "should work with a simple method using ===" do
20
+ expect((it.length) === TestString).to eq(TestString.length)
21
+ end
22
+
23
+ it "should work with arguments" do
24
+ expect((it.sub(/test/, 'kumquat')).call(TestString)).to eq('This is a kumquat')
25
+ end
26
+
27
+ it "should work with keyword arguments" do
28
+ expect((it.lines(chomp:true)).call(TestString + "\n")).to eq([TestString])
29
+ end
30
+
31
+ it "should work with a block" do
32
+ expect((it.sub(/test/) {"balloon"}).to_proc.call(TestString)).to eq('This is a balloon')
38
33
  end
39
-
40
- it "should queue many methods in the right order" do
41
- @it.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z
42
- queue = @it.method_queue
43
- queue.size.should == 26
44
- queue.map { |x| x.first.first.to_s }.should == ('a'..'z').to_a
34
+
35
+ it "should chain methods" do
36
+ expect((it.reverse.swapcase.succ).to_proc.call(TestString)).to eq("TSET A SI SIHu")
45
37
  end
46
-
38
+
47
39
  it "should respond to to_proc()" do
48
- @it.should respond_to(:to_proc)
40
+ expect(it).to respond_to(:to_proc)
49
41
  end
50
42
 
51
43
  it "should respond to ===" do
52
- @it.should respond_to(:===)
44
+ expect(it).to respond_to(:===)
45
+ end
46
+
47
+ it "should work with numbers" do
48
+ expect((it < 1) === 0).to be_truthy
49
+ expect((it < 1) === 1).to be_falsey
50
+ expect((it < 1) === 2).to be_falsey
51
+ end
52
+
53
+ context "hash comprehension" do
54
+ it "presents `key` accessor" do
55
+ expect({a: 1, b:2}.select(&(it.key == :b))).to eq({b:2})
56
+ end
57
+
58
+ it "presents `value` accessor" do
59
+ expect({a: 1, b:2}.select(&(it.value == 2))).to eq({b:2})
60
+ end
61
+
62
+ it "presents as an array" do
63
+ expect({a: 1, b:2}.select(&(it[1] == 2))).to eq({b:2})
64
+ end
65
+
53
66
  end
54
67
 
68
+
55
69
  it "should work in a case statement" do
56
70
  [0,1,2].each do |i|
57
71
  case i
58
- when it < 1 then i.should == 0
59
- when it == 1 then i.should == 1
60
- else i.should == 2
72
+ when it < 1 then expect(i).to eq(0)
73
+ when it == 1 then expect(i).to eq(1)
74
+ else expect(i).to eq(2)
61
75
  end
62
76
  end
63
77
  end
64
-
78
+
65
79
  it "should not queue the method respond_to? when given :to_proc as an arg" do
66
- @it.respond_to? :to_proc
67
- @it.method_queue.should be_empty
80
+ expect(it.respond_to? :to_proc).to be_true
68
81
  end
69
82
 
70
83
  it "should not queue the method respond_to? when given :=== as an arg" do
71
- @it.respond_to? :to_proc
72
- @it.method_queue.should be_empty
84
+ expect(it.respond_to? :===).to be_true
85
+ end
86
+
87
+ it "should queue the method respond_to? when given generic arg" do
88
+ expect((it.respond_to? :size).to_proc.call(TestString)).to be_truthy
73
89
  end
74
-
90
+
75
91
  end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe Object do
4
+ it "doesn't get ItsIt's version" do
5
+ expect(defined?(::VERSION)).to be_nil
6
+ end
7
+
8
+ it "does't get the It class" do
9
+ expect(defined?(::It)).to be_nil
10
+ end
11
+ end
@@ -1,20 +1,18 @@
1
1
  require File.dirname(__FILE__) + "/spec_helper"
2
2
 
3
- describe "The ItsIt's RSpec compatibility" do
3
+ describe "RSpec compatibility" do
4
4
 
5
5
  # Surprisingly, RSpec's it() method isn't even defined within the context
6
6
  # of each expectation block. Man, that's some crazy voodoo.
7
7
 
8
8
  it "should make available the it and its methods" do
9
- should respond_to(:it)
10
- should respond_to(:its)
11
- method(:it).should == method(:its) # Ensure it's not RSpec's it() method
12
- lambda do
9
+ expect(method(:it)).to eq method(:its) # Ensure it's not RSpec's it() method
10
+ expect {
13
11
  it.should be_kind_of(ItsIt::It)
14
- end.should_not raise_error
12
+ }.to_not raise_error
15
13
  end
16
14
 
17
- it "should work with RSpec's assertion methods" do
18
- [1,2,3].each &it.should(be_kind_of(Fixnum))
15
+ it "should work with RSpec's old :should syntax" do
16
+ [1,2,3].each &it.should(be_kind_of(Integer))
19
17
  end
20
18
  end
@@ -14,5 +14,7 @@ require 'its-it'
14
14
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
15
15
 
16
16
  RSpec.configure do |config|
17
-
17
+ config.expect_with(:rspec) do |c|
18
+ c.syntax = [:expect, :should]
19
+ end
18
20
  end
metadata CHANGED
@@ -1,108 +1,123 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: its-it
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 1.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
6
5
  platform: ruby
7
- authors:
6
+ authors:
8
7
  - Ronen Barzel
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2011-04-26 00:00:00 -07:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: blankslate
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
11
+ date: 2011-04-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
21
17
  - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
24
- type: :runtime
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
25
21
  prerelease: false
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: rspec
29
- requirement: &id002 !ruby/object:Gem::Requirement
30
- none: false
31
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
32
24
  - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rdoc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
35
34
  type: :development
36
35
  prerelease: false
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: bundler
40
- requirement: &id003 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
43
38
  - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
46
48
  type: :development
47
49
  prerelease: false
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
50
- name: bueller
51
- requirement: &id004 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
54
59
  - - ">="
55
- - !ruby/object:Gem::Version
56
- version: "0"
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
57
62
  type: :development
58
63
  prerelease: false
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
61
70
  name: simplecov
62
- requirement: &id005 !ruby/object:Gem::Requirement
63
- none: false
64
- requirements:
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
65
73
  - - ">="
66
- - !ruby/object:Gem::Version
67
- version: "0"
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
68
76
  type: :development
69
77
  prerelease: false
70
- version_requirements: *id005
71
- - !ruby/object:Gem::Dependency
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
72
84
  name: simplecov-gem-adapter
73
- requirement: &id006 !ruby/object:Gem::Requirement
74
- none: false
75
- requirements:
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
76
87
  - - ">="
77
- - !ruby/object:Gem::Version
78
- version: "0"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
79
90
  type: :development
80
91
  prerelease: false
81
- version_requirements: *id006
82
- description: "\n\
83
- This gem defines the Kernel method \"it\" that queue and defer method calls.\n\
84
- This extends the Symbol#to_proc idiom to support chaining multiple methods.\n\
85
- For example, items.collect(&it.to_s.capitalize). This also allows\n\
86
- conditionals in case statements, such as: case ... when it > 3 then [etc.].\n\
87
- The method is also aliased as \"its\", for methods that describe possessives\n\
88
- rather than actions, such as items.collect(&its.name.capitalize)\n\n\
89
- [This gem is an extension of Jay Philips' \"methodphitamine\" gem, updated\n\
90
- for ruby 1.9 and gemspec compatibility and adding the case statement functionality.]\n"
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: |2
98
+
99
+ This gem defines the Kernel method "it" that queue and defer method calls.
100
+ This extends the Symbol#to_proc idiom to support chaining multiple methods.
101
+ For example, items.collect(&it.to_s.capitalize). This also allows
102
+ conditionals in case statements, such as: case ... when it > 3 then [etc.].
103
+ The method is also aliased as "its", for methods that describe possessives
104
+ rather than actions, such as items.collect(&its.name.capitalize)
105
+
106
+ [This gem is an extension of Jay Philips' "methodphitamine" gem, updated
107
+ for ruby 1.9 and gemspec compatibility and adding the case statement functionality.]
91
108
  email: ronen@barzel.org
92
109
  executables: []
93
-
94
110
  extensions: []
95
-
96
- extra_rdoc_files:
111
+ extra_rdoc_files:
97
112
  - LICENSE.txt
98
- - README.rdoc
99
- files:
100
- - .document
101
- - .gitignore
102
- - .rspec
113
+ files:
114
+ - ".document"
115
+ - ".gitignore"
116
+ - ".rspec"
117
+ - ".travis.yml"
103
118
  - Gemfile
104
119
  - LICENSE.txt
105
- - README.rdoc
120
+ - README.md
106
121
  - Rakefile
107
122
  - its-it.gemspec
108
123
  - lib/its-it.rb
@@ -110,40 +125,33 @@ files:
110
125
  - lib/its-it/kernel.rb
111
126
  - lib/its-it/version.rb
112
127
  - spec/it_spec.rb
128
+ - spec/main_spec.rb
113
129
  - spec/rspec_compatibility_spec.rb
114
130
  - spec/spec_helper.rb
115
- has_rdoc: true
116
131
  homepage: http://github.com/ronen/its-it
117
132
  licenses: []
118
-
119
- post_install_message:
133
+ metadata: {}
134
+ post_install_message:
120
135
  rdoc_options: []
121
-
122
- require_paths:
136
+ require_paths:
123
137
  - lib
124
- required_ruby_version: !ruby/object:Gem::Requirement
125
- none: false
126
- requirements:
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '2.7'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
127
145
  - - ">="
128
- - !ruby/object:Gem::Version
129
- hash: -664830529632804485
130
- segments:
131
- - 0
132
- version: "0"
133
- required_rubygems_version: !ruby/object:Gem::Requirement
134
- none: false
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
146
+ - !ruby/object:Gem::Version
138
147
  version: 1.3.7
139
148
  requirements: []
140
-
141
- rubyforge_project:
142
- rubygems_version: 1.6.2
143
- signing_key:
149
+ rubygems_version: 3.1.2
150
+ signing_key:
144
151
  specification_version: 3
145
152
  summary: Defines its() and it() method-chain proxies.
146
- test_files:
153
+ test_files:
147
154
  - spec/it_spec.rb
155
+ - spec/main_spec.rb
148
156
  - spec/rspec_compatibility_spec.rb
149
157
  - spec/spec_helper.rb
@@ -1,107 +0,0 @@
1
- = its-it
2
-
3
- == Overview
4
-
5
- This gem defines kernel methods <code>its</code> and <code>it</code> that
6
- queue and defer method calls. This is handy for list enumeration and case
7
- statements.
8
-
9
- == List Enumeration
10
-
11
- <code>its</code> and <code>it</code> extend the Symbol#to_proc idiom to
12
- support chaining multiple methods.
13
-
14
- The pure Ruby way to chain methods when enumerating a list would be:
15
-
16
- users.collect{|user| user.contact}.collect{|contact| contact.last_name}.collect{|name| name.capitalize}
17
-
18
- Using <code>Symbol#to_proc</code>, this becomes simpler:
19
-
20
- users.collect(&:contact).collect(&:last_name).collect(&:capitalize)
21
-
22
- And using <code>its</code>, this becomes becomes simpler still:
23
-
24
- users.collect(&its.contact.last_name.capitalize)
25
-
26
- Note that <code>its</code> captures arguments and blocks, allowing constructs like this,
27
- which will select users whose names include any non-hyphenated word that's more than 10
28
- letters long:
29
- users.select(&its.name.split(/ /).reject{|word| word =~ /-/}.collect(&:length).max > 10)
30
-
31
- <code>it</code> is an alias for <code>its</code>, to use with methods that
32
- describe actions rather than posessives. For example:
33
-
34
- items.collect(&it.to_s.capitalize)
35
-
36
- == Case statements
37
-
38
- <code>its</code> and <code>it</code> likewise extend Ruby's
39
- <code>code</code> statement to support testing arbitrary methods,
40
- minimizing the need to create temporary variables and use
41
- <code>if-elsif</code> constructs.
42
-
43
- In pure Ruby, doing comparisons on computed values would be done something
44
- like this:
45
-
46
- maxlen = arrays.collect(&size).max
47
- if maxlen > 10000
48
- "too big"
49
- elsif maxlen < 10
50
- "too small"
51
- else
52
- "okay"
53
- end
54
-
55
- But using <code>it</code> this becomes:
56
-
57
- case arrays.collect(&size).max
58
- when it > 1000
59
- "too big"
60
- when it < 10
61
- "too small"
62
- else
63
- "okay"
64
- end
65
-
66
- Of course method chanining can be used here too:
67
-
68
- case users.first
69
- when its.name == "Gimme Cookie" then ...
70
- when its.name.length > 10 then ...
71
- else ...
72
- end
73
-
74
- == Under the hood
75
-
76
- The <code>ItsIt::It</code> class starts from <code>BlankSlate</code>, and
77
- uses <code>method_missing</code> to capture and queue up all methods and
78
- their arguments, with the exception of <code>:to_proc</code> and <code>:===</code>
79
- (and also excepting <code>:respond_to? :to_proc</code> and
80
- <code>:respond_to? :===</code>).
81
-
82
- <code>:to_proc</code> returns a proc that will evaluate the method queue on
83
- a given argument. <code>:===</code> takes an argument and evaluates that
84
- proc, returning the result.
85
-
86
- == Installation
87
-
88
- Install from http://rubygems.org via
89
-
90
- $ gem install "its-it"
91
-
92
- or in a Gemfile
93
-
94
- gem "its-it"
95
-
96
- == Compatibility
97
-
98
- Tested with <b>ruby 1.8.7</b> and <b>ruby 1.9.2</b>
99
-
100
- == History
101
-
102
- This gem is orignally based on Jay Philips'
103
- methodphitamine[https://github.com/jicksta/methodphitamine] gem. It has
104
- been updated to be compatible with ruby 1.9.2 and gemspec, renamed its-it,
105
- and installed on rubygems.org[http://rubygems.org]. Unlike
106
- methodphitamine, this gem includes only <code>its</code> and
107
- <code>it</code>, not the "maybe" monad.