render_json_rails 0.1.6 → 0.2.2

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.
data/Gemfile CHANGED
@@ -3,5 +3,5 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in render_json_rails.gemspec
4
4
  gemspec
5
5
 
6
- gem "rake", "~> 12.0"
7
6
  gem "minitest", "~> 5.0"
7
+ gem "rake", "~> 12.0"
data/README.md CHANGED
@@ -9,9 +9,9 @@ Dzięki temu łatwo jest stworzyć backend Json API np. do pracy z Reactem lub V
9
9
 
10
10
  class Team < ActiveRecord::Base
11
11
  has_many :users
12
-
12
+
13
13
  include RenderJsonRails::Concern
14
-
14
+
15
15
  render_json_config name: :team,
16
16
  includes: {
17
17
  users: User
@@ -20,13 +20,21 @@ end
20
20
 
21
21
  class User < ActiveRecord::Base
22
22
  belongs_to :team
23
-
23
+
24
24
  include RenderJsonRails::Concern
25
-
25
+
26
26
  render_json_config name: :user,
27
+ except: [:account_id, :id],
28
+ # only: [:login, :email], # jesli wolelibyśmy wymienić pola zamiast je wykluczać przy pomocy "except"
29
+ default_fields: [:login, :email, :calculated_age],
30
+ allowed_methods: [:calculated_age],
27
31
  includes: {
28
32
  team: Team
29
33
  }
34
+
35
+ def calculated_age
36
+ rand(100)
37
+ end
30
38
  end
31
39
  ```
32
40
 
@@ -34,7 +42,7 @@ Dodajemy też w kontrolerze ```teams_controller.rb```
34
42
 
35
43
  ```ruby
36
44
  include RenderJsonRails::Helper
37
-
45
+
38
46
  def index
39
47
  @team = Team.all
40
48
  respond_to do |format|
@@ -42,8 +50,8 @@ Dodajemy też w kontrolerze ```teams_controller.rb```
42
50
  format.json { render_json @team }
43
51
  end
44
52
  end
45
- ```
46
-
53
+ ```
54
+
47
55
  i możemy już otrzymać JSON team-u wraz z userami
48
56
 
49
57
  ```html
@@ -62,16 +70,28 @@ i możemy łączyć to z include
62
70
  http://example.text/teams/1.json?fields[team]=name,description&fields[user]=email,name&include=users
63
71
  ```
64
72
 
65
- ## Pełny opis ```render_json_config```
73
+ include mogą być zagnieżdżane (po kropce)
74
+
75
+ ```html
76
+ http://example.text/teams/1.json?fields[team]=name,description&fields[user]=email,name&fields[role]=name&include=users,users.roles
77
+ ```
78
+
79
+ ## Wiecej przykładów użycia
80
+
81
+ Więcej przykładów jest w testach: [test/render_json_rails_test.rb](test/render_json_rails_test.rb)
82
+
83
+ ## Wszystkie opcje ```render_json_config```
66
84
 
67
85
  ```ruby
68
- render_json_config name: :team,
86
+ render_json_config name: :team,
69
87
  except: [:account_id, :config], # tych pól nie będzie w json-ie
70
- methods: [:image], # te metody zostaną dołączone
71
- allowed_methods: [:members], # te metody mogą być dodane przez parametr fileds np: fields[team]=id,members
72
- includes: { # to mozna dołączać za pomoca parametru include np include=users,category
88
+ only: [:id, :name], # dozwolone pola będą w jsonie (wymiennie z except)
89
+ methods: [:image], # dozwolone i domyślnie wyświetlone metody, ten parametr warto uzywac tylko, gdy nie ma parametru "default_fields" - przy ustawionym "default_fields" trzeba metody wymienic w allowed_methods
90
+ default_fields: [:id, :name, :members], # domyślnie wyświetlone pola + metody
91
+ allowed_methods: [:members], # dozwolone metody, mogą być dodane przez parametr fileds np: fields[team]=id,members
92
+ includes: { # to mozna dołączać za pomoca parametru include np include=users,category,users.roles
73
93
  users: Users,
74
- cateogry: Category
94
+ category: Category
75
95
  }
76
96
  ```
77
97
 
@@ -91,6 +111,13 @@ Or install it yourself as:
91
111
 
92
112
  $ gem install render_json_rails
93
113
 
114
+ ## Tests
115
+
116
+ ```
117
+ rake test
118
+ ```
119
+
120
+
94
121
  ## Contributing
95
122
 
96
123
  Bug reports and pull requests are welcome on GitHub at https://github.com/intum/render_json_rails.
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
+ # require 'active_support/core_ext/object/blank'
4
+ # require 'active_support'
3
5
 
4
6
  Rake::TestTask.new(:test) do |t|
5
7
  t.libs << "test"
@@ -7,4 +9,4 @@ Rake::TestTask.new(:test) do |t|
7
9
  t.test_files = FileList["test/**/*_test.rb"]
8
10
  end
9
11
 
10
- task :default => :test
12
+ task default: :test
@@ -17,20 +17,29 @@ module RenderJsonRails
17
17
  # zostaną one wyświelone w json-ie
18
18
  # TODO:
19
19
  # [ ] spradzanie czy parametry "fields" i "include" sa ok i jesli nie to error
20
- def default_json_options(name:, fields: nil, except: nil, methods: nil, allowed_methods: nil)
20
+ def default_json_options(name:, fields: nil, only: nil, except: nil, methods: nil, allowed_methods: nil)
21
21
  # name ||= self.name.underscore.gsub('/', '_')
22
22
  # raise self.name.underscore.gsub('/', '_')
23
- except ||= [:account_id, :agent, :ip]
23
+ # except ||= [:account_id, :agent, :ip]
24
24
 
25
25
  options = {}
26
26
  if fields && fields[name].present?
27
- options[:only] = fields[name].split(',').find_all { |el| !except.include?(el.to_sym) }
28
- options[:methods] = methods&.find_all { |el| options[:only].include?(el.to_s) }
27
+ options[:only] = fields[name].split(',').map{ |e| e.to_s.strip.to_sym }.find_all { |el| !except&.include?(el) }
28
+ if only.present?
29
+ options[:only] = options[:only].find_all do |el|
30
+ only.include?(el) || allowed_methods&.include?(el) || methods&.include?(el)
31
+ end
32
+ end
33
+ options[:methods] = methods&.find_all { |el| options[:only].include?(el) }
29
34
  if allowed_methods
30
- options[:methods] = (options[:methods] || []) | allowed_methods.find_all { |el| options[:only].include?(el.to_s) }
35
+ options[:methods] = (options[:methods] || []) | allowed_methods.find_all { |el| options[:only].include?(el) }
36
+ end
37
+ if options[:methods].present? && options[:only].present?
38
+ options[:methods].each { |method| options[:only].delete(method) }
31
39
  end
32
40
  else
33
41
  options[:except] = except
42
+ options[:only] = only if only.present?
34
43
  options[:methods] = methods
35
44
  end
36
45
  options
@@ -40,52 +49,61 @@ module RenderJsonRails
40
49
  @render_json_config = config
41
50
  end
42
51
 
43
- def render_json_options(includes: nil, fields: nil, additional_config: nil)
52
+ def render_json_options(includes: nil, fields: nil, override_render_json_config: nil, additional_config: nil)
44
53
  raise "należy skonfigurowac render_json metodą: render_json_config" if !defined?(@render_json_config)
45
54
 
55
+ if override_render_json_config
56
+ current_json_config = @render_json_config.merge(override_render_json_config)
57
+ else
58
+ current_json_config = @render_json_config
59
+ end
60
+
61
+ name = current_json_config[:name].to_s
62
+
63
+ if (fields.blank? || fields[name].blank?) && current_json_config[:default_fields].present?
64
+ fields ||= {}
65
+ fields[name] = current_json_config[:default_fields].join(',')
66
+ end
67
+
46
68
  options = default_json_options(
47
- name: @render_json_config[:name].to_s,
69
+ name: name,
48
70
  fields: fields,
49
- except: @render_json_config[:except],
50
- methods: @render_json_config[:methods],
51
- allowed_methods: @render_json_config[:allowed_methods]
71
+ only: current_json_config[:only],
72
+ except: current_json_config[:except],
73
+ methods: current_json_config[:methods],
74
+ allowed_methods: current_json_config[:allowed_methods]
52
75
  )
53
76
 
54
77
  if includes
55
78
  include_options = []
56
- @render_json_config[:includes].each do |name, klass|
57
- if includes.include?(name.to_s)
58
- includes2 = RenderJsonRails::Concern.includes_for_model(includes: includes, model: name.to_s)
59
- include_options << { name => klass.render_json_options(includes: includes2, fields: fields) }
79
+ current_json_config[:includes]&.each do |model_name, klass|
80
+ if includes.include?(model_name.to_s)
81
+ includes2 = RenderJsonRails::Concern.includes_for_model(includes: includes, model: model_name.to_s)
82
+ include_options << { model_name => klass.render_json_options(includes: includes2, fields: fields) }
60
83
  end
61
- end if @render_json_config[:includes]
84
+ end
62
85
 
63
- options[:include] = include_options
86
+ options[:include] = include_options if include_options.present?
64
87
  end
65
88
 
66
89
  options = RenderJsonRails::Concern.deep_meld(options, additional_config) if additional_config
90
+
91
+ options.delete(:methods) if options[:methods].blank?
92
+
67
93
  options
68
94
  end # render_json_options
69
95
  end # class_methods
70
96
 
71
97
  def self.includes_for_model(includes:, model:)
72
- includes = includes.map do |el|
73
- if el.start_with?(model + '.')
74
- el = el.gsub(/^#{model}\./, '')
75
- else
76
- el = nil
77
- end
78
- end
98
+ includes = includes.map { |el| el.gsub(/^#{model}\./, '') if el.start_with?(model + '.') }
79
99
  includes.find_all { |el| el.present? }
80
100
  end
81
101
 
82
- private
83
-
84
- def self.deep_meld(h1, h2)
85
- h1.deep_merge(h2) do |key, this_val, other_val|
86
- if this_val != nil && other_val == nil
102
+ def self.deep_meld(hh1, hh2)
103
+ hh1.deep_merge(hh2) do |_key, this_val, other_val|
104
+ if !this_val.nil? && other_val == nil
87
105
  this_val
88
- elsif this_val == nil && other_val != nil
106
+ elsif this_val == nil && !other_val.nil?
89
107
  other_val
90
108
  elsif this_val.is_a?(Array) && other_val.is_a?(Array)
91
109
  this_val | other_val
@@ -17,7 +17,7 @@ module RenderJsonRails
17
17
  # fields[invoice]=number,sales_code
18
18
  # fields[invoice_position]=price_gross
19
19
  # include=positions
20
- def render_json(object, additional_config: nil, status: nil, location: nil)
20
+ def render_json(object, override_render_json_config: nil, additional_config: nil, status: nil, location: nil)
21
21
  raise "objekt nie moze byc null" if object == nil
22
22
 
23
23
  if object.class.to_s.include?('ActiveRecord_Relation')
@@ -31,6 +31,7 @@ module RenderJsonRails
31
31
  options = class_object.render_json_options(
32
32
  includes: includes,
33
33
  fields: params[:fields],
34
+ override_render_json_config: override_render_json_config,
34
35
  additional_config: additional_config
35
36
  )
36
37
  if params[:formatted] && !Rails.env.development? || params[:formatted] != 'no' && Rails.env.development?
@@ -1,3 +1,3 @@
1
1
  module RenderJsonRails
2
- VERSION = "0.1.6"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -20,10 +20,12 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
24
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
25
  end
26
26
  spec.bindir = "exe"
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ["lib"]
29
+ spec.add_development_dependency "activesupport"
30
+ spec.add_development_dependency "byebug"
29
31
  end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: render_json_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-16 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2020-10-21 00:00:00.000000000 Z
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: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  description: render json with 'includes' and 'fields' with simple config
14
42
  email:
15
43
  - marcin@radgost.com
@@ -18,6 +46,7 @@ extensions: []
18
46
  extra_rdoc_files: []
19
47
  files:
20
48
  - ".gitignore"
49
+ - ".rubocop.yml"
21
50
  - Gemfile
22
51
  - LICENSE.txt
23
52
  - README.md