thefox-ext 1.3.0 → 1.4.0

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
  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