render_json_rails 0.1.5 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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
 
@@ -80,7 +100,7 @@ render_json_config name: :team,
80
100
  Add this line to your application's Gemfile:
81
101
 
82
102
  ```ruby
83
- gem 'render_json_rails', git: 'https://github.com/intum/render_json_rails'
103
+ gem 'render_json_rails'
84
104
  ```
85
105
 
86
106
  And then execute:
@@ -91,18 +111,14 @@ Or install it yourself as:
91
111
 
92
112
  $ gem install render_json_rails
93
113
 
94
- ## Contributing
95
-
96
- Bug reports and pull requests are welcome on GitHub at https://github.com/intum/render_json_rails.
97
-
114
+ ## Tests
98
115
 
99
- ## TMP
116
+ ```
117
+ rake test
118
+ ```
100
119
 
101
- Tworzenie gema
102
120
 
103
- ```
104
- gem build render_json_rails.gemspec
121
+ ## Contributing
105
122
 
106
- gem push --key github --host https://rubygems.pkg.github.com/intum render_json_rails-0.1.XXX.gem
107
- ```
123
+ Bug reports and pull requests are welcome on GitHub at https://github.com/intum/render_json_rails.
108
124
 
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
@@ -38,16 +47,22 @@ module RenderJsonRails
38
47
 
39
48
  def render_json_config(config)
40
49
  @render_json_config = config
41
- # @render_json_config[:methods] = [:image]
42
50
  end
43
51
 
44
- # rubocop:disable Lint/UnusedMethodArgument
45
52
  def render_json_options(includes: nil, fields: nil, additional_config: nil)
46
53
  raise "należy skonfigurowac render_json metodą: render_json_config" if !defined?(@render_json_config)
47
54
 
55
+ name = @render_json_config[:name].to_s
56
+
57
+ if (fields.blank? || fields[name].blank?) && @render_json_config[:default_fields].present?
58
+ fields ||= {}
59
+ fields[name] = @render_json_config[:default_fields].join(',')
60
+ end
61
+
48
62
  options = default_json_options(
49
- name: @render_json_config[:name].to_s,
63
+ name: name,
50
64
  fields: fields,
65
+ only: @render_json_config[:only],
51
66
  except: @render_json_config[:except],
52
67
  methods: @render_json_config[:methods],
53
68
  allowed_methods: @render_json_config[:allowed_methods]
@@ -55,41 +70,43 @@ module RenderJsonRails
55
70
 
56
71
  if includes
57
72
  include_options = []
58
- @render_json_config[:includes].each do |name, klass|
59
- if includes.include?(name.to_s)
60
- includes2 = RenderJsonRails::Concern.includes_for_model(includes: includes, model: name.to_s)
61
- # raise includes2.inspect + ' ' + includes.inspect
62
- include_options << { name => klass.render_json_options(includes: includes2, fields: fields) }
73
+ @render_json_config[:includes]&.each do |model_name, klass|
74
+ if includes.include?(model_name.to_s)
75
+ includes2 = RenderJsonRails::Concern.includes_for_model(includes: includes, model: model_name.to_s)
76
+ include_options << { model_name => klass.render_json_options(includes: includes2, fields: fields) }
63
77
  end
64
- end if @render_json_config[:includes]
65
-
66
- # if includes.include?('questions')
67
- # includes2 = RenderJsonRails::Concern.includes_for_model(includes: includes, model: 'questions')
68
- # # raise includes2.inspect + ' ' + includes.inspect
69
- # include_options << { questions: Organize::Question.render_json_options(includes: includes2, fields: fields) }
70
- # end
71
- options[:include] = include_options
78
+ end
79
+
80
+ options[:include] = include_options if include_options.present?
72
81
  end
73
82
 
74
- options
75
- end # render_json_options
76
- # rubocop:enable Lint/UnusedMethodArgument
83
+ options = RenderJsonRails::Concern.deep_meld(options, additional_config) if additional_config
77
84
 
85
+ options.delete(:methods) if options[:methods].blank?
78
86
 
87
+ options
88
+ end # render_json_options
79
89
  end # class_methods
80
90
 
81
91
  def self.includes_for_model(includes:, model:)
82
- # include.split(',')
83
- # includes.delete(to_remove)
84
- includes = includes.map do |el|
85
- if el.start_with?(model + '.')
86
- el = el.gsub(/^#{model}\./, '')
92
+ includes = includes.map { |el| el.gsub(/^#{model}\./, '') if el.start_with?(model + '.') }
93
+ includes.find_all { |el| el.present? }
94
+ end
95
+
96
+ def self.deep_meld(hh1, hh2)
97
+ hh1.deep_merge(hh2) do |_key, this_val, other_val|
98
+ if !this_val.nil? && other_val == nil
99
+ this_val
100
+ elsif this_val == nil && !other_val.nil?
101
+ other_val
102
+ elsif this_val.is_a?(Array) && other_val.is_a?(Array)
103
+ this_val | other_val
104
+ elsif this_val.is_a?(Hash) && other_val.is_a?(Hash)
105
+ deep_meld(this_val, other_val)
87
106
  else
88
- el = nil
107
+ [this_val, other_val]
89
108
  end
90
109
  end
91
- includes.find_all{ |el| el.present? }
92
- # raise includes.to_json
93
110
  end
94
111
  end
95
- end
112
+ end
@@ -27,7 +27,7 @@ module RenderJsonRails
27
27
  else
28
28
  class_object = object.class
29
29
  end
30
- includes = params[:include].to_s.split(',').map{ |el| el.to_s.strip } if params[:include]
30
+ includes = params[:include].to_s.split(',').map { |el| el.to_s.strip } if params[:include]
31
31
  options = class_object.render_json_options(
32
32
  includes: includes,
33
33
  fields: params[:fields],
@@ -44,4 +44,4 @@ module RenderJsonRails
44
44
  end
45
45
  end
46
46
  end
47
- end
47
+ end
@@ -1,3 +1,3 @@
1
1
  module RenderJsonRails
2
- VERSION = "0.1.5"
2
+ VERSION = "0.2.1"
3
3
  end
Binary file
@@ -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.5
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-01 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
@@ -28,6 +57,7 @@ files:
28
57
  - lib/render_json_rails/concern.rb
29
58
  - lib/render_json_rails/helper.rb
30
59
  - lib/render_json_rails/version.rb
60
+ - render_json_rails-0.2.gem
31
61
  - render_json_rails.gemspec
32
62
  homepage: https://github.com/intum/render_json_rails
33
63
  licenses:
@@ -48,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
78
  - !ruby/object:Gem::Version
49
79
  version: '0'
50
80
  requirements: []
51
- rubygems_version: 3.1.2
81
+ rubygems_version: 3.0.3
52
82
  signing_key:
53
83
  specification_version: 4
54
84
  summary: Simle JSON API render like JonApi