jsonapi-params 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e5a249c1dc7ab63566967bc11cfda5a9cadcf9c3
4
+ data.tar.gz: 227888eacf0c5c0f538451b031d1344d63b42a5a
5
+ SHA512:
6
+ metadata.gz: d07526167def4f51cf4f7cfaa8e854028e95891d66a1c41f6a81ba205ac71cf672b3fccc015f930865a70ef0a127e4120fa45b8960358a2cf790559a5ef45d4e
7
+ data.tar.gz: 772e64b470a3ff2f43da7724ace3898123b3b9033ca9e54447d0907643415d91af1e1a9cf0ae873b086b61e5b4847290774ff7d32d13b69c554ca7907677a827
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3.0
4
+ before_install: gem install bundler -v 1.11.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jsonapi-params.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # Jsonapi::Params
2
+
3
+ This gem handles the parameters of a request that uses the jsonapi specification and provides simple control over input parameters and manipulation of attributes, relationships and other...
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'jsonapi-params'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install jsonapi-params
20
+
21
+ ## Usage
22
+
23
+ To use jsonapi-params you should create a class to handle with your parameters. Example:
24
+
25
+ ```ruby
26
+ class AuthorParam
27
+ include JSONAPI::Param
28
+
29
+ params :name
30
+ end
31
+
32
+ class ArticleParam
33
+ include JSONAPI::Param
34
+
35
+ params :title, :text, :other_text
36
+
37
+ belongs_to :author
38
+ end
39
+
40
+ article = ArticleParam.new(
41
+ 'data' => {
42
+ 'id' => 1,
43
+ 'type' => 'x',
44
+ 'attributes' => {
45
+ 'title' => 'The guy',
46
+ 'text' => 'Loren Ipsun',
47
+ 'other-text' => 'Hello'
48
+ },
49
+ 'relationships' => {
50
+ 'author' => {
51
+ 'data' => {
52
+ 'id' => 123,
53
+ 'type' => 'authors',
54
+ 'attributes' => {
55
+ 'name' => 'Antonio'
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
61
+ )
62
+ ```
63
+
64
+ ### Available methods to handle with params
65
+
66
+ #### param
67
+
68
+ Adds a parameter to whitelist attributes
69
+
70
+ ```ruby
71
+ class AuthorParam
72
+ param :name
73
+ param :gender
74
+ end
75
+ ```
76
+
77
+ #### params
78
+
79
+ Adds a list of parameters to whitelist attributes
80
+
81
+ ```ruby
82
+ class AuthorParam
83
+ params :name, :gender
84
+ end
85
+ ```
86
+
87
+ #### belongs_to
88
+
89
+ Creates a one-to-one relationship to update or create objects
90
+
91
+ ```ruby
92
+ class AuthorParam
93
+ param :name
94
+ end
95
+
96
+ class ArticleParam
97
+ param :title
98
+
99
+ belongs_to :author
100
+ end
101
+ ```
102
+
103
+ #### attributes
104
+
105
+ Returns a list of attributes based on whitelist.
106
+
107
+ ```ruby
108
+ class ArticleParam
109
+ param :title
110
+ end
111
+
112
+ article_params = ArticleParam.new('data' => { 'attributes' => { 'title' => 'The day' }})
113
+ article_params.attributes # { 'title' => 'The day' }
114
+ ```
115
+
116
+ ## TODO
117
+
118
+ * one-to-many relationships
119
+ * many-to-many relationships
120
+ * metadata
121
+
122
+ ## Development
123
+
124
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
125
+
126
+ 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).
127
+
128
+ ## Contributing
129
+
130
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/jsonapi-params.
131
+
132
+ ## License
133
+
134
+ jsonapi-params is released under the MIT License.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "jsonapi-params"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jsonapi-params/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "jsonapi-params"
8
+ spec.version = JSONAPI::Param::VERSION
9
+ spec.authors = ["Noverde Team"]
10
+ spec.email = ["dev@noverde.com.br"]
11
+
12
+ spec.summary = %q{Gem to handle with parameters according to jsonapi specification}
13
+ spec.homepage = "https://github.com/Noverde/jsonapi-params"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = "exe"
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "activesupport", "> 4"
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.11"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rspec", "~> 3.0"
25
+ spec.add_development_dependency "pry-byebug"
26
+ end
@@ -0,0 +1,117 @@
1
+ require 'active_support/core_ext/hash/slice'
2
+ require 'active_support/core_ext/string/inflections'
3
+
4
+ module JSONAPI
5
+ module Param
6
+ def self.included(target)
7
+ target.send(:include, InstanceMethods)
8
+ target.extend ClassMethods
9
+ end
10
+
11
+ module ClassMethods
12
+ attr_accessor :whitelist_attributes, :whitelist_relationships
13
+
14
+ # Adds the parameters to whitelist of parameters
15
+ #
16
+ # @param name [Symbol] The name of parameter
17
+ # @return [nil]
18
+ def param(name)
19
+ add_param(name)
20
+ end
21
+
22
+ # Adds a list of parameters to whitelist of parameters
23
+ #
24
+ # @param name [Array<Symbol>] Names of parameters
25
+ # @return [nil]
26
+ def params(*names)
27
+ names.each { |name| add_param(name) }
28
+ end
29
+
30
+ # Adds a relationship one-to-one to whitelist of relationships
31
+ #
32
+ # @param name [Array<Symbol>] Names of relationships
33
+ # @return [nil]
34
+ def belongs_to(relationship_names)
35
+ @whitelist_relationships ||= []
36
+ @whitelist_relationships << relationship_names.to_s.dasherize
37
+ end
38
+
39
+ private
40
+
41
+ # Creates the whitelist of attributes
42
+ #
43
+ # @param [Symbol]
44
+ # @return [nil]
45
+ # @!scope class
46
+ # @!visibility private
47
+ def add_param(name)
48
+ @whitelist_attributes ||= []
49
+ @whitelist_attributes << name.to_s.dasherize
50
+ end
51
+ end
52
+
53
+ module InstanceMethods
54
+ def initialize(params)
55
+ raise InvalidParam, 'Data is required' if params.nil? || params['data'].nil?
56
+
57
+ @data = params['data']
58
+ end
59
+
60
+ # @returns [Integer]
61
+ # @!attribute [r]
62
+ def id
63
+ @data['id']
64
+ end
65
+
66
+ # @returns [String]
67
+ # @!attribute [r]
68
+ def type
69
+ @data['type']
70
+ end
71
+
72
+ # Handles parameters to return sanitized attributes and their relationships
73
+ #
74
+ # @return [Hash]
75
+ def attributes
76
+ attributes = @data['attributes'] || {}
77
+ attributes = attributes.slice(*self.class.whitelist_attributes)
78
+ attributes = attributes.merge(relationships)
79
+ attributes
80
+ end
81
+
82
+ # Handles parameters to return relationships
83
+ #
84
+ # @return [Hash]
85
+ # @raise [RuntimeError] if the relationship is a one-to-many relationship.
86
+ def relationships
87
+ relationships = @data['relationships'] || {}
88
+ relationships = relationships.slice(*self.class.whitelist_relationships)
89
+
90
+ relationships.inject({}) do |relationships, (relationship_key, relationship_object)|
91
+ data = relationship_object['data']
92
+
93
+ if data.is_a?(Array)
94
+ raise 'One-to-many relationship is not supported'
95
+ elsif data.is_a?(Hash)
96
+ params = params_klass(relationship_key).new(relationship_object)
97
+
98
+ relationships["#{relationship_key}_id"] = params.id
99
+ end
100
+
101
+ relationships
102
+ end
103
+ end
104
+
105
+ private
106
+
107
+ # Get the key to create a constant of param class.
108
+ #
109
+ # @param [String]
110
+ # @return [Object]
111
+ # @!visibility private
112
+ def params_klass(key)
113
+ "#{key}Param".classify.constantize
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,5 @@
1
+ module JSONAPI
2
+ module Param
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ require 'jsonapi-params/version'
2
+ require 'jsonapi-params/param'
3
+
4
+ module JSONAPI
5
+ module Param
6
+ class InvalidParam < StandardError; end
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jsonapi-params
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Noverde Team
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-01-26 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: '4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: '4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.11'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email:
85
+ - dev@noverde.com.br
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - Gemfile
94
+ - README.md
95
+ - Rakefile
96
+ - bin/console
97
+ - bin/setup
98
+ - jsonapi-params.gemspec
99
+ - lib/jsonapi-params.rb
100
+ - lib/jsonapi-params/param.rb
101
+ - lib/jsonapi-params/version.rb
102
+ homepage: https://github.com/Noverde/jsonapi-params
103
+ licenses: []
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.5.1
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: Gem to handle with parameters according to jsonapi specification
125
+ test_files: []