json_schema_builder 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.
- data/.gitignore +7 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/README +26 -0
- data/Rakefile +12 -0
- data/bin/schema.rb +19 -0
- data/json_schema_builder.gemspec +28 -0
- data/lib/json_schema_builder/version.rb +3 -0
- data/lib/json_schema_builder/writer.rb +108 -0
- data/lib/json_schema_builder.rb +5 -0
- data/spec/fixtures/ar_schema.rb +13 -0
- data/spec/fixtures/user.rb +2 -0
- data/spec/json_schema_builder/writer_spec.rb +10 -0
- data/spec/spec_helper.rb +27 -0
- metadata +194 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/README
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
= JSON Schema Builder
|
2
|
+
|
3
|
+
Build a JSON schema for your ActiveRecord models. STOP your API pains!
|
4
|
+
|
5
|
+
The created schema.json files are meant as stubs and need to be enriched with
|
6
|
+
field descriptions and names. You might also want to remove or add object
|
7
|
+
properties, since the gem only uses the available ActiveRecord database fields.
|
8
|
+
|
9
|
+
== Usage
|
10
|
+
|
11
|
+
Hook the gem into your rails app and create the schema files.
|
12
|
+
|
13
|
+
gem 'json_schema_builder'
|
14
|
+
|
15
|
+
schema build
|
16
|
+
|
17
|
+
Your Models and their fields are written into JSON files which you can
|
18
|
+
pimp further.
|
19
|
+
|
20
|
+
== Test
|
21
|
+
|
22
|
+
bundle install
|
23
|
+
bundle exec rake spec
|
24
|
+
|
25
|
+
|
26
|
+
Copyright Georg Leciejewski, MIT License
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'rspec'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
desc 'Default: run specs.'
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
desc "Run specs"
|
9
|
+
RSpec::Core::RakeTask.new do |t|
|
10
|
+
t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
|
11
|
+
# Put spec opts in a file named .rspec in root
|
12
|
+
end
|
data/bin/schema.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
|
3
|
+
|
4
|
+
require 'json_schema_builder'
|
5
|
+
|
6
|
+
require 'gli'
|
7
|
+
include GLI
|
8
|
+
|
9
|
+
version JsonSchemaBuilder::VERSION
|
10
|
+
|
11
|
+
desc "Creates schema file in current directory/json-schema/*.json"
|
12
|
+
command :build do |c|
|
13
|
+
c.action do |global_options, options, args|
|
14
|
+
builder = JsonSchemaBuilder::Writer.new
|
15
|
+
builder.write
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
exit GLI.run(ARGV)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "json_schema_builder/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "json_schema_builder"
|
7
|
+
s.version = JsonSchemaBuilder::VERSION
|
8
|
+
s.authors = ["Georg Leciejewski"]
|
9
|
+
s.email = ["gl@salesking.eu"]
|
10
|
+
s.homepage = "http://www.salesking.eu"
|
11
|
+
s.summary = %q{Build JSON Schema fields for ActiveRecord models}
|
12
|
+
s.description = %q{Build JSON Schema fields for ActiveRecord models}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.add_dependency 'json'
|
20
|
+
s.add_dependency 'gli'
|
21
|
+
s.add_dependency 'activesupport'
|
22
|
+
|
23
|
+
s.add_development_dependency 'rake'
|
24
|
+
s.add_development_dependency 'simplecov'
|
25
|
+
s.add_development_dependency 'rspec'
|
26
|
+
s.add_development_dependency 'activerecord'
|
27
|
+
s.add_development_dependency 'sqlite3'
|
28
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module JsonSchemaBuilder
|
2
|
+
|
3
|
+
# Create json schema files for each model in
|
4
|
+
# Rails.root/json-schema/modelName.json
|
5
|
+
# @example
|
6
|
+
# builder = JsonSchemaBuilder::Writer.new
|
7
|
+
# builder.write
|
8
|
+
class Writer
|
9
|
+
|
10
|
+
def write
|
11
|
+
res = []
|
12
|
+
create_file_path
|
13
|
+
models_as_hash.each do |model|
|
14
|
+
file = File.join('json-schema',"#{model['title'].downcase}.json")
|
15
|
+
File.open( file, 'w+' ) {|f| f.write(JSON.pretty_generate(model)) }
|
16
|
+
res << "#{file} created"
|
17
|
+
end
|
18
|
+
puts res.join("\n")
|
19
|
+
end
|
20
|
+
|
21
|
+
def models_as_hash
|
22
|
+
out = []
|
23
|
+
models.each do |model|
|
24
|
+
obj = base_hash
|
25
|
+
obj['title'] = model.name
|
26
|
+
props = {}
|
27
|
+
model.columns_hash.each do |name, col|
|
28
|
+
prop = {}
|
29
|
+
prop['description'] = 'the field description'
|
30
|
+
prop['identity'] = true if col.primary
|
31
|
+
set_readonly(name,prop)
|
32
|
+
set_type(col.type, prop)
|
33
|
+
set_format(col.type, prop)
|
34
|
+
|
35
|
+
prop['default'] = col.default if col.default
|
36
|
+
prop['maxlength'] = col.limit if col.type == :string && col.limit
|
37
|
+
props["#{name}"] = prop
|
38
|
+
end
|
39
|
+
obj['properties'] = props
|
40
|
+
out << obj
|
41
|
+
end # models
|
42
|
+
out
|
43
|
+
end
|
44
|
+
|
45
|
+
#@return [Hash{String=>Mixed}] base json schema object hash
|
46
|
+
def base_hash
|
47
|
+
hsh = {}
|
48
|
+
hsh['type'] = 'object'
|
49
|
+
hsh['title'] = ''
|
50
|
+
hsh['description'] = 'object'
|
51
|
+
hsh['properties'] = {}
|
52
|
+
hsh['links'] = []
|
53
|
+
hsh
|
54
|
+
end
|
55
|
+
|
56
|
+
def models
|
57
|
+
#TODO call models at least once so they are in module scope .. need to go for file structure
|
58
|
+
root_dir = ROOT
|
59
|
+
Dir.glob( + '/app/models/**/*.rb').each { |file| require file }
|
60
|
+
model_names = Module.constants.select { |c| (eval "#{c}").is_a?(Class) && (eval "#{c}") < ::ActiveRecord::Base }
|
61
|
+
model_names.map{|i| "#{i}".constantize}
|
62
|
+
end
|
63
|
+
|
64
|
+
def create_file_path
|
65
|
+
FileUtils.mkdir('json-schema') unless File.exists?('json-schema')
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# Set the type of the field property
|
71
|
+
# JSON Schema types
|
72
|
+
# - string
|
73
|
+
# - number Value MUST be a number, floating point numbers are
|
74
|
+
# allowed.
|
75
|
+
# - integer Value MUST be an integer, no floating point numbers are
|
76
|
+
# allowed. This is a subset of the number type.
|
77
|
+
# - boolean
|
78
|
+
# @param [Symbol] col_type derived from ActiveRecord model
|
79
|
+
# @param [Hash{String=>String}] hsh with field properties
|
80
|
+
def set_type(col_type, hsh)
|
81
|
+
hsh['type'] = if [:date, :datetime, :text].include?(col_type)
|
82
|
+
'string'
|
83
|
+
elsif col_type == :decimal
|
84
|
+
'number'
|
85
|
+
else
|
86
|
+
"#{col_type}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Set the format for a field property
|
91
|
+
# @param [Symbol] col_type derived from ActiveRecord model
|
92
|
+
# @param [Hash{String=>String}] hsh with field properties
|
93
|
+
def set_format(col_type, hsh)
|
94
|
+
hsh['format'] = if col_type == :datetime
|
95
|
+
'date-time'
|
96
|
+
elsif col_type == :date
|
97
|
+
'date'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Set a field to read-only
|
102
|
+
# @param [String] col_name derived from ActiveRecord model
|
103
|
+
# @param [Hash{String=>String}] hsh with field properties
|
104
|
+
def set_readonly(col_name, hsh)
|
105
|
+
hsh['readonly'] = true if ['created_at', 'updated_at', 'id'].include?(col_name)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
ActiveRecord::Schema.define(:version => 0) do
|
3
|
+
|
4
|
+
create_table :users do |t|
|
5
|
+
t.integer :number
|
6
|
+
t.string :name, :limit => 128
|
7
|
+
t.decimal :amount, :precision => 16, :scale => 4
|
8
|
+
t.boolean :is_admin
|
9
|
+
t.text :notes
|
10
|
+
t.date :birthday
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'simplecov'
|
3
|
+
require 'active_record'
|
4
|
+
require 'active_support'
|
5
|
+
|
6
|
+
SimpleCov.start do
|
7
|
+
root File.join(File.dirname(__FILE__), '..')
|
8
|
+
add_filter "/bin/"
|
9
|
+
add_filter "/spec/"
|
10
|
+
end
|
11
|
+
|
12
|
+
$:.unshift(File.dirname(__FILE__))
|
13
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
require 'json_schema_builder'
|
15
|
+
require 'fixtures/user'
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
19
|
+
config.run_all_when_everything_filtered = true
|
20
|
+
config.filter_run :focus
|
21
|
+
end
|
22
|
+
|
23
|
+
ActiveRecord::Base.establish_connection({
|
24
|
+
'adapter' => 'sqlite3',
|
25
|
+
'database' => ':memory:'
|
26
|
+
})
|
27
|
+
load(File.join(File.dirname(__FILE__), 'fixtures/ar_schema.rb'))
|
metadata
ADDED
@@ -0,0 +1,194 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: json_schema_builder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Georg Leciejewski
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: json
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: gli
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: activesupport
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rake
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: simplecov
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rspec
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: activerecord
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: sqlite3
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
description: Build JSON Schema fields for ActiveRecord models
|
143
|
+
email:
|
144
|
+
- gl@salesking.eu
|
145
|
+
executables:
|
146
|
+
- schema.rb
|
147
|
+
extensions: []
|
148
|
+
extra_rdoc_files: []
|
149
|
+
files:
|
150
|
+
- .gitignore
|
151
|
+
- .rspec
|
152
|
+
- Gemfile
|
153
|
+
- README
|
154
|
+
- Rakefile
|
155
|
+
- bin/schema.rb
|
156
|
+
- json_schema_builder.gemspec
|
157
|
+
- lib/json_schema_builder.rb
|
158
|
+
- lib/json_schema_builder/version.rb
|
159
|
+
- lib/json_schema_builder/writer.rb
|
160
|
+
- spec/fixtures/ar_schema.rb
|
161
|
+
- spec/fixtures/user.rb
|
162
|
+
- spec/json_schema_builder/writer_spec.rb
|
163
|
+
- spec/spec_helper.rb
|
164
|
+
homepage: http://www.salesking.eu
|
165
|
+
licenses: []
|
166
|
+
post_install_message:
|
167
|
+
rdoc_options: []
|
168
|
+
require_paths:
|
169
|
+
- lib
|
170
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
171
|
+
none: false
|
172
|
+
requirements:
|
173
|
+
- - ! '>='
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '0'
|
176
|
+
segments:
|
177
|
+
- 0
|
178
|
+
hash: 1344306613222541531
|
179
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
|
+
none: false
|
181
|
+
requirements:
|
182
|
+
- - ! '>='
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
185
|
+
segments:
|
186
|
+
- 0
|
187
|
+
hash: 1344306613222541531
|
188
|
+
requirements: []
|
189
|
+
rubyforge_project:
|
190
|
+
rubygems_version: 1.8.24
|
191
|
+
signing_key:
|
192
|
+
specification_version: 3
|
193
|
+
summary: Build JSON Schema fields for ActiveRecord models
|
194
|
+
test_files: []
|