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 ADDED
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
6
+ coverage
7
+ json-schema/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in json_schema_builder.gemspec
4
+ gemspec
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,3 @@
1
+ module JsonSchemaBuilder
2
+ VERSION = "0.0.1"
3
+ 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,5 @@
1
+ require 'json'
2
+ require "json_schema_builder/version"
3
+ require "json_schema_builder/writer"
4
+
5
+ module JsonSchemaBuilder;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
@@ -0,0 +1,2 @@
1
+ class User < ActiveRecord::Base
2
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe JsonSchemaBuilder::Writer do
4
+
5
+ it "should get models" do
6
+ a = JsonSchemaBuilder::Writer.new
7
+ a.write.should == 'write real specs .. check spec folder til than'
8
+ end
9
+
10
+ end
@@ -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: []