ecraft-extensions 0.2.3 → 0.3.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: 1793e42f7e71ad0913157c4ad714822f10aa45ef
4
- data.tar.gz: f9816c1556f31a5dc88abe6ac704b402315383d9
3
+ metadata.gz: c25113dc68cc699ceb7211a9f6350287931416a8
4
+ data.tar.gz: fcf1be83809dc87238fd1731f79602bb84b8b7e5
5
5
  SHA512:
6
- metadata.gz: 34b93ece0f0c01b4bb6043d7c5d458db24a7463dfeee3c7e5a0667aa9bd1fb52b1ff4467245204929155396451113f9ff1b6063ac6c5797959211c7da4ee6802
7
- data.tar.gz: 1b3d62e52486973b3fcf8f31cf213c6dde565d75b3b0d9ddda1613a7a497389cb53348786dc1a4174409feaf4ea5b57938899f104470068dc7215fb809d5981f
6
+ metadata.gz: 8238dc69b792b8c9221f22b139e1ffa797d21d48c44b0a1003473d410d3d064c0f1d50550246ed11e2a04290e460fed56f51bfbb60d1239d3d28c47a315f8b7a
7
+ data.tar.gz: a94300f74e6c00a4bf5f4d295afc1bc2c845dce93473387900777c21ed9660a2e67091441fe6ef60b567ee770d2543b141515950549a01ba90f531a77de4a1d0
@@ -33,3 +33,5 @@ Style/NumericPredicate:
33
33
  Enabled: false
34
34
  Style/FrozenStringLiteralComment:
35
35
  Enabled: false
36
+
37
+ inherit_from: .rubocop_todo.yml
@@ -0,0 +1,29 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2017-10-10 12:17:14 +0300 using RuboCop version 0.50.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 2
10
+ Metrics/AbcSize:
11
+ Max: 20
12
+
13
+ # Offense count: 2
14
+ Metrics/CyclomaticComplexity:
15
+ Max: 8
16
+
17
+ # Offense count: 3
18
+ # Configuration parameters: CountComments.
19
+ Metrics/MethodLength:
20
+ Max: 14
21
+
22
+ # Offense count: 1
23
+ # Configuration parameters: CountComments.
24
+ Metrics/ModuleLength:
25
+ Max: 135
26
+
27
+ # Offense count: 2
28
+ Metrics/PerceivedComplexity:
29
+ Max: 9
data/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  This code contains some useful extension methods to various Ruby classes.
6
6
 
7
+ It also contains a few mixins in the `Ecraft::Extensions::Mixins` module.
8
+
7
9
  ## Installation
8
10
 
9
11
  Add this line to your application's Gemfile:
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ['lib']
22
22
 
23
+ spec.add_runtime_dependency 'activesupport', '>= 4.0'
23
24
  spec.add_runtime_dependency 'json', '>= 1.8'
24
25
 
25
26
  spec.add_development_dependency 'bundler'
@@ -0,0 +1,113 @@
1
+ #
2
+ # Utility mixin for converting arbitrary objects to Hashes.
3
+ #
4
+ # Similar to https://github.com/mustafaturan/hashable, but different in implementation.
5
+ #
6
+ # This mixin is deprecated, since it changes the behavior of to_h in a potentially unpleasant and surprising way for developers.
7
+ # It should only be used to make legacy code run and work; it should preferably not be used for new code being written.
8
+ #
9
+
10
+ require 'active_support'
11
+ require 'active_support/core_ext/hash/keys'
12
+
13
+ module Ecraft
14
+ module Extensions
15
+ module Mixins
16
+ module Hashable
17
+ def to_h(*targets)
18
+ target = get_target(targets)
19
+
20
+ if target.is_a?(Hash)
21
+ strip_string_recurse_enumerable_values(target)
22
+ elsif target.is_a?(Array)
23
+ strip_array(target)
24
+ elsif target.is_a?(OpenStruct)
25
+ target.marshal_dump
26
+ elsif value_type?(target)
27
+ target
28
+ # We need to check to ensure we don't call ourselves recursively.
29
+ elsif !target.class.included_modules.include?(Hashable) && target.respond_to?(:to_h)
30
+ target.to_h
31
+ else
32
+ turn_object_into_hash(target)
33
+ end
34
+ end
35
+
36
+ def to_hash(target = nil)
37
+ to_h(target)
38
+ end
39
+
40
+ private
41
+
42
+ def get_target(targets)
43
+ if targets.empty?
44
+ self
45
+ else
46
+ targets.first
47
+ end
48
+ end
49
+
50
+ def value_type?(v)
51
+ v.is_a?(BigDecimal) ||
52
+ v.is_a?(Integer) ||
53
+ v.is_a?(Float) ||
54
+ v.is_a?(String) ||
55
+ v.is_a?(TrueClass) ||
56
+ v.is_a?(FalseClass)
57
+ end
58
+
59
+ def strip_string_recurse_enumerable_values(hash)
60
+ hash.each_value do |v|
61
+ v.rstrip! if v.respond_to?(:rstrip!) && !v.frozen?
62
+ to_h(v) if v.is_a?(Enumerable)
63
+ end
64
+ hash.symbolize_keys
65
+ end
66
+
67
+ def strip_array(array)
68
+ array.map do |v|
69
+ if v.nil?
70
+ nil
71
+ elsif v.is_a?(String)
72
+ v.rstrip
73
+ elsif v.respond_to?(:to_h) && !v.is_a?(Hash)
74
+ v.to_h
75
+ else
76
+ to_h(v)
77
+ end
78
+ end
79
+ end
80
+
81
+ # Returns a Symbol-keyed Hash based on target's instance variables.
82
+ #
83
+ # @param target [Object]
84
+ #
85
+ # @return [Hash] with Symbol keys
86
+ def turn_object_into_hash(target)
87
+ target.instance_variables.each_with_object({}) do |var, hash|
88
+ original = target.instance_variable_get(var)
89
+ value = original
90
+
91
+ if value.is_a?(Hash)
92
+ # Nothing to do - it's already a hash, so we presume we don't have to do do any more conversions of it.
93
+ elsif value.is_a?(Array) && value.first.is_a?(Hash)
94
+ # Nothing to do - an Array of Hashes already have a sane enough format.
95
+ else
96
+ map_enumerable(original) if original.respond_to?(:each)
97
+ value = original.to_h if original.respond_to?(:to_h)
98
+ value.rstrip! if value.respond_to?(:rstrip!) && !value.frozen?
99
+ end
100
+
101
+ hash[var.to_s.delete('@').to_sym] = value
102
+ end
103
+ end
104
+
105
+ def map_enumerable(enumerable)
106
+ enumerable.map do |v|
107
+ v.respond_to?(:to_h) ? v.to_h : v
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -1,5 +1,5 @@
1
1
  module Ecraft
2
2
  module Extensions
3
- VERSION = '0.2.3'.freeze
3
+ VERSION = '0.3.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecraft-extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tre Kronor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-25 00:00:00.000000000 Z
11
+ date: 2017-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: json
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -146,6 +160,7 @@ files:
146
160
  - ".gitignore"
147
161
  - ".rspec"
148
162
  - ".rubocop.yml"
163
+ - ".rubocop_todo.yml"
149
164
  - ".ruby-version"
150
165
  - ".travis.yml"
151
166
  - ".yardopts"
@@ -159,6 +174,7 @@ files:
159
174
  - lib/ecraft/extensions/bigdecimal.rb
160
175
  - lib/ecraft/extensions/date.rb
161
176
  - lib/ecraft/extensions/datetime.rb
177
+ - lib/ecraft/extensions/mixins/hashable.rb
162
178
  - lib/ecraft/extensions/ostruct.rb
163
179
  - lib/ecraft/extensions/string.rb
164
180
  - lib/ecraft/extensions/symbol.rb
@@ -184,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
200
  version: '0'
185
201
  requirements: []
186
202
  rubyforge_project:
187
- rubygems_version: 2.6.11
203
+ rubygems_version: 2.6.14
188
204
  signing_key:
189
205
  specification_version: 4
190
206
  summary: eCraft Extensions