hashstruct 1.3.1 → 1.5

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
  SHA256:
3
- metadata.gz: 015c8589bd7af72a393ec494cf5c044adc9b45170d09f8c7207027c0450aae34
4
- data.tar.gz: 23ec8d2a0848ecfbb212cd68694ca2e151559c35e640e7c78bc930e948d813be
3
+ metadata.gz: ef62c5e766986486e0eae763c0f1bef12da2b6a52bbe7d272f67467a0aee3eba
4
+ data.tar.gz: 10e99235757740e723af33d73811c25d434535a57be1f632a750cfde6c0032e8
5
5
  SHA512:
6
- metadata.gz: 8403282f22c80051296c10a65c17b4b9398288859d40c2ca10c41db2d26ccd9429a5c0ea0a90fe3c678f71c3f68f53c0ed9c5b2ea9e9d94a6f7258de394150c6
7
- data.tar.gz: 645ca574efb7cd3e93eec60dc78e48a29070861db6f4f4a6406ecdfac0f53e9e97c7376b8b93bff0b023d63f9dbd4301e86748c20fbea4f89aa4c3b59d4ccfbf
6
+ metadata.gz: e9dea5dfff5fce6eaa30717d47015a44cc9d71435dd720932d3f28f617fd861352558db9197ade43d71a415ca8e9c39a150aee3d62503a5e63e42ad0f56696dd
7
+ data.tar.gz: 72edc59eb48835375aefe3cbfdbc9e6dcd779f67a78281ec141d53414dc9ed71f317cee03190f097a935c8f4fb64fadf892cb0b3b02f970ec748284c7f4a89d3
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  .DS_Store
2
+ Gemfile.lock
2
3
  *.gem
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Rakefile CHANGED
@@ -1,2 +1,9 @@
1
- require 'rubygems/tasks'
2
- Gem::Tasks.new
1
+ require 'bundler/gem_tasks'
2
+ Bundler.require
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.test_files = FileList['test/*test.rb']
7
+ end
8
+
9
+ task :default => :test
data/hashstruct.gemspec CHANGED
@@ -1,10 +1,6 @@
1
- #encoding: utf-8
2
-
3
- require_relative 'lib/hashstruct/version'
4
-
5
1
  Gem::Specification.new do |s|
6
2
  s.name = 'hashstruct'
7
- s.version = HashStruct::VERSION
3
+ s.version = '1.5'
8
4
  s.summary = 'Overly helpful magic hash structure.'
9
5
  s.author = 'John Labovitz'
10
6
  s.email = 'johnl@johnlabovitz.com'
@@ -20,6 +16,8 @@ Gem::Specification.new do |s|
20
16
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
21
17
  s.require_path = 'lib'
22
18
 
23
- s.add_development_dependency 'rake', '~> 12.3'
24
- s.add_development_dependency 'rubygems-tasks', '~> 0.2'
19
+ s.add_development_dependency 'bundler', '~> 2.5'
20
+ s.add_development_dependency 'minitest', '~> 5.20'
21
+ s.add_development_dependency 'minitest-power_assert', '~> 0.3'
22
+ s.add_development_dependency 'rake', '~> 13.1'
25
23
  end
data/lib/hashstruct.rb CHANGED
@@ -9,22 +9,12 @@ class HashStruct < Hash
9
9
  end
10
10
 
11
11
  def [](key)
12
- key = key.to_sym
13
- if methods.include?(key)
14
- method(key).call
15
- elsif has_key?(key)
16
- fetch(key)
17
- else
18
- nil
19
- end
12
+ key = _make_key(key)
13
+ has_key?(key) ? fetch(key) : nil
20
14
  end
21
15
 
22
16
  def []=(key, value)
23
- if methods.include?(:"#{key}=")
24
- method(:"#{key}=").call(convert_object(value))
25
- else
26
- store(key.to_s.to_sym, convert_object(value))
27
- end
17
+ store(_make_key(key), _convert_object(value))
28
18
  end
29
19
 
30
20
  def method_missing(method_id, *args)
@@ -32,17 +22,21 @@ class HashStruct < Hash
32
22
  if method_name =~ /=$/
33
23
  raise ArgumentError, "wrong number of arguments for method #{method_name.inspect} (#{args.length} for 1)", caller(1) if args.length != 1
34
24
  raise TypeError, "can't modify frozen #{self.class}", caller(1) if self.frozen?
35
- self[method_name.chop.to_sym] = args.first
25
+ self[method_name.chop] = args.first
36
26
  else
37
27
  raise ArgumentError, "wrong number of arguments (#{args.length} for 0)", caller(1) if args.length != 0
38
28
  self[method_id]
39
29
  end
40
30
  end
41
31
 
42
- def convert_object(obj)
32
+ def _make_key(obj)
33
+ obj.to_s.downcase.gsub(/[^\w]/, '_').to_sym
34
+ end
35
+
36
+ def _convert_object(obj)
43
37
  case obj
44
38
  when String
45
- case obj
39
+ case obj.strip
46
40
  # URI
47
41
  when %r{^(ftp|http|https|mailto):}
48
42
  URI.parse(obj) rescue obj
@@ -64,20 +58,22 @@ class HashStruct < Hash
64
58
  # date
65
59
  when %r{^\d{4}-\d{2}-\d{2}}, # 2010-06-06
66
60
  %r{^\d{1,2}/\d{1,2}/\d{4}}, # 06/06/2010
67
- %r{^\d{4}/\d{1,2}/\d{1,2}}, # 2010/06/06
68
- %r{^(Sun|Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s*\d*\s*\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\b} # Sun, 06 Jun 2010 23:02:25 GMT
69
- DateTime.parse(obj)
61
+ %r{^\d{4}/\d{1,2}/\d{1,2}} # 2010/06/06
62
+ Date.parse(obj)
70
63
  # boolean true
71
64
  when 'true', 'yes', 'on'
72
65
  true
73
66
  # boolean false
74
67
  when 'false', 'no', 'off'
75
68
  false
69
+ # nil or empty string
70
+ when nil, ''
71
+ nil
76
72
  else
77
73
  obj
78
74
  end
79
75
  when Array
80
- obj.map { |o| convert_object(o) }
76
+ obj.map { |o| _convert_object(o) }
81
77
  when Hash
82
78
  HashStruct.new(obj)
83
79
  when HashStruct
@@ -87,4 +83,4 @@ class HashStruct < Hash
87
83
  end
88
84
  end
89
85
 
90
- end
86
+ end
data/test/test.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/power_assert'
3
+
4
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
5
+ require 'hashstruct'
6
+
7
+ class Test < Minitest::Test
8
+
9
+ def setup
10
+ @h = HashStruct.new(
11
+ date1: '2017-11-01',
12
+ 'Date-Time' => '2023-12-23T13:20:00-05:00',
13
+ )
14
+ end
15
+
16
+ def test_date
17
+ d1 = @h.date1
18
+ assert { d1.kind_of?(Date) }
19
+ d2 = @h.date_time
20
+ assert { d2.kind_of?(Date) }
21
+ end
22
+
23
+ end
metadata CHANGED
@@ -1,43 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashstruct
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: '1.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Labovitz
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-08 00:00:00.000000000 Z
11
+ date: 2023-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '12.3'
33
+ version: '5.20'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '12.3'
40
+ version: '5.20'
27
41
  - !ruby/object:Gem::Dependency
28
- name: rubygems-tasks
42
+ name: minitest-power_assert
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - "~>"
32
60
  - !ruby/object:Gem::Version
33
- version: '0.2'
61
+ version: '13.1'
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
- version: '0.2'
68
+ version: '13.1'
41
69
  description: "\n HashStruct provides an object based on Hash, but acts like Struct
42
70
  (or OpenStruct), providing helpful\n accessors for each key from the get-go.
43
71
  It also magically parses string values when it can (eg, dates,\n URIs, numbers,
@@ -48,16 +76,17 @@ extensions: []
48
76
  extra_rdoc_files: []
49
77
  files:
50
78
  - ".gitignore"
79
+ - Gemfile
51
80
  - README.md
52
81
  - Rakefile
53
82
  - hashstruct.gemspec
54
83
  - lib/hashstruct.rb
55
- - lib/hashstruct/version.rb
84
+ - test/test.rb
56
85
  homepage: http://github.com/jslabovitz/hashstruct
57
86
  licenses:
58
87
  - MIT
59
88
  metadata: {}
60
- post_install_message:
89
+ post_install_message:
61
90
  rdoc_options: []
62
91
  require_paths:
63
92
  - lib
@@ -72,9 +101,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
101
  - !ruby/object:Gem::Version
73
102
  version: '0'
74
103
  requirements: []
75
- rubyforge_project:
76
- rubygems_version: 2.7.4
77
- signing_key:
104
+ rubygems_version: 3.5.3
105
+ signing_key:
78
106
  specification_version: 4
79
107
  summary: Overly helpful magic hash structure.
80
- test_files: []
108
+ test_files:
109
+ - test/test.rb
@@ -1,5 +0,0 @@
1
- class HashStruct
2
-
3
- VERSION = '1.3.1'
4
-
5
- end