inactive_support 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 68dfe17ac231e2265d7fbce57336eec8e8722ae9
4
+ data.tar.gz: cc5a0e382e812d8420adf6a531f28ee973f3501f
5
+ SHA512:
6
+ metadata.gz: bb4bb36a96a270068643645fe0018019bf3f343043a895a080c7e8527e567e22e7c15381f73760e7d1f57df8f29904690d2deef74cd5bd8471448b2ea2995df7
7
+ data.tar.gz: 4cb0dcbce228f3115c735a2ce38e21094191919f497b3e77748a1bda0885fa7a088b5376fe2194cd15515224dc29b3fead696d137eed4af62e51602c1e833916
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  source 'https://rubygems.org'
2
3
 
3
4
  # Specify your gem's dependencies in inactive_support.gemspec
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # InactiveSupport
2
2
 
3
- A collection of utilities for ruby projects.
3
+ A collection of useful extensions for the Ruby programming language.
4
4
 
5
5
  ## Installation
6
6
 
@@ -16,41 +16,129 @@ Or install it yourself as:
16
16
 
17
17
  $ gem install inactive_support
18
18
 
19
- ## Usage
19
+ ## Extensions
20
20
 
21
- ### Object
22
- #### #identity
21
+ #### Object
22
+
23
+ ##### #blank?
24
+ Returns true if the object is blank:
25
+
26
+ ```ruby
27
+ [].blank?
28
+ # => true
29
+
30
+ {}.blank?
31
+ # => true
32
+
33
+ ''.blank?
34
+ # => true
35
+
36
+ ' '.blank?
37
+ # => true
38
+
39
+ "\n\t".blank?
40
+ # => true
41
+
42
+ 'A man'.blank?
43
+ # => false
44
+ ""
45
+ ```
46
+
47
+ ##### #identity
23
48
  returns self
24
49
 
25
- [1,2,3,3,4,5,5].group_by(&:identity)
26
- # => [[1], [2], [3,3], [4], [5,5]]
50
+ ```ruby
51
+ [1, 2, 3, 3, 4, 5, 5].group_by(&:identity)
52
+ # => [[1], [2], [3, 3], [4], [5, 5]]
53
+ ```
27
54
 
28
- #### #try
55
+ ##### #try
29
56
  send a message to the receiver and if it doesn't respond to the message, return nil
30
57
 
31
- "".try(:some_method)
32
- # => nil
58
+ ```ruby
59
+ 'A string'.some_method
60
+ # => NoMethodError: undefined method `some_method' for "A string":String
61
+
62
+ 'A string'.try(:some_method)
63
+ # => nil
64
+ ```
33
65
 
34
- #### #ctry
66
+ ##### #ctry
35
67
  chained try, for methods with no arguments
36
68
 
37
- "Somestring".ctry(:mb_chars, :downcase, :some_method)
38
- # => nil
69
+ ```ruby
70
+ "Somestring".ctry(:mb_chars, :downcase, :some_method)
71
+ # => nil
72
+ ```
73
+
74
+ ##### #deep_dup
75
+ Object#dup has a hidden pitfall:
76
+
77
+ ```ruby
78
+ person = { name: { first: 'Gavin' } }
79
+ dupl = person.dup
39
80
 
40
- ### Hash
41
- #### #delete_blank
81
+ #this also changes person when it shouldn't
82
+ dupl[:name][:first] = 'Dazen'
83
+
84
+ person
85
+ # => {:name=>{:first=>"Dazen"}}
86
+ ```
87
+
88
+ Object#deep_dup fixes this behavior:
89
+
90
+ ```ruby
91
+ person = { name: { first: 'Gavin' } }
92
+ dupl = person.deep_dup
93
+
94
+ #this also changes person when it shouldn't
95
+ dupl[:name][:first] = 'Dazen'
96
+
97
+ person
98
+ # => {:name=>{:first=>"Gavin"}}
99
+ ```
100
+
101
+ #### Hash
102
+ ##### #delete_blank
42
103
  Deletes all key/value pairs where the value is an empty string/array/hash or nil.
43
104
 
44
- { name: nil, age: 19, address: "" }.delete_blank
45
- # => { age: 19 }
105
+ ```ruby
106
+ { name: nil, age: 19, address: "" }.delete_blank
107
+ # => { age: 19 }
108
+ ```
109
+
110
+ ##### #deep_delete_blank
111
+ Recursively deletes all key/value pairs where the value is an empty string/array/hash or nil.
112
+
113
+ ```ruby
114
+ { name: nil, age: 19, address: { street_name: 'Vitosha', street_number: nil }, }.deep_delete_blank
115
+ # => { age: 19, address: { street_name: 'Vitosha' } }
116
+ ```
117
+
118
+ #### Enumerable
119
+ ##### #consecutive_by
120
+ Groups objects by an attribute that is consecutive
121
+
122
+ ```ruby
123
+ [1, 2, 3, 5, 6, 8, 9].consecutive_by(&:identity)
124
+ # => [[1, 2, 3], [5, 6], [8, 9]]
125
+ ```
126
+
127
+ ##### #consecutive?
128
+ Returns true if the objects are consecutive
46
129
 
47
- ### Enumerable
48
- #### #consecutive_by
49
- groups objects by an attribute that is consecutive
130
+ ```ruby
131
+ [1, 2, 3, 5, 6, 8, 9].consecutive?
132
+ # => false
133
+ ```
50
134
 
51
- [1,2,3,5,6,8,9].consecutive_by(&:identity)
52
- # => [[1,2,3],[5,6],[8,9]]
135
+ ##### #sorted?
136
+ Returns true if the collection is sorted
53
137
 
138
+ ```ruby
139
+ [1, 2, 3, 3, 5, 6, 8, 9].sorted?
140
+ # => true
141
+ ```
54
142
 
55
143
  ## Contributing
56
144
 
data/Rakefile CHANGED
@@ -1 +1,19 @@
1
- require "bundler/gem_tasks"
1
+ # encoding: utf-8
2
+ require 'bundler/gem_tasks'
3
+ require 'rake'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ task.rspec_opts = ['--color']
8
+ end
9
+
10
+ task default: :spec
11
+ task test: :spec
12
+
13
+ task :console do
14
+ require 'irb'
15
+ require 'irb/completion'
16
+ require 'inactive_support'
17
+ ARGV.clear
18
+ IRB.start
19
+ end
@@ -4,21 +4,21 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'inactive_support/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "inactive_support"
7
+ spec.name = 'inactive_support'
8
8
  spec.version = InactiveSupport::VERSION
9
- spec.authors = ["gmitrev"]
10
- spec.email = ["gvmitrev@gmail.com"]
11
- spec.description = %q{A collection of utilities and extensions}
12
- spec.summary = %q{Snippets and useful stuff extracted from my projects}
13
- spec.homepage = ""
14
- spec.license = "MIT"
9
+ spec.authors = ['gmitrev']
10
+ spec.email = ['gvmitrev@gmail.com']
11
+ spec.description = 'A collection of utilities and extensions'
12
+ spec.summary = 'Snippets and useful stuff extracted from my projects'
13
+ spec.homepage = 'https://github.com/gmitrev/inactive_support'
14
+ spec.license = 'MIT'
15
15
 
16
- spec.files = `git ls-files`.split($/)
16
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
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
- spec.require_paths = ["lib"]
19
+ spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.3"
22
- spec.add_development_dependency "rake"
23
- spec.add_development_dependency "rspec", "~> 2.6"
21
+ spec.add_development_dependency 'bundler', '~> 1.10'
22
+ spec.add_development_dependency 'rake'
23
+ spec.add_development_dependency 'rspec', '~> 3.3'
24
24
  end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ class Array
4
+ # Returns the tail of the array
5
+ def butfirst
6
+ if empty?
7
+ []
8
+ else
9
+ self[1..-1]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ class Array
4
+ # Returns all elements excluding the last one
5
+ def butlast
6
+ if empty?
7
+ []
8
+ else
9
+ self[0...-1]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ require 'inactive_support/array/butfirst'
3
+ require 'inactive_support/array/butlast'
@@ -32,6 +32,7 @@ module Enumerable
32
32
  end
33
33
 
34
34
  private
35
+
35
36
  def _ordinal(string)
36
37
  string.to_s.gsub(/[a-zA-Z]/) { |c| c.ord }.to_i
37
38
  end
@@ -1 +1,2 @@
1
+ # encoding: utf-8
1
2
  require 'inactive_support/enumerable/consecutive_by'
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+ class Hash
3
+ # Recursively deletes all key/value pairs where the value is empty string/array/hash or nil.
4
+ def deep_delete_blank
5
+ delete_if do |_, v|
6
+ (v.blank? && v != false) || v.instance_of?(Hash) && v.deep_delete_blank.empty?
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  class Hash
2
3
  # Deletes all key/value pairs where the value is empty string/array/hash or nil.
3
4
  def delete_blank
@@ -5,11 +6,4 @@ class Hash
5
6
  (v.blank? && v != false)
6
7
  end
7
8
  end
8
-
9
- # Recursively deletes all key/value pairs where the value is empty string/array/hash or nil.
10
- def deep_delete_blank
11
- delete_if do |_, v|
12
- (v.blank? && v != false) || v.instance_of?(Hash) && v.deep_delete_blank.empty?
13
- end
14
- end
15
9
  end
@@ -1 +1,2 @@
1
+ # encoding: utf-8
1
2
  require 'inactive_support/hash/delete_blank'
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  # A more precise rounding. ~4 times slower than simple round
2
3
  #
3
4
  # 3.904605.round(2)
@@ -1 +1,2 @@
1
+ # encoding: utf-8
1
2
  require 'inactive_support/numeric/precision'
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  class Object
2
3
  def blank?
3
4
  respond_to?(:empty?) ? !!empty? : !self
@@ -7,3 +8,9 @@ class Object
7
8
  !blank?
8
9
  end
9
10
  end
11
+
12
+ class String
13
+ def blank?
14
+ strip.empty?
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+ class Object
3
+ # Object#dup is shallow and therefore useless:
4
+ #
5
+ # a = { name: { first: 'Georgi' } }
6
+ # dupl = a.dup
7
+ #
8
+ # #this also changes a when it shouldn't
9
+ # dupl[:name][:first] = 'Dazen'
10
+ #
11
+ # a
12
+ # => :name=>{:first=>"Dazen"}}
13
+ #
14
+ # deep_dup fixes this behavior
15
+ def deep_dup
16
+ Marshal.load(Marshal.dump(self))
17
+ end
18
+ end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  class Object
2
3
  # Returns self. If given a block, it works a lot like Object#tap
3
4
  #
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  class Object
2
3
  # Credit goes to the active_support contributors
3
4
  # https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/try.rb
@@ -33,11 +34,11 @@ class Object
33
34
  end
34
35
 
35
36
  class NilClass
36
- def try(*args)
37
+ def try(*_args)
37
38
  nil
38
39
  end
39
40
 
40
- def ctry(*args)
41
+ def ctry(*_args)
41
42
  nil
42
43
  end
43
44
  end
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
1
2
  require 'inactive_support/object/blank'
3
+ require 'inactive_support/object/deep_dup'
2
4
  require 'inactive_support/object/identity'
3
5
  require 'inactive_support/object/try'
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  module InactiveSupport
2
- VERSION = "1.1.0"
3
+ VERSION = '1.2.0'
3
4
  end
@@ -1,4 +1,5 @@
1
- require "inactive_support/version"
1
+ # encoding: utf-8
2
+ require 'inactive_support/version'
2
3
 
3
4
  module InactiveSupport
4
5
  end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'inactive_support/array'
4
+
5
+ describe Array do
6
+
7
+ describe '#butfirst' do
8
+ it 'returns all elements excluding the first one' do
9
+ expect([].butfirst).to eq []
10
+ expect([1].butfirst).to eq []
11
+ expect([1, 2, 3].butfirst).to eq [2, 3]
12
+ expect([1, 2, 3, 4].butfirst).to eq [2, 3, 4]
13
+ end
14
+ end
15
+
16
+ describe '#butlast' do
17
+ it 'returns all elements excluding the last one' do
18
+ expect([].butlast).to eq []
19
+ expect([1].butlast).to eq []
20
+ expect([1, 2, 3].butlast).to eq [1, 2]
21
+ expect([1, 2, 3, 4].butlast).to eq [1, 2, 3]
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
  require 'inactive_support/enumerable'
3
4
 
@@ -12,19 +13,19 @@ describe Enumerable do
12
13
  it 'partitions lists by consecutive attribute' do
13
14
  simple_people = [mitko, goshko, krasi, dedo]
14
15
 
15
- simple_people.consecutive_by(&:age).should eq [[mitko, goshko], [krasi], [dedo]]
16
+ expect(simple_people.consecutive_by(&:age)).to eq [[mitko, goshko], [krasi], [dedo]]
16
17
  end
17
18
 
18
19
  it 'sorts by the given method before partitioning' do
19
20
  simple_people = [goshko, krasi, dedo, mitko]
20
21
 
21
- simple_people.consecutive_by(&:age).should eq [[mitko, goshko], [krasi], [dedo]]
22
+ expect(simple_people.consecutive_by(&:age)).to eq [[mitko, goshko], [krasi], [dedo]]
22
23
  end
23
24
 
24
25
  it 'works on bare arrays' do
25
26
  ary = [1, 2, 3, 5, 7, 8, 11, 12]
26
27
 
27
- ary.consecutive_by(&:identity).should eq [[1, 2, 3], [5], [7, 8], [11, 12]]
28
+ expect(ary.consecutive_by(&:identity)).to eq [[1, 2, 3], [5], [7, 8], [11, 12]]
28
29
  end
29
30
 
30
31
  describe 'with letters somewhere in the number' do
@@ -60,16 +61,16 @@ describe Enumerable do
60
61
  consecutive_people = [mitko, goshko]
61
62
  non_consecutive_people = [mitko, goshko, krasi]
62
63
 
63
- consecutive_people.consecutive?(&:age).should be_true
64
+ expect(consecutive_people.consecutive?(&:age)).to be true
64
65
 
65
- non_consecutive_people.consecutive?(&:age).should be_false
66
+ expect(non_consecutive_people.consecutive?(&:age)).to be false
66
67
  end
67
68
 
68
69
  it 'uses identity on the objects if no key is given' do
69
- [1, 2, 3, 4].consecutive?.should be_true
70
- [1, 2, 3, 5].consecutive?.should be_false
71
- [2, 1, 3, 5].consecutive?.should be_false
72
- [].consecutive?.should be_false
70
+ expect([1, 2, 3, 4].consecutive?).to be true
71
+ expect([1, 2, 3, 5].consecutive?).to be false
72
+ expect([2, 1, 3, 4].consecutive?).to be false
73
+ expect([].consecutive?).to be false
73
74
  end
74
75
 
75
76
  end
@@ -1,9 +1,10 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
  require 'inactive_support/hash/delete_blank'
3
4
 
4
5
  describe Hash do
5
6
 
6
- describe "#delete_blank" do
7
+ describe '#delete_blank' do
7
8
 
8
9
  it 'deletes nils' do
9
10
  initial = {
@@ -15,20 +16,20 @@ describe Hash do
15
16
  id: 1
16
17
  }
17
18
 
18
- initial.delete_blank.should eq expected
19
+ expect(initial.delete_blank).to eq expected
19
20
  end
20
21
 
21
22
  it 'deletes empty strings' do
22
23
  initial = {
23
24
  id: 1,
24
- name: ""
25
+ name: ''
25
26
  }
26
27
 
27
28
  expected = {
28
29
  id: 1
29
30
  }
30
31
 
31
- initial.delete_blank.should eq expected
32
+ expect(initial.delete_blank).to eq expected
32
33
  end
33
34
 
34
35
  it 'preserves false values' do
@@ -42,7 +43,7 @@ describe Hash do
42
43
  name: false
43
44
  }
44
45
 
45
- initial.delete_blank.should eq expected
46
+ expect(initial.delete_blank).to eq expected
46
47
  end
47
48
 
48
49
  it 'deletes empty arrays' do
@@ -55,7 +56,7 @@ describe Hash do
55
56
  id: 1
56
57
  }
57
58
 
58
- initial.delete_blank.should eq expected
59
+ expect(initial.delete_blank).to eq expected
59
60
 
60
61
  end
61
62
  it 'deletes empty hashes' do
@@ -68,50 +69,50 @@ describe Hash do
68
69
  id: 1
69
70
  }
70
71
 
71
- initial.delete_blank.should eq expected
72
+ expect(initial.delete_blank).to eq expected
72
73
 
73
74
  end
74
75
 
75
76
  end
76
77
 
77
- describe "#deep_delete_blank" do
78
+ describe '#deep_delete_blank' do
78
79
 
79
80
  it 'deletes nils' do
80
81
  initial = {
81
82
  id: 1,
82
83
  name: {
83
84
  first: nil,
84
- middle: "Peter"
85
+ middle: 'Peter'
85
86
  }
86
87
  }
87
88
 
88
89
  expected = {
89
90
  id: 1,
90
91
  name: {
91
- middle: "Peter"
92
+ middle: 'Peter'
92
93
  }
93
94
  }
94
95
 
95
- initial.deep_delete_blank.should eq expected
96
+ expect(initial.deep_delete_blank).to eq expected
96
97
  end
97
98
 
98
99
  it 'deletes empty strings' do
99
100
  initial = {
100
101
  id: 1,
101
102
  name: {
102
- first: "",
103
- middle: "Peter"
103
+ first: '',
104
+ middle: 'Peter'
104
105
  }
105
106
  }
106
107
 
107
108
  expected = {
108
109
  id: 1,
109
110
  name: {
110
- middle: "Peter"
111
+ middle: 'Peter'
111
112
  }
112
113
  }
113
114
 
114
- initial.deep_delete_blank.should eq expected
115
+ expect(initial.deep_delete_blank).to eq expected
115
116
  end
116
117
 
117
118
  it 'preserves false values' do
@@ -119,7 +120,7 @@ describe Hash do
119
120
  id: 1,
120
121
  name: {
121
122
  first: false,
122
- middle: "Peter"
123
+ middle: 'Peter'
123
124
  }
124
125
  }
125
126
 
@@ -127,11 +128,11 @@ describe Hash do
127
128
  id: 1,
128
129
  name: {
129
130
  first: false,
130
- middle: "Peter"
131
+ middle: 'Peter'
131
132
  }
132
133
  }
133
134
 
134
- initial.deep_delete_blank.should eq expected
135
+ expect(initial.deep_delete_blank).to eq expected
135
136
  end
136
137
 
137
138
  it 'deletes empty arrays' do
@@ -139,18 +140,18 @@ describe Hash do
139
140
  id: 1,
140
141
  name: {
141
142
  addresses: [],
142
- middle: "Peter"
143
+ middle: 'Peter'
143
144
  }
144
145
  }
145
146
 
146
147
  expected = {
147
148
  id: 1,
148
149
  name: {
149
- middle: "Peter"
150
+ middle: 'Peter'
150
151
  }
151
152
  }
152
153
 
153
- initial.deep_delete_blank.should eq expected
154
+ expect(initial.deep_delete_blank).to eq expected
154
155
 
155
156
  end
156
157
  it 'deletes empty hashes' do
@@ -158,18 +159,18 @@ describe Hash do
158
159
  id: 1,
159
160
  name: {
160
161
  children: {},
161
- middle: "Peter"
162
+ middle: 'Peter'
162
163
  }
163
164
  }
164
165
 
165
166
  expected = {
166
167
  id: 1,
167
168
  name: {
168
- middle: "Peter"
169
+ middle: 'Peter'
169
170
  }
170
171
  }
171
172
 
172
- initial.deep_delete_blank.should eq expected
173
+ expect(initial.deep_delete_blank).to eq expected
173
174
  end
174
175
 
175
176
  end
@@ -1,15 +1,16 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
  require 'inactive_support/numeric'
3
4
 
4
5
  describe Numeric do
5
6
 
6
- describe "#precision" do
7
+ describe '#precision' do
7
8
 
8
9
  it 'behaves exactly like Float#round when invoked with no arguments', :brute do
9
10
  1_000_000.times do
10
11
  n = rand(1.0..100.0)
11
12
  puts n if n.precision != n.round
12
- n.precision.should eq n.round
13
+ expect(n.precision).to eq n.round
13
14
  end
14
15
  end
15
16
 
@@ -17,30 +18,30 @@ describe Numeric do
17
18
  1_000.times do
18
19
  n = rand(1.0..100.0)
19
20
  puts n if n.precision != n.round
20
- n.precision.should eq n.round
21
+ expect(n.precision).to eq n.round
21
22
  end
22
23
  end
23
24
 
24
- describe "reality checks" do
25
-
26
- it "case#1" do
27
- 3.904605.precision(0).should eq 4
28
- 3.904605.precision(1).should eq 3.9
29
- 3.904605.precision(2).should eq 3.91
30
- 3.904605.precision(3).should eq 3.905
31
- 3.904605.precision(4).should eq 3.9046
25
+ describe 'reality checks' do
26
+
27
+ it 'case#1' do
28
+ expect(3.904605.precision(0)).to eq 4
29
+ expect(3.904605.precision(1)).to eq 3.9
30
+ expect(3.904605.precision(2)).to eq 3.91
31
+ expect(3.904605.precision(3)).to eq 3.905
32
+ expect(3.904605.precision(4)).to eq 3.9046
32
33
  end
33
34
 
34
- it "case#2" do
35
- 37.9945.precision(0).should eq 38
36
- 37.9945.precision(1).should eq 38
37
- 37.9945.precision(2).should eq 38
35
+ it 'case#2' do
36
+ expect(37.9945.precision(0)).to eq 38
37
+ expect(37.9945.precision(1)).to eq 38
38
+ expect(37.9945.precision(2)).to eq 38
38
39
  end
39
40
 
40
- it "case#3" do
41
- 37.9944.precision(0).should eq 38
42
- 37.9944.precision(1).should eq 38
43
- 37.9944.precision(2).should eq 37.99
41
+ it 'case#3' do
42
+ expect(37.9944.precision(0)).to eq 38
43
+ expect(37.9944.precision(1)).to eq 38
44
+ expect(37.9944.precision(2)).to eq 37.99
44
45
  end
45
46
 
46
47
  end
@@ -1,20 +1,97 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
  require 'inactive_support/object'
3
4
 
4
5
  describe Object do
5
6
 
6
- describe "#ctry" do
7
- it "works with 1 argument" do
8
- "String".ctry(:downcase).should eq 'string'
7
+ describe '#ctry' do
8
+ it 'works with 1 argument' do
9
+ expect('String'.ctry(:downcase)).to eq 'string'
9
10
  end
10
11
 
11
- it "works with multiple arguments" do
12
- "Nurse I spy gypsies run".ctry(:downcase, :reverse).should eq 'nur seispyg yps i esrun'
12
+ it 'works with multiple arguments' do
13
+ expect('Nurse I spy gypsies run'.ctry(:downcase, :reverse)).to eq 'nur seispyg yps i esrun'
13
14
  end
14
15
 
15
16
  it 'returns nil when called on nil' do
16
- nil.ctry(:downcase, :upcase).should eq nil
17
+ expect(nil.ctry(:downcase, :upcase)).to eq nil
17
18
  end
18
19
  end
19
20
 
21
+ describe '#blank' do
22
+ it 'works with arrays' do
23
+ expect([].blank?).to be true
24
+ expect([1].blank?).to be false
25
+ end
26
+
27
+ it 'works with hashes' do
28
+ expect({}.blank?).to be true
29
+ expect({ name: 'Kip' }.blank?).to be false
30
+ end
31
+
32
+ it 'works with strings' do
33
+ blank = [
34
+ '',
35
+ ' ',
36
+ ' ',
37
+ "\t",
38
+ "\r",
39
+ "\n"
40
+ ]
41
+
42
+ not_blank = [
43
+ ' a ',
44
+ 'string'
45
+ ]
46
+
47
+ blank.each do |string|
48
+ expect(string.blank?).to be true
49
+ end
50
+
51
+ not_blank.each do |string|
52
+ expect(string.blank?).to be false
53
+ end
54
+ end
55
+ end
56
+
57
+ describe '#deep_dup' do
58
+
59
+ it 'works with hashes' do
60
+ original = {
61
+ name: {
62
+ first: 'Gavin'
63
+ }
64
+ }
65
+
66
+ duplicate = original.deep_dup
67
+
68
+ # modify duplicate
69
+ expect do
70
+ duplicate[:name][:first] = 'Dazen'
71
+ end.not_to change { original[:name][:first] }
72
+
73
+ end
74
+
75
+ it 'works with arrays' do
76
+ original = [1, 2, 3]
77
+ modified = original.deep_dup
78
+
79
+ expect do
80
+ modified.unshift(0)
81
+ end.not_to change { original }
82
+
83
+ expect do
84
+ modified.push(4)
85
+ end.not_to change { original }
86
+ end
87
+
88
+ it 'works with strings' do
89
+ original = "I ain't grouchy, "
90
+ modified = original.deep_dup
91
+
92
+ expect do
93
+ modified += '“I just have a low threshold for stupidity'
94
+ end.not_to change { original }
95
+ end
96
+ end
20
97
  end
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,13 @@
1
+ # encoding: utf-8
1
2
  require 'bundler/setup'
2
3
  Bundler.setup
3
4
 
4
5
  require 'inactive_support'
5
6
 
6
7
  RSpec.configure do |config|
7
- config.treat_symbols_as_metadata_keys_with_true_values = true
8
8
  config.run_all_when_everything_filtered = true
9
9
  config.filter_run :focus
10
10
  config.filter_run_excluding :brute
11
11
 
12
-
13
12
  config.order = 'random'
14
13
  end
metadata CHANGED
@@ -1,64 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inactive_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
5
- prerelease:
4
+ version: 1.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - gmitrev
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2015-05-07 00:00:00.000000000 Z
11
+ date: 2015-09-13 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: '1.3'
19
+ version: '1.10'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '1.3'
26
+ version: '1.10'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '2.6'
47
+ version: '3.3'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: '2.6'
54
+ version: '3.3'
62
55
  description: A collection of utilities and extensions
63
56
  email:
64
57
  - gvmitrev@gmail.com
@@ -66,62 +59,62 @@ executables: []
66
59
  extensions: []
67
60
  extra_rdoc_files: []
68
61
  files:
69
- - .gitignore
70
- - .rspec
62
+ - ".gitignore"
63
+ - ".rspec"
71
64
  - Gemfile
72
65
  - LICENSE.txt
73
66
  - README.md
74
67
  - Rakefile
75
68
  - inactive_support.gemspec
76
69
  - lib/inactive_support.rb
70
+ - lib/inactive_support/array.rb
71
+ - lib/inactive_support/array/butfirst.rb
72
+ - lib/inactive_support/array/butlast.rb
77
73
  - lib/inactive_support/enumerable.rb
78
74
  - lib/inactive_support/enumerable/consecutive_by.rb
79
75
  - lib/inactive_support/hash.rb
76
+ - lib/inactive_support/hash/deep_delete_blank.rb
80
77
  - lib/inactive_support/hash/delete_blank.rb
81
78
  - lib/inactive_support/numeric.rb
82
79
  - lib/inactive_support/numeric/precision.rb
83
80
  - lib/inactive_support/object.rb
84
81
  - lib/inactive_support/object/blank.rb
82
+ - lib/inactive_support/object/deep_dup.rb
85
83
  - lib/inactive_support/object/identity.rb
86
84
  - lib/inactive_support/object/try.rb
87
85
  - lib/inactive_support/version.rb
86
+ - spec/lib/array_spec.rb
88
87
  - spec/lib/enumerable_spec.rb
89
88
  - spec/lib/hash_spec.rb
90
89
  - spec/lib/numeric_spec.rb
91
90
  - spec/lib/object_spec.rb
92
91
  - spec/spec_helper.rb
93
- homepage: ''
92
+ homepage: https://github.com/gmitrev/inactive_support
94
93
  licenses:
95
94
  - MIT
95
+ metadata: {}
96
96
  post_install_message:
97
97
  rdoc_options: []
98
98
  require_paths:
99
99
  - lib
100
100
  required_ruby_version: !ruby/object:Gem::Requirement
101
- none: false
102
101
  requirements:
103
- - - ! '>='
102
+ - - ">="
104
103
  - !ruby/object:Gem::Version
105
104
  version: '0'
106
- segments:
107
- - 0
108
- hash: -4215888734430273764
109
105
  required_rubygems_version: !ruby/object:Gem::Requirement
110
- none: false
111
106
  requirements:
112
- - - ! '>='
107
+ - - ">="
113
108
  - !ruby/object:Gem::Version
114
109
  version: '0'
115
- segments:
116
- - 0
117
- hash: -4215888734430273764
118
110
  requirements: []
119
111
  rubyforge_project:
120
- rubygems_version: 1.8.23
112
+ rubygems_version: 2.4.5
121
113
  signing_key:
122
- specification_version: 3
114
+ specification_version: 4
123
115
  summary: Snippets and useful stuff extracted from my projects
124
116
  test_files:
117
+ - spec/lib/array_spec.rb
125
118
  - spec/lib/enumerable_spec.rb
126
119
  - spec/lib/hash_spec.rb
127
120
  - spec/lib/numeric_spec.rb