jsonschema_serializer 0.0.2 → 0.0.3

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: b5ff79bf4ed3d32004617cd27553db4d78259564
4
- data.tar.gz: af09ee9cb24e9d22ab131be621fb6eced08c72dd
3
+ metadata.gz: d65039713e6c37e41ca9c190655625b3d1ab9fc8
4
+ data.tar.gz: 204bea0aacdc61d33dedb8894f4f779ef5a63680
5
5
  SHA512:
6
- metadata.gz: 2042a3ee18d60c3f8a88279d2013099a0f12e15935882fb91ebb01d5633b2a624ba9d6c1a0653489f1e3dab5cfd41c2b217be16ec98e7a1b366f444dbd84a261
7
- data.tar.gz: c8e60dd65ddecfafe0195cb5bf05d2d7605f4d6d5aaf775b967942fc5f59de7a224068c6f4b5346a93dacd419fe5bf801a2a4ec1145148fec97df56ce78ad775
6
+ metadata.gz: 494f948e0b3b29bcaef14142952fc580a8de4bf68271a139af6eecf8dcbae99b3d925892734b7199bc8dcc10435600cc81418eb4bebcbcaac4b67d2ef9a322a3
7
+ data.tar.gz: 380403b40d52d4e7352a8258f997073900c728391d40f0f536405adbb4214fa9a6920dad3c256d7100f007659cf74456f4ab6577fa992d746094e852bbb51105
data/.gitignore CHANGED
@@ -9,3 +9,7 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+ .byebug_history
13
+ .ruby-version
14
+
15
+ Gemfile.lock
data/.rubocop.yml CHANGED
@@ -14,10 +14,14 @@ Metrics/LineLength:
14
14
  Max: 90
15
15
 
16
16
  Style/Documentation:
17
- Enabled: false
17
+ Enabled: true
18
18
 
19
19
  Style/FrozenStringLiteralComment:
20
20
  Enabled: false
21
21
 
22
+ Style/ModuleFunction:
23
+ Exclude:
24
+ - lib/jsonschema_serializer/active_record.rb
25
+
22
26
  Style/SymbolArray:
23
27
  EnforcedStyle: brackets
data/.travis.yml CHANGED
@@ -3,25 +3,7 @@ sudo: false
3
3
  language: ruby
4
4
 
5
5
  jobs:
6
- allow_failures:
7
- - rvm: 1.8.7
8
- gemfile: Gemfile-pre-2
9
- - rvm: 1.9.3
10
- gemfile: Gemfile-pre-2
11
- - rvm: 2.0.0
12
- gemfile: Gemfile-pre-2
13
- - rvm: jruby-1.7.21
14
- gemfile: Gemfile-pre-2
15
-
16
6
  include:
17
- - rvm: 1.8.7
18
- gemfile: Gemfile-pre-2
19
- - rvm: 1.9.3
20
- gemfile: Gemfile-pre-2
21
- - rvm: 2.0.0
22
- gemfile: Gemfile-pre-2
23
- - rvm: jruby-1.7.21
24
- gemfile: Gemfile-pre-2
25
7
  - rvm: 2.1.5
26
8
  gemfile: Gemfile
27
9
  - rvm: 2.2.7
data/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+
3
+ # v 0.0.3 (2018-05-21)
4
+
5
+ - improved documentation on existing code base
6
+ - refactored `JsonschemaSerializer::ActiveRecord` as a `class`
7
+
8
+ # v 0.0.2 (2018-05-20)
9
+
10
+ - basic rDoc comments for documentation
11
+
12
+ # v 0.0.1 (2018-05-20)
13
+
14
+ - basic implementation of `JsonschemaSerializer::Builder`
15
+ - POC implementation of a `JsonschemaSerializer::ActiveRecord` module
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # JsonschemaSerializer
2
2
 
3
3
  [![Build Status](https://travis-ci.org/mberlanda/jsonschema_serializer.svg?branch=master)](https://travis-ci.org/mberlanda/jsonschema_serializer)
4
+ [![Gem Version](https://badge.fury.io/rb/jsonschema_serializer.svg)](https://badge.fury.io/rb/jsonschema_serializer)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/7312071a0865c70f5d60/maintainability)](https://codeclimate.com/github/mberlanda/jsonschema_serializer/maintainability)
4
6
 
5
7
  This purpose of this gem is to generate [JsonSchema](http://json-schema.org/).
6
8
 
@@ -25,7 +27,7 @@ Or install it yourself as:
25
27
  You can generate a schema as follows:
26
28
 
27
29
  ```ruby
28
- schema = JsonSchema::Builder.build do |b|
30
+ schema = JsonschemaSerializer::Builder.build do |b|
29
31
 
30
32
  subscriber = b._object title: :subscriber, required: [:age] do |prop|
31
33
  prop.merge! b.string :first_name, title: 'First Name'
@@ -57,13 +59,11 @@ You can alternatively use an experimental builder for `ActiveRecord`
57
59
 
58
60
 
59
61
  ```ruby
60
- class Serializer
61
- include JsonschemaSerializer::ActiveRecord
62
- end
62
+ serializer = JsonschemaSerializer::ActiveRecord
63
63
 
64
- schema = Serializer.from_active_record(MyActiveRecordClass)
65
- schema = Serializer.from_active_record(MyActiveRecordClass, only: %[desired1 desired2])
66
- schema = Serializer.from_active_record(MyActiveRecordClass, except: %[ignored1 ignored2])
64
+ schema = serializer.from_active_record(MyActiveRecordClass)
65
+ schema = serializer.from_active_record(MyActiveRecordClass, only: %[desired1 desired2])
66
+ schema = serializer.from_active_record(MyActiveRecordClass, except: %[ignored1 ignored2])
67
67
 
68
68
  # You can manipulate the resulting schema
69
69
 
@@ -1,22 +1,19 @@
1
1
  require_relative 'builder'
2
2
 
3
- # The +JsonschemaSerializer::Activerecord+ module provides
4
- # a +from_activerecord+ class method to serialize some
5
- # ActiveRecord classes with the minimum effort
6
-
7
3
  module JsonschemaSerializer
8
- module ActiveRecord
9
- def self.included(klass)
10
- klass.extend(ClassMethods)
11
- end
12
- module ClassMethods
4
+ # The +JsonschemaSerializer::Activerecord+ class provides
5
+ # a +from_active_record+ class method to serialize some
6
+ # ActiveRecord classes with the minimum effort
7
+ class ActiveRecord
8
+ class << self
13
9
  # Serialize an ActiveRecord class into a
14
10
  # JsonschemaSerializer::Builder object
15
11
  #
16
- # params:
17
- # +klass+ [ActiveRecord::Base]
18
- # +only+ [Array[String]]
19
- # +except+ [Array[String]]
12
+ # Params:
13
+ # +klass+:: +ActiveRecord::Base+ class name
14
+ # +only+:: +Array+ columns as +String+
15
+ # +except+:: +Array+ columns as +String+
16
+
20
17
  def from_active_record(klass, only: nil, except: nil)
21
18
  validate_arguments(only, except)
22
19
  JsonschemaSerializer::Builder.build do |b|
@@ -1,8 +1,11 @@
1
1
  require 'json'
2
2
 
3
3
  module JsonschemaSerializer
4
+ # The +JsonschemaSerializer::Builder+ class provides
5
+ # an effective DSL to generate a valid json schema.
4
6
  class Builder
5
7
  class << self
8
+ # The +build+ class method create a new instance and applies the block
6
9
  def build
7
10
  new.tap do |builder|
8
11
  yield(builder) if block_given?
@@ -10,53 +13,187 @@ module JsonschemaSerializer
10
13
  end
11
14
  end
12
15
 
16
+ # An hash representation of the +schema+
13
17
  attr_reader :schema
14
18
 
19
+ # The +new+ method creates assigns an empty object
20
+ # to a +schema+ instance variable
15
21
  def initialize
16
- @schema ||= {
17
- type: :object,
18
- properties: {}
19
- }
22
+ @schema ||= _object
20
23
  end
21
24
 
25
+ # The +to_json+ method exports the schema as a json string
22
26
  def to_json
23
27
  @schema.to_json
24
28
  end
25
29
 
30
+ # Assigns the +title+ to the root schema object
31
+ #
32
+ # Params:
33
+ # +title+:: +String+ or +Symbol+ title field of the schema object
34
+
26
35
  def title(title)
27
36
  @schema[:title] = title
28
37
  end
29
38
 
39
+ # Assigns the +description+ to the root schema object
40
+ #
41
+ # params:
42
+ # +description+:: +String+ description field of the schema object
43
+
30
44
  def description(description)
31
45
  @schema[:description] = description
32
46
  end
33
47
 
48
+ # The +required+ method allows to provide a list of required properties
49
+ #
50
+ # params:
51
+ # +required+ [Array[String, Symbol]]
52
+
34
53
  def required(*required)
35
54
  @schema[:required] = required
36
55
  end
37
56
 
57
+ # The +properties+ method allows to access object properties
58
+ #
59
+ # e.g.:
60
+ # JsonschemaSerializer::Builder.build do |b|
61
+ # b.properties.tap do |p|
62
+ # p.merge! {}
63
+ # end
64
+ # end
65
+
38
66
  def properties
39
67
  @schema[:properties] ||= {}
40
68
  end
41
69
 
42
- def _object(**opts)
43
- { type: :object, properties: {} }.merge(opts).tap do |h|
44
- yield(h[:properties]) if block_given?
45
- end
70
+ # A base representation of the +boolean+ type.
71
+ def _boolean(**opts)
72
+ { type: :boolean }.merge(opts)
46
73
  end
47
74
 
48
- [:boolean, :integer, :number, :string].each do |attr_type|
49
- define_method("_#{attr_type}") do |**opts|
50
- { type: attr_type }.merge(opts)
51
- end
75
+ # A property representation of the +boolean+ type.
76
+ #
77
+ # Params:
78
+ # +name+:: +String+ or +Symbol+
79
+ #
80
+ # Optional Params:
81
+ # +default+:: +Boolean+ default value
82
+ # +description+:: +String+ property description
83
+ # +title+:: +String+ property title
84
+
85
+ def boolean(name, **opts)
86
+ { name => _boolean(opts) }
87
+ end
52
88
 
53
- define_method(attr_type) do |name, **opts|
54
- {
55
- name => send("_#{attr_type}", **opts)
56
- }
89
+ # A base representation of the +integer+ type.
90
+ def _integer(**opts)
91
+ { type: :integer }.merge(opts)
92
+ end
93
+
94
+ # A property representation of the +integer+ type.
95
+ #
96
+ # Params:
97
+ # +name+:: +String+ or +Symbol+
98
+ #
99
+ # Optional Params:
100
+ # +default+:: +Integer+ default value
101
+ # +description+:: +String+ property description
102
+ # +title+:: +String+ property title
103
+ # +enum+:: +Array+ property allowed values
104
+ # +minimum+:: +Integer+ property minimum value
105
+ # +maximum+:: +Integer+ property maximum value
106
+ # +multipleOf+:: +Integer+ property conditional constraint
107
+
108
+ def integer(name, **opts)
109
+ { name => _integer(opts) }
110
+ end
111
+
112
+ # A base representation of the +number+ type.
113
+ def _number(**opts)
114
+ { type: :number }.merge(opts)
115
+ end
116
+
117
+ # A property representation of the +number+ type.
118
+ #
119
+ # Params:
120
+ # +name+:: +String+ or +Symbol+
121
+ #
122
+ # Optional Params:
123
+ # +default+:: +Numeric+ default value
124
+ # +description+:: +String+ property description
125
+ # +title+:: +String+ property title
126
+ # +enum+:: +Array+ property allowed values
127
+ # +minimum+:: +Numeric+ property minimum value
128
+ # +maximum+:: +Numeric+ property maximum value
129
+ # +multipleOf+:: +Numeric+ property conditional constraint
130
+
131
+ def number(name, **opts)
132
+ { name => _number(opts) }
133
+ end
134
+
135
+ # A base representation of the +string+ type.
136
+ def _string(**opts)
137
+ { type: :string }.merge(opts)
138
+ end
139
+
140
+ # A property representation of the +string+ type.
141
+ #
142
+ # Params:
143
+ # +name+:: +String+ or +Symbol+
144
+ #
145
+ # Optional Params:
146
+ # +default+:: +String+ default value
147
+ # +description+:: +String+ property description
148
+ # +title+:: +String+ property title
149
+ # +format+:: +String+ property format for validation
150
+ # +minLength+:: +Int+ property minimum length
151
+
152
+ def string(name, **opts)
153
+ { name => _string(opts) }
154
+ end
155
+
156
+ # A base representation of the +object+ type.
157
+ #
158
+ # JsonschemaSerializer::Builder.build do |b|
159
+ # subscriber = b._object title: :subscriber, required: [:age] do |prop|
160
+ # prop.merge! b.string :first_name, title: 'First Name'
161
+ # prop.merge! b.string :last_name, title: 'Last Name'
162
+ # prop.merge! b.integer :age, title: 'Age'
163
+ # end
164
+ # end
165
+
166
+ def _object(**opts)
167
+ { type: :object, properties: {} }.merge(opts).tap do |h|
168
+ yield(h[:properties]) if block_given?
57
169
  end
58
170
  end
59
171
 
172
+ # A property representation of the +array+ type.
173
+ #
174
+ # Params:
175
+ # +name+:: +String+ or +Symbol+
176
+ # +items+:: an object representation or an array of objects
177
+ #
178
+ # Optional Params:
179
+ # +default+:: +Array+ default value
180
+ # +description+:: +String+ property description
181
+ # +title+:: +String+ property title
182
+ # +minItems+:: +Int+ property minimum length
183
+ # +maxItems+:: +Int+ property maximum length
184
+ #
185
+ # JsonschemaSerializer::Builder.build do |b|
186
+ # b.array :integers, items: {type: :integer}, minItems:5
187
+ # b.array :strings, items: b._string, default: []
188
+ #
189
+ # subscriber = b._object title: :subscriber, required: [:age] do |prop|
190
+ # prop.merge! b.string :first_name, title: 'First Name'
191
+ # prop.merge! b.string :last_name, title: 'Last Name'
192
+ # prop.merge! b.integer :age, title: 'Age'
193
+ # end
194
+ # b.array :subscribers, items: subscriber
195
+ # end
196
+ #
60
197
  def array(name, items:, **opts)
61
198
  {
62
199
  name => { type: :array, items: items }.merge(opts)
@@ -1,3 +1,3 @@
1
1
  module JsonschemaSerializer
2
- VERSION = '0.0.2'.freeze
2
+ VERSION = '0.0.3'.freeze # :nodoc:
3
3
  end
@@ -2,6 +2,5 @@ require 'jsonschema_serializer/version'
2
2
  require 'jsonschema_serializer/builder'
3
3
  require 'jsonschema_serializer/active_record'
4
4
 
5
- # :no-rdoc:
6
- module JsonschemaSerializer
5
+ module JsonschemaSerializer # :nodoc:
7
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonschema_serializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mauro Berlanda
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-19 00:00:00.000000000 Z
11
+ date: 2018-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -69,8 +69,8 @@ files:
69
69
  - ".rspec"
70
70
  - ".rubocop.yml"
71
71
  - ".travis.yml"
72
+ - CHANGELOG.md
72
73
  - Gemfile
73
- - Gemfile-pre-2
74
74
  - README.md
75
75
  - Rakefile
76
76
  - bin/console
@@ -106,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
106
  version: '0'
107
107
  requirements: []
108
108
  rubyforge_project:
109
- rubygems_version: 2.6.8
109
+ rubygems_version: 2.5.1
110
110
  signing_key:
111
111
  specification_version: 4
112
112
  summary: The purpose of this gem is to generate JsonSchema
data/Gemfile-pre-2 DELETED
@@ -1,4 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # The purpose of this Gemfile is to test old ruby versions
4
- gemspec