jsonschema_serializer 0.0.1
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 +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.rubocop.yml +23 -0
- data/.travis.yml +40 -0
- data/Gemfile +8 -0
- data/Gemfile-pre-2 +4 -0
- data/README.md +87 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/jsonschema_serializer.gemspec +48 -0
- data/lib/jsonschema_serializer.rb +7 -0
- data/lib/jsonschema_serializer/active_record.rb +74 -0
- data/lib/jsonschema_serializer/builder.rb +67 -0
- data/lib/jsonschema_serializer/version.rb +4 -0
- metadata +111 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 395b1b884c0ae4cb6a7482c829874658d73b4263
|
4
|
+
data.tar.gz: d336c0f04228e6e9d9eed216587186f15c26b677
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a3c34d1b59ba6ff2b94f266627bb78273a41fcab30f4f7e3f391f0ef51abcda8c8a74087de5fce94dc1830ccd396feabc8c0786b2fd2ed067d0e2c1e8e4fd775
|
7
|
+
data.tar.gz: 7b05406b0c4ff3ee5d73c1dcb64935c750e80b3bd8563fface0a5ce3d762cf542d39f66c31f302a2de97e9eb966b7dfd5448c7ba05e28e24ff84d49a888d328d
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.4
|
3
|
+
Exclude:
|
4
|
+
- bin/*
|
5
|
+
- "*.gemspec"
|
6
|
+
- Gemfile
|
7
|
+
- Rakefile
|
8
|
+
|
9
|
+
Metrics/BlockLength:
|
10
|
+
Exclude:
|
11
|
+
- spec/**/*
|
12
|
+
|
13
|
+
Metrics/LineLength:
|
14
|
+
Max: 90
|
15
|
+
|
16
|
+
Style/Documentation:
|
17
|
+
Enabled: true
|
18
|
+
|
19
|
+
Style/FrozenStringLiteralComment:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
Style/SymbolArray:
|
23
|
+
EnforcedStyle: brackets
|
data/.travis.yml
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
sudo: false
|
2
|
+
|
3
|
+
language: ruby
|
4
|
+
|
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
|
+
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
|
+
- rvm: 2.1.5
|
26
|
+
gemfile: Gemfile
|
27
|
+
- rvm: 2.2.7
|
28
|
+
gemfile: Gemfile
|
29
|
+
- rvm: 2.3.4
|
30
|
+
gemfile: Gemfile
|
31
|
+
- rvm: 2.4.1
|
32
|
+
gemfile: Gemfile
|
33
|
+
- rvm: 2.5.0
|
34
|
+
gemfile: Gemfile
|
35
|
+
- rvm: ruby-head
|
36
|
+
gemfile: Gemfile
|
37
|
+
- rvm: jruby-9.0.5.0
|
38
|
+
gemfile: Gemfile
|
39
|
+
|
40
|
+
before_install: gem install bundler -v 1.16.1
|
data/Gemfile
ADDED
data/Gemfile-pre-2
ADDED
data/README.md
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# JsonschemaSerializer
|
2
|
+
|
3
|
+
[](https://travis-ci.org/mberlanda/jsonschema_serializer)
|
4
|
+
|
5
|
+
This purpose of this gem is to generate [JsonSchema](http://json-schema.org/).
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'jsonschema_serializer'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install jsonschema_serializer
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
You can generate a schema as follows:
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
schema = JsonSchema::Builder.build do |b|
|
29
|
+
|
30
|
+
subscriber = b._object title: :subscriber, required: [:age] do |prop|
|
31
|
+
prop.merge! b.string :first_name, title: 'First Name'
|
32
|
+
prop.merge! b.string :last_name, title: 'Last Name'
|
33
|
+
prop.merge! b.integer :age, title: 'Age'
|
34
|
+
end
|
35
|
+
|
36
|
+
b.title "a title"
|
37
|
+
b.description "a description"
|
38
|
+
b.required :a, :b, :c
|
39
|
+
b.properties.tap do |p|
|
40
|
+
p.merge! b.string :a, description: "abc"
|
41
|
+
p.merge! b.array :subscribers, description: "subscribers", items: subscriber
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
schema.to_json
|
46
|
+
```
|
47
|
+
|
48
|
+
Allowed parameters for data types:
|
49
|
+
|
50
|
+
- `array` : `:default, :description, items: {}||[{}], :minItems, :maxItems, :title`
|
51
|
+
- `boolean`: `:default, :description, :title`
|
52
|
+
- `integer`: `:default, :description, enum: [], :minimum, :maximum, :multipleOf, :title`
|
53
|
+
- `number` : `:default, :description, enum: [], :minimum, :maximum, :multipleOf, :title`
|
54
|
+
- `string` : `:default, :description, :format, :minLength, :title`
|
55
|
+
|
56
|
+
You can alternatively use an experimental builder for `ActiveRecord`
|
57
|
+
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
class Serializer
|
61
|
+
include JsonschemaSerializer::ActiveRecord
|
62
|
+
end
|
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])
|
67
|
+
|
68
|
+
# You can manipulate the resulting schema
|
69
|
+
|
70
|
+
schema.tap do |s|
|
71
|
+
s.title "a title"
|
72
|
+
s.description "a description"
|
73
|
+
end
|
74
|
+
|
75
|
+
schema.to_json
|
76
|
+
```
|
77
|
+
|
78
|
+
## Development
|
79
|
+
|
80
|
+
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.
|
81
|
+
|
82
|
+
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).
|
83
|
+
|
84
|
+
## Contributing
|
85
|
+
|
86
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/mberlanda/jsonschema_serializer.
|
87
|
+
ygy
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "jsonschema_serializer"
|
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(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "jsonschema_serializer/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "jsonschema_serializer"
|
8
|
+
spec.version = JsonschemaSerializer::VERSION
|
9
|
+
spec.authors = ["Mauro Berlanda"]
|
10
|
+
spec.email = ["mauro.berlanda@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{The purpose of this gem is to generate JsonSchema}
|
13
|
+
spec.description = <<-EOT
|
14
|
+
The goal behind this gem is to generate JsonSchema.
|
15
|
+
This can be done using thanks to a Builder class or
|
16
|
+
an ActiveRecord serialization module.
|
17
|
+
EOT
|
18
|
+
spec.homepage = "https://github.com/mberlanda/jsonschema_serializer"
|
19
|
+
spec.licenses = ['MIT']
|
20
|
+
|
21
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
22
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
23
|
+
spec.metadata = { "source_code_uri" => "https://github.com/mberlanda/jsonschema_serialize" }
|
24
|
+
# if spec.respond_to?(:metadata)
|
25
|
+
# spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
|
26
|
+
# else
|
27
|
+
# raise "RubyGems 2.0 or newer is required to protect against " \
|
28
|
+
# "public gem pushes."
|
29
|
+
# end
|
30
|
+
|
31
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
32
|
+
f.match(%r{^(test|spec|features)/})
|
33
|
+
end
|
34
|
+
spec.bindir = "exe"
|
35
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
36
|
+
spec.require_paths = ["lib"]
|
37
|
+
|
38
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
39
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
40
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
41
|
+
|
42
|
+
spec.extra_rdoc_files = ['README.md']
|
43
|
+
spec.rdoc_options << '--title' << 'Jsonschema Serializer' <<
|
44
|
+
'--main' << 'README.md' <<
|
45
|
+
'--line-numbers'
|
46
|
+
|
47
|
+
spec.required_ruby_version = '>= 2.1.0'
|
48
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require_relative 'builder'
|
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
|
+
module JsonschemaSerializer
|
8
|
+
# :no-rdoc:
|
9
|
+
module ActiveRecord
|
10
|
+
# :no-rdoc:
|
11
|
+
def self.included(klass)
|
12
|
+
klass.extend(ClassMethods)
|
13
|
+
end
|
14
|
+
|
15
|
+
# :no-rdoc:
|
16
|
+
module ClassMethods
|
17
|
+
# Serialize an ActiveRecord class into a
|
18
|
+
# JsonschemaSerializer::Builder object
|
19
|
+
#
|
20
|
+
# params:
|
21
|
+
# +klass+ [ActiveRecord::Base]
|
22
|
+
# +only+ [Array[String]]
|
23
|
+
# +except+ [Array[String]]
|
24
|
+
def from_active_record(klass, only: nil, except: nil)
|
25
|
+
validate_arguments(only, except)
|
26
|
+
JsonschemaSerializer::Builder.build do |b|
|
27
|
+
selected_columns(klass, only, except).each do |col|
|
28
|
+
b.properties.tap do |prop|
|
29
|
+
el = format_column_element(col)
|
30
|
+
# Handle basic case of attribute type and attribute name
|
31
|
+
prop.merge! b.send(el[:type], el[:name])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# Raise if +only+ and +except+ are both provided
|
40
|
+
def validate_arguments(only, except)
|
41
|
+
raise ArgumentError, 'only and except options both provided' if only && except
|
42
|
+
end
|
43
|
+
|
44
|
+
# Retrieves the columns and keep/discard some elements if needed
|
45
|
+
def selected_columns(klass, only, except)
|
46
|
+
klass.columns.tap do |cols|
|
47
|
+
cols.select! { |col| only.include?(col.name) } if only
|
48
|
+
cols.reject! { |col| except.include?(col.name) } if except
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Mapping Ruby types on Jsonschema types.
|
53
|
+
# This could be moved to a separate module later
|
54
|
+
|
55
|
+
TYPE_CONVERSIONS = {
|
56
|
+
boolean: :boolean,
|
57
|
+
datetime: :string,
|
58
|
+
decimal: :number,
|
59
|
+
float: :number,
|
60
|
+
integer: :integer,
|
61
|
+
text: :string
|
62
|
+
}.freeze
|
63
|
+
|
64
|
+
# Format a ActiveRecord::ConnectionAdapters::<Adapter>::Column as an Hash
|
65
|
+
def format_column_element(col)
|
66
|
+
{}.tap do |h|
|
67
|
+
h[:name] = col.name
|
68
|
+
h[:type] = TYPE_CONVERSIONS[col.type] || :string
|
69
|
+
# col.default.tap { |d| h[:default] = d if d}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module JsonschemaSerializer
|
4
|
+
# :no-rdoc:
|
5
|
+
class Builder
|
6
|
+
class << self
|
7
|
+
def build
|
8
|
+
new.tap do |builder|
|
9
|
+
yield(builder) if block_given?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :schema
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@schema ||= {
|
18
|
+
type: :object,
|
19
|
+
properties: {}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_json
|
24
|
+
@schema.to_json
|
25
|
+
end
|
26
|
+
|
27
|
+
def title(title)
|
28
|
+
@schema[:title] = title
|
29
|
+
end
|
30
|
+
|
31
|
+
def description(description)
|
32
|
+
@schema[:description] = description
|
33
|
+
end
|
34
|
+
|
35
|
+
def required(*required)
|
36
|
+
@schema[:required] = required
|
37
|
+
end
|
38
|
+
|
39
|
+
def properties
|
40
|
+
@schema[:properties] ||= {}
|
41
|
+
end
|
42
|
+
|
43
|
+
def _object(**opts)
|
44
|
+
{ type: :object, properties: {} }.merge(opts).tap do |h|
|
45
|
+
yield(h[:properties]) if block_given?
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
[:boolean, :integer, :number, :string].each do |attr_type|
|
50
|
+
define_method("_#{attr_type}") do |**opts|
|
51
|
+
{ type: attr_type }.merge(opts)
|
52
|
+
end
|
53
|
+
|
54
|
+
define_method(attr_type) do |name, **opts|
|
55
|
+
{
|
56
|
+
name => send("_#{attr_type}", **opts)
|
57
|
+
}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def array(name, items:, **opts)
|
62
|
+
{
|
63
|
+
name => { type: :array, items: items }.merge(opts)
|
64
|
+
}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jsonschema_serializer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mauro Berlanda
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-05-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
description: |2
|
56
|
+
The goal behind this gem is to generate JsonSchema.
|
57
|
+
This can be done using thanks to a Builder class or
|
58
|
+
an ActiveRecord serialization module.
|
59
|
+
email:
|
60
|
+
- mauro.berlanda@gmail.com
|
61
|
+
executables: []
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files:
|
64
|
+
- README.md
|
65
|
+
files:
|
66
|
+
- ".gitignore"
|
67
|
+
- ".rspec"
|
68
|
+
- ".rubocop.yml"
|
69
|
+
- ".travis.yml"
|
70
|
+
- Gemfile
|
71
|
+
- Gemfile-pre-2
|
72
|
+
- README.md
|
73
|
+
- Rakefile
|
74
|
+
- bin/console
|
75
|
+
- bin/setup
|
76
|
+
- jsonschema_serializer.gemspec
|
77
|
+
- lib/jsonschema_serializer.rb
|
78
|
+
- lib/jsonschema_serializer/active_record.rb
|
79
|
+
- lib/jsonschema_serializer/builder.rb
|
80
|
+
- lib/jsonschema_serializer/version.rb
|
81
|
+
homepage: https://github.com/mberlanda/jsonschema_serializer
|
82
|
+
licenses:
|
83
|
+
- MIT
|
84
|
+
metadata:
|
85
|
+
source_code_uri: https://github.com/mberlanda/jsonschema_serialize
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options:
|
88
|
+
- "--title"
|
89
|
+
- Jsonschema Serializer
|
90
|
+
- "--main"
|
91
|
+
- README.md
|
92
|
+
- "--line-numbers"
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 2.1.0
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
requirements: []
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.6.8
|
108
|
+
signing_key:
|
109
|
+
specification_version: 4
|
110
|
+
summary: The purpose of this gem is to generate JsonSchema
|
111
|
+
test_files: []
|