json_defaults 0.1.4 → 0.1.9

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
- SHA1:
3
- metadata.gz: 7f796ce48261e6fa69e220517bb01d94141948ca
4
- data.tar.gz: 44fcabe3fc5f8469d33720e31deb47534d8805f6
2
+ SHA256:
3
+ metadata.gz: edb266e8c31d0afd0a9dba8e3b32d6ba33f33ed9a5d788ec5b11b47db79fee12
4
+ data.tar.gz: 2e1ced8a6eeae357b2fd0cee2e71caff307efde41cb0ebf6aef6e97f5f1813ea
5
5
  SHA512:
6
- metadata.gz: 683f2ccc8470fb3540f3f4bc55d7d3463ec93fbf1ad3a1e913d116216d8bef8a1852d707af17e4b23d2718f50c48ca4b3f6137e9f67bcd997029db15b209f59f
7
- data.tar.gz: f17b049fbe9816e1cac54ae4f363857dbb281613f3625d87abc85d5aff3110942973ec3b0bc2a65897f15077daba4934c3ca75ca2c3d493a124f91aa29424297
6
+ metadata.gz: 3942a81529c1c21d86b8c55bcd05beb3300d35c0df0918f17bcd0059504b550483f51a92914798c6a4d12c15fd88d2635f41ff909d06d558670eaf8c24430652
7
+ data.tar.gz: d36ac9e6ae31a25824c4b02b53eeccf65b7181c1a786bc932a2e7270470b616a79cb8414e5ed6da9957ad9e21424ce83406f5d6d109b1c980d3e3842db6eda6d
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # JsonDefaults
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/json_defaults`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ Very simple library for defining default options for your object.
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,15 +20,97 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ Working with Model
24
+ ------------------------
25
+
26
+ - Create jsonb field for you model:
27
+
28
+ ```ruby
29
+ rails g migration add_json_field_to_users json_field:jsonb
30
+ rake db:migrate
31
+ ```
32
+
33
+ - Add this to your model:
34
+
35
+ ```ruby
36
+ class User < ActiveRecord::Base
37
+ extend JsonDefaults
38
+
39
+ json_defaults(
40
+ field: "json_field",
41
+ options: {
42
+ field1: "It's",
43
+ field2: "awesome"
44
+ }
45
+ )
46
+ end
47
+ ```
48
+ And next just use defined fields with default options
49
+
50
+ ```ruby
51
+ user = User.new
52
+ user.json_field # => {"field1"=>"It's", "field2"=>"awesome"}
53
+ user.field1 # => It's
54
+ user.field2 # => awesome
55
+ ```
56
+ You can update this field directly
57
+
58
+ ```ruby
59
+ user = User.new
60
+ user.field1 # => It's
61
+ user.field1 = "cool"
62
+ user.field1 # => cool
63
+ ```
26
64
 
27
- ## Development
65
+ - You can also define type for each field:
28
66
 
29
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
67
+ ```ruby
68
+ class User < ActiveRecord::Base
69
+ extend JsonDefaults
70
+
71
+ json_defaults(
72
+ field: "json_field",
73
+ options: {
74
+ field1: "It's",
75
+ field2: "awesome",
76
+ field3: {
77
+ value: false,
78
+ boolean: true
79
+ },
80
+ field4: {
81
+ value: 666,
82
+ integer: true
83
+ }
84
+ }
85
+ )
86
+ end
87
+ ```
30
88
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
89
+ ```ruby
90
+ user = User.new
91
+ user.field4 # => 666
92
+ user.field4 = "123"
93
+ user.field4 # => 123
94
+ ```
95
+
96
+ ### Options for defining field
32
97
 
33
- ## Contributing
98
+ ```ruby
99
+ json_defaults(
100
+ field: "json_field",
101
+ options: {
102
+ key: "value",
103
+ key: {
104
+ value: 666,
105
+ integer: true
106
+ }
107
+ }
108
+ )
109
+ ```
34
110
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/json_defaults.
111
+ | Option | type | Description |
112
+ | :--- | :--- | :--- |
113
+ | `field` |String| This parameter specifies which field in the model the json_defaults plugin will be applied to. |
114
+ | `options` |Hash| Default hash for selected field with ```key``` and ```value``` |
115
+ | `key` || Key's name in default hash. Can be ```string``` or ```symbol```|
36
116
 
Binary file
@@ -1,35 +1,36 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'json_defaults/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "json_defaults"
6
+ spec.name = 'json_defaults'
8
7
  spec.version = JsonDefaults::VERSION
9
- spec.authors = ["DenDos"]
10
- spec.email = ["cotoha92@gmail.com"]
8
+ spec.authors = ['DenDos']
9
+ spec.email = ['cotoha92@gmail.com']
11
10
 
12
- spec.summary = %q{Create default structure for jsonb field}
13
- spec.description = %q{DEEEEEESSSSSCCCCRIRRRRRIIIIIPPPPTIOOOOONNNNN}
14
- spec.homepage = ""
11
+ spec.summary = 'Create default structure for jsonb field'
12
+ spec.description = 'https://github.com/DenDos/json-defaults'
13
+ spec.homepage = ''
15
14
 
16
15
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
16
  # to allow pushing to a single host or delete this section to allow pushing to any host.
18
17
  if spec.respond_to?(:metadata)
19
- spec.metadata['allowed_push_host'] = "https://rubygems.org"
18
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
20
19
  else
21
- raise "RubyGems 2.0 or newer is required to protect against " \
22
- "public gem pushes."
20
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
21
+ 'public gem pushes.'
23
22
  end
24
23
 
25
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
24
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
25
  f.match(%r{^(test|spec|features)/})
27
26
  end
28
- spec.bindir = "exe"
27
+ spec.bindir = 'exe'
29
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
- spec.require_paths = ["lib"]
29
+ spec.require_paths = ['lib']
31
30
 
32
- spec.add_development_dependency "bundler", "~> 1.13"
33
- spec.add_development_dependency "rake", "~> 10.0"
34
- spec.add_development_dependency "rspec"
31
+ spec.add_development_dependency 'activerecord', '~> 4.2'
32
+ spec.add_development_dependency 'bundler', '~> 1.3'
33
+ spec.add_development_dependency 'pg', '~> 0.21.0'
34
+ spec.add_development_dependency 'rake', '~> 13.0.1'
35
+ spec.add_development_dependency 'rspec'
35
36
  end
data/lib/json_defaults.rb CHANGED
@@ -1,58 +1,94 @@
1
- require "json_defaults/version"
2
- require "json_defaults/active_record_module"
1
+ require 'json_defaults/version'
3
2
 
4
3
  module JsonDefaults
5
-
6
4
  def json_defaults(field: nil, options: {}, active_record: false)
7
5
  options = options.stringify_keys
8
6
  define_json_methods(field, options)
9
- set_default_options(field, options) if active_record
7
+ set_default_options(field, options) if defined?(ActiveRecord::Base) && ancestors.include?(ActiveRecord::Base)
10
8
  end
11
-
12
- private
13
- def define_json_methods(base_field, options)
14
- options.each do |field, defaults|
15
- define_getter(base_field, field, defaults)
16
- define_setter(base_field, field, defaults)
9
+
10
+ private
11
+
12
+ def define_json_methods(base_field, options)
13
+ options.each do |field, defaults|
14
+ define_getter(base_field, field, defaults)
15
+ define_setter(base_field, field, defaults)
16
+ end
17
+ end
18
+
19
+ def define_getter(base_field, field, defaults)
20
+ return if attribute_names.include?(field)
21
+
22
+ define_method field do
23
+ val = send base_field
24
+ if val && val.is_a?(Hash) && val.has_key?(field)
25
+ val[field]
26
+ elsif defaults.is_a?(Hash) && defaults.has_key?(:value)
27
+ return defaults[:value]
28
+ else
29
+ return defaults.is_a?(Hash) ? defaults.stringify_keys : defaults
17
30
  end
18
31
  end
32
+ end
19
33
 
20
- def define_getter base_field, field, defaults
21
- define_method field do
22
- val = send base_field
23
- if val && val.is_a?(Hash) && val.has_key?(field)
24
- val[field]
25
- else
26
- if defaults.is_a?(Hash) && defaults.has_key?(:value)
27
- return defaults[:value]
28
- else
29
- return defaults
30
- end
31
- end
34
+ def get_defult_data(_get_defult_data)
35
+ if defaults.is_a?(Hash) && defaults.has_key?(:value)
36
+ defaults[:value]
37
+ else
38
+ defaults
39
+ end
40
+ end
41
+
42
+ def define_setter(base_field, field, defaults)
43
+ return if attribute_names.include?(field)
44
+
45
+ define_method "#{field}=" do |val|
46
+ object_value = send base_field
47
+ object_value = {} unless val && val.is_a?(Hash)
48
+
49
+ val = val.to_i if defaults.is_a?(Hash) && defaults.has_key?(:integer) && defaults[:integer]
50
+
51
+ if defaults.is_a?(Hash) && defaults.has_key?(:boolean) && defaults[:boolean]
52
+ val = val.is_a?(TrueClass) || val.respond_to?(:to_i) && val.to_i == 1
32
53
  end
54
+
55
+ object_value[field] = val
56
+
57
+ send("#{base_field}=", {
58
+ **send(base_field.to_s).symbolize_keys,
59
+ **object_value.symbolize_keys
60
+ })
33
61
  end
62
+ end
34
63
 
35
- def define_setter base_field, field, defaults
36
- define_method "#{field}=" do |val|
37
- object_value = send base_field
38
- unless val && val.is_a?(Hash)
39
- object_value = {}
40
- end
41
-
42
- if defaults.is_a?(Hash) && defaults.has_key?(:integer) && defaults[:integer]
43
- val = val.to_i
44
- end
64
+ def set_default_options(field, options)
65
+ after_initialize do |model|
66
+ if model.respond_to?(field)
67
+ if model.send(field).blank?
68
+ model.send("#{field}=", options.each do |key, value|
69
+ options[key] = if value.is_a?(Hash) && value.has_key?(:value)
70
+ value[:value]
71
+ else
72
+ value
73
+ end
74
+ end)
75
+ else
76
+ options.each do |key, value|
77
+ have_key = model.send(field).key?(key.to_s)
45
78
 
46
- if defaults.is_a?(Hash) && defaults.has_key?(:boolean) && defaults[:boolean]
47
- val = val.is_a?(TrueClass) || val.respond_to?(:to_i) && val.to_i == 1
48
- end
79
+ default_value = value.is_a?(Hash) && value.has_key?(:value) ? value[:value] : value
80
+ default_value = default_value.stringify_keys if default_value && default_value.is_a?(Hash)
81
+
82
+ model_value = model.send(field).try(:[], key.to_s).try(:stringify_keys)
49
83
 
50
- object_value[field] = val
51
-
52
- send("#{base_field}=", {
53
- **send("#{base_field}").symbolize_keys,
54
- **object_value.symbolize_keys
55
- })
84
+ if !have_key
85
+ model.send(field)[key] = default_value
86
+ elsif have_key && model_value.is_a?(Hash)
87
+ model.send(field)[key] = default_value.merge(model_value)
88
+ end
89
+ end
90
+ end
56
91
  end
57
92
  end
93
+ end
58
94
  end
@@ -1,3 +1,3 @@
1
1
  module JsonDefaults
2
- VERSION = "0.1.4"
2
+ VERSION = '0.1.9'.freeze
3
3
  end
metadata CHANGED
@@ -1,43 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_defaults
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - DenDos
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-03 00:00:00.000000000 Z
11
+ date: 2021-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '1.13'
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pg
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.21.0
20
48
  type: :development
21
49
  prerelease: false
22
50
  version_requirements: !ruby/object:Gem::Requirement
23
51
  requirements:
24
52
  - - "~>"
25
53
  - !ruby/object:Gem::Version
26
- version: '1.13'
54
+ version: 0.21.0
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - "~>"
32
60
  - !ruby/object:Gem::Version
33
- version: '10.0'
61
+ version: 13.0.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: '10.0'
68
+ version: 13.0.1
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rspec
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -52,7 +80,7 @@ dependencies:
52
80
  - - ">="
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
55
- description: DEEEEEESSSSSCCCCRIRRRRRIIIIIPPPPTIOOOOONNNNN
83
+ description: https://github.com/DenDos/json-defaults
56
84
  email:
57
85
  - cotoha92@gmail.com
58
86
  executables: []
@@ -65,9 +93,9 @@ files:
65
93
  - Rakefile
66
94
  - bin/console
67
95
  - bin/setup
96
+ - json_defaults-0.1.8.gem
68
97
  - json_defaults.gemspec
69
98
  - lib/json_defaults.rb
70
- - lib/json_defaults/active_record_module.rb
71
99
  - lib/json_defaults/version.rb
72
100
  homepage: ''
73
101
  licenses: []
@@ -88,8 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
116
  - !ruby/object:Gem::Version
89
117
  version: '0'
90
118
  requirements: []
91
- rubyforge_project:
92
- rubygems_version: 2.5.1
119
+ rubygems_version: 3.0.3
93
120
  signing_key:
94
121
  specification_version: 4
95
122
  summary: Create default structure for jsonb field
@@ -1,29 +0,0 @@
1
- module JsonDefaults
2
- private
3
- def set_default_options field, options
4
- after_initialize do |model|
5
- if model.class.columns_hash[field].type == :json || model.class.columns_hash[field].type == :jsonb
6
- if model.send(field).blank?
7
- model.send("#{field}=", options.each {|key, value| options[key] = value.is_a?(Hash) && value.has_key?(:value) ? value[:value] : value})
8
- else
9
- options.each do |key, value|
10
- have_key = model.send(field).key?(key.to_s)
11
- if !have_key
12
- default_value = value.is_a?(Hash) && value.has_key?(:value) ? value[:value] : value
13
- model.send(field)[key] = default_value
14
- else
15
- model_value = model.send(field)[key.to_s]
16
- if model_value.is_a?(Hash) && !((value.keys - model_value.symbolize_keys.keys).count == 0)
17
- model.send(field)[key.to_s] = {
18
- **value.symbolize_keys,
19
- **model_value.symbolize_keys
20
- }
21
- end
22
- end
23
- end
24
- end
25
- model.save if !model.changes.blank?
26
- end
27
- end
28
- end
29
- end