thefox-ext 1.3.0 → 1.4.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: 0e9e0bd405074aad6711bbdf8733bcfce7aae887
4
- data.tar.gz: e23bf60e2df9ac302b7cfcfa77a9ef22679e8eb7
3
+ metadata.gz: 0d9d3e3cc6b4f95af03f5bb904259185b8b1a7a9
4
+ data.tar.gz: 1fa4937f167095f4990acdd2cd3283f873d873ee
5
5
  SHA512:
6
- metadata.gz: 0360d156805d54c6409b667de7eae6abfe4b0ba400b7d2b1d8f91457d2857a4cc007b1338986b1e381ff0f30b1fd595df7befe9b61c196ae6dbddd0b4aecbff8
7
- data.tar.gz: 1514cbc8fd41b1de01e0959dc868c5dfbdc9a8ee308a25de58bf75a367766eca4f5aa90f02cbab951f889d0ca0faa00684de67c160caf498ac2bda7fa9fb1744
6
+ metadata.gz: d2eb87e909fe0a35dcaf14210f8438882c9021cbf2f1784687a0b4019082a0df6bcdd3b10be785b22dcca8c8851de12c0e9d0f583115efbec18ddd79f3c06c0e
7
+ data.tar.gz: 647ba64e5aba70994768e5ca3842a98954c5e2ae518218b34f034934461b8d7a406dca91a67955c7ae41dd9bce7025f388ce7d6e1c5dbefea4ab81bb38169714
data/README.md CHANGED
@@ -24,7 +24,11 @@ Use it in your sources:
24
24
  - UTF-8 Encoding
25
25
  - Intenger 32-bit Array
26
26
  - Console Support
27
- - Date is `today?`
27
+ - Date
28
+ - `today?`
29
+ - Get week array for a specific date.
30
+ - Hash
31
+ - Recursive Merge
28
32
 
29
33
  ## Project Links
30
34
 
data/lib/thefox-ext.rb CHANGED
@@ -3,6 +3,7 @@ require 'thefox-ext/version'
3
3
 
4
4
  require 'thefox-ext/ext/date'
5
5
  require 'thefox-ext/ext/false'
6
+ require 'thefox-ext/ext/hash'
6
7
  require 'thefox-ext/ext/integer'
7
8
  require 'thefox-ext/ext/nil'
8
9
  require 'thefox-ext/ext/string'
@@ -5,4 +5,42 @@ class Date
5
5
  def today?
6
6
  self == Date.today
7
7
  end
8
+
9
+ def week
10
+ cweek = self.cweek
11
+ year = self.year
12
+ month = self.month
13
+
14
+ next_year = year + 1
15
+ previous_year = year - 1
16
+
17
+ days = Date.new(year)
18
+ .step(Date.new(year, -1, -1))
19
+ .select{ |d| d.cweek == cweek }
20
+
21
+ if cweek == 1 && month == 12 ||
22
+ cweek == 1 && month == 1 ||
23
+ cweek >= 52 && month == 12 ||
24
+ cweek >= 52 && month == 1
25
+
26
+ days.keep_if{ |d| d.year == year && d.month == month }
27
+ end
28
+
29
+ if days.count < 7
30
+ rest = 7 - days.count
31
+
32
+ rest_days = nil
33
+ if month == 1
34
+ rest_days = Date.new(previous_year, 12, 31 - rest + 1).step(Date.new(previous_year, 12, 31))
35
+ elsif month == 12
36
+ rest_days = Date.new(next_year).step(Date.new(next_year, 1, rest))
37
+ end
38
+
39
+ if !rest_days.nil?
40
+ days += rest_days.to_a
41
+ end
42
+ end
43
+
44
+ days.sort[0, 7]
45
+ end
8
46
  end
@@ -0,0 +1,58 @@
1
+
2
+ class Hash
3
+
4
+ def merge_recursive(h2, level = 0, clone = true)
5
+ has_subhashes = false
6
+
7
+ h1 = self
8
+ if clone
9
+ # We want to modify only the clone.
10
+ h1 = self.clone
11
+ end
12
+
13
+ # Iterate Hash 1
14
+ h1.each do |k, v|
15
+ if v.is_a?(Hash)
16
+ has_subhashes = true
17
+
18
+ if h2.has_key?(k) && h2[k].is_a?(Hash)
19
+ # Inception! Go one level deeper.
20
+ h1[k] = v.merge_recursive(h2[k], level + 1)
21
+ else
22
+ h1[k] = h2[k]
23
+ end
24
+ else
25
+ # Value of Hash 1 is no Subhash.
26
+
27
+ # Only overwrite Hash 1 Value with Hash 2 Value
28
+ # if a Hash 2 Key exist.
29
+ if h2.has_key?(k)
30
+ h1[k] = h2[k]
31
+ end
32
+ end
33
+ end
34
+
35
+ # Iterate Hash 2
36
+ # Because we also want Key from Hash 2
37
+ # which don't exist in Hash 1.
38
+ h2.each do |k, v|
39
+ if !h1.has_key?(k)
40
+ h1[k] = v
41
+ end
42
+ end
43
+
44
+ if !has_subhashes
45
+ # If there are no subhashes merge
46
+ # with existing merge function.
47
+ h1.merge!(h2)
48
+ end
49
+
50
+ # Return h1 modified clone.
51
+ return h1
52
+ end
53
+
54
+ def merge_recursive!(h2)
55
+ self.merge_recursive(h2, 0, false)
56
+ end
57
+
58
+ end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module TheFox
3
3
  module Ext
4
- VERSION = '1.3.0'
5
- DATE = '2016-02-07'
4
+ VERSION = '1.4.0'
5
+ DATE = '2016-02-13'
6
6
  end
7
7
  end
data/tests/tc_date.rb CHANGED
@@ -16,4 +16,55 @@ class TestDate < MiniTest::Test
16
16
 
17
17
  assert_equal(true, Time.now.to_date.today?)
18
18
  end
19
+
20
+ def test_week_mid
21
+ e = ['2014-02-17', '2014-02-18', '2014-02-19', '2014-02-20', '2014-02-21', '2014-02-22', '2014-02-23']
22
+ assert_equal(e, Date.new(2014, 2, 21).week.map{ |d| "#{d}" })
23
+
24
+ e = ['2014-03-31', '2014-04-01', '2014-04-02', '2014-04-03', '2014-04-04', '2014-04-05', '2014-04-06']
25
+ assert_equal(e, Date.new(2014, 4, 1).week.map{ |d| "#{d}" })
26
+
27
+ e = ['2015-02-16', '2015-02-17', '2015-02-18', '2015-02-19', '2015-02-20', '2015-02-21', '2015-02-22']
28
+ assert_equal(e, Date.new(2015, 2, 21).week.map{ |d| "#{d}" })
29
+
30
+ e = ['2016-02-15', '2016-02-16', '2016-02-17', '2016-02-18', '2016-02-19', '2016-02-20', '2016-02-21']
31
+ assert_equal(e, Date.new(2016, 2, 21).week.map{ |d| "#{d}" })
32
+ end
33
+
34
+ def test_week_jan
35
+ e = ['2013-12-30', '2013-12-31', '2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04', '2014-01-05']
36
+ assert_equal(e, Date.new(2014, 1, 1).week.map{ |d| "#{d}" })
37
+
38
+ e = ['2014-12-29', '2014-12-30', '2014-12-31',
39
+ '2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04']
40
+ assert_equal(e, Date.new(2015, 1, 1).week.map{ |d| "#{d}" })
41
+
42
+ e = ['2015-12-28', '2015-12-29', '2015-12-30', '2015-12-31',
43
+ '2016-01-01', '2016-01-02', '2016-01-03']
44
+ assert_equal(e, Date.new(2016, 1, 1).week.map{ |d| "#{d}" })
45
+
46
+ e = ['2016-12-26', '2016-12-27', '2016-12-28', '2016-12-29', '2016-12-30', '2016-12-31',
47
+ '2017-01-01']
48
+ assert_equal(e, Date.new(2017, 1, 1).week.map{ |d| "#{d}" })
49
+
50
+ e = ['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05', '2018-01-06', '2018-01-07']
51
+ assert_equal(e, Date.new(2018, 1, 1).week.map{ |d| "#{d}" })
52
+ end
53
+
54
+ def test_week_dec
55
+ e = ['2014-12-29', '2014-12-30', '2014-12-31',
56
+ '2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04']
57
+ assert_equal(e, Date.new(2014, 12, 31).week.map{ |d| "#{d}" })
58
+
59
+ e = ['2015-12-28', '2015-12-29', '2015-12-30', '2015-12-31',
60
+ '2016-01-01', '2016-01-02', '2016-01-03']
61
+ assert_equal(e, Date.new(2015, 12, 31).week.map{ |d| "#{d}" })
62
+
63
+ e = ['2016-12-26', '2016-12-27', '2016-12-28', '2016-12-29', '2016-12-30', '2016-12-31',
64
+ '2017-01-01']
65
+ assert_equal(e, Date.new(2016, 12, 31).week.map{ |d| "#{d}" })
66
+
67
+ e = ['2017-12-25', '2017-12-26', '2017-12-27', '2017-12-28', '2017-12-29', '2017-12-30', '2017-12-31']
68
+ assert_equal(e, Date.new(2017, 12, 31).week.map{ |d| "#{d}" })
69
+ end
19
70
  end
data/tests/tc_hash.rb ADDED
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'minitest/autorun'
4
+ require 'thefox-ext'
5
+
6
+
7
+ class TestHash < MiniTest::Test
8
+ def test_merge_recursive_clone1
9
+ h1 = {'k1' => 1, 'k2' => 1}
10
+ h2 = {'k1' => 2, 'k2' => 2}
11
+
12
+ assert_equal({'k1' => 2, 'k2' => 2}, h1.merge_recursive(h2))
13
+ end
14
+
15
+ def test_merge_recursive_clone2
16
+ h1 = {'k1' => 1, 'k2' => 1}
17
+ h2 = {'k1' => 2, 'k3' => 2}
18
+
19
+ assert_equal({'k1' => 2, 'k2' => 1, 'k3' => 2}, h1.merge_recursive(h2))
20
+ end
21
+
22
+ def test_merge_recursive_clone3
23
+ h1 = {'k1' => 1, 'k2' => {'sk1' => 1}}
24
+ h2 = {'k1' => 2, 'k2' => 2}
25
+
26
+ assert_equal({'k1' => 2, 'k2' => 2}, h1.merge_recursive(h2))
27
+ end
28
+
29
+ def test_merge_recursive_clone4
30
+ h1 = {'k1' => 1, 'k2' => 1}
31
+ h2 = {'k1' => 2, 'k2' => {'sk2' => 2}}
32
+
33
+ assert_equal({'k1' => 2, 'k2' => {'sk2' => 2}}, h1.merge_recursive(h2))
34
+ end
35
+
36
+ def test_merge_recursive_clone5
37
+ h1 = {'k1' => 1, 'k2' => {'sk1' => 1}}
38
+ h2 = {'k1' => 2, 'k2' => {'sk2' => 2}}
39
+
40
+ assert_equal({'k1' => 2, 'k2' => {'sk1' => 1, 'sk2' => 2}}, h1.merge_recursive(h2))
41
+ end
42
+
43
+ def test_merge_recursive_clone6
44
+ h1 = {'k1' => 1, 'k2' => 1, 'k4' => {'sk1' => 1}}
45
+ h2 = {'k1' => 2, 'k3' => 2, 'k4' => {'sk2' => 2}}
46
+
47
+ assert_equal({'k1' => 2, 'k2' => 1, 'k3' => 2, 'k4' => {'sk1' => 1, 'sk2' => 2}}, h1.merge_recursive(h2))
48
+ end
49
+
50
+ def test_merge_recursive_self1
51
+ h1 = {'k1' => 1, 'k2' => 1}
52
+ h2 = {'k1' => 2, 'k2' => 2}
53
+
54
+ h1.merge_recursive!(h2)
55
+
56
+ assert_equal({'k1' => 2, 'k2' => 2}, h1)
57
+ end
58
+
59
+ def test_merge_recursive_self2
60
+ h1 = {'k1' => 1, 'k2' => 1}
61
+ h2 = {'k1' => 2, 'k3' => 2}
62
+
63
+ h1.merge_recursive!(h2)
64
+
65
+ assert_equal({'k1' => 2, 'k2' => 1, 'k3' => 2}, h1)
66
+ end
67
+
68
+ def test_merge_recursive_self3
69
+ h1 = {'k1' => 1, 'k2' => {'sk1' => 1}}
70
+ h2 = {'k1' => 2, 'k2' => 2}
71
+
72
+ h1.merge_recursive!(h2)
73
+
74
+ assert_equal({'k1' => 2, 'k2' => 2}, h1)
75
+ end
76
+
77
+ def test_merge_recursive_self4
78
+ h1 = {'k1' => 1, 'k2' => 1}
79
+ h2 = {'k1' => 2, 'k2' => {'sk2' => 2}}
80
+
81
+ h1.merge_recursive!(h2)
82
+
83
+ assert_equal({'k1' => 2, 'k2' => {'sk2' => 2}}, h1)
84
+ end
85
+
86
+ def test_merge_recursive_self5
87
+ h1 = {'k1' => 1, 'k2' => {'sk1' => 1}}
88
+ h2 = {'k1' => 2, 'k2' => {'sk2' => 2}}
89
+
90
+ h1.merge_recursive!(h2)
91
+
92
+ assert_equal({'k1' => 2, 'k2' => {'sk1' => 1, 'sk2' => 2}}, h1)
93
+ end
94
+
95
+ def test_merge_recursive_self6
96
+ h1 = {'k1' => 1, 'k2' => 1, 'k4' => {'sk1' => 1}}
97
+ h2 = {'k1' => 2, 'k3' => 2, 'k4' => {'sk2' => 2}}
98
+
99
+ h1.merge_recursive!(h2)
100
+
101
+ assert_equal({'k1' => 2, 'k2' => 1, 'k3' => 2, 'k4' => {'sk1' => 1, 'sk2' => 2}}, h1)
102
+ end
103
+ end
data/tests/ts_all.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'tc_date'
4
4
  require_relative 'tc_false'
5
+ require_relative 'tc_hash'
5
6
  require_relative 'tc_integer'
6
7
  require_relative 'tc_nil'
7
8
  require_relative 'tc_string'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thefox-ext
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Mayer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-07 00:00:00.000000000 Z
11
+ date: 2016-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -40,6 +40,7 @@ files:
40
40
  - lib/thefox-ext/console.rb
41
41
  - lib/thefox-ext/ext/date.rb
42
42
  - lib/thefox-ext/ext/false.rb
43
+ - lib/thefox-ext/ext/hash.rb
43
44
  - lib/thefox-ext/ext/integer.rb
44
45
  - lib/thefox-ext/ext/nil.rb
45
46
  - lib/thefox-ext/ext/string.rb
@@ -47,6 +48,7 @@ files:
47
48
  - lib/thefox-ext/version.rb
48
49
  - tests/tc_date.rb
49
50
  - tests/tc_false.rb
51
+ - tests/tc_hash.rb
50
52
  - tests/tc_integer.rb
51
53
  - tests/tc_nil.rb
52
54
  - tests/tc_string.rb