ember-schema 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/ember-schema.gemspec +25 -0
- data/lib/ember/schema.rb +139 -0
- data/lib/ember/schema/version.rb +5 -0
- data/lib/tasks/ember.rake +35 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bbd2105d4a845ce5bc89f0a32104a85a623ebdb5
|
4
|
+
data.tar.gz: 0eaf1ef3bd0eb38ca5499468bc9ea83c6fbb3442
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 87905e6144ee9f53e0f0a58238ff2f1dea69a75fe2dd98e651df3692e53ef0e6ae968f2c51ce6daaf7f07f0ccbae879c5efcd3ce5ec45a39fb4104e62104f205
|
7
|
+
data.tar.gz: 4f5a879903b6442f9187c163d85598a191ab26543dd6049cfc2199edb0cf1e176da88e0c7bf8599ddc6889d2410e97b982b4faaa9afafb76d5fd17627cc61bfa
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 TODO: Write your name
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Ember::Schema
|
2
|
+
|
3
|
+
Generates a json schema for restpack_serializer models
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'ember-schema'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install ember-schema
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it ( https://github.com/[my-github-username]/ember-schema/fork )
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ember/schema/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ember-schema"
|
8
|
+
spec.version = Ember::Schema::VERSION
|
9
|
+
spec.authors = ["Nathan Palmer", "Aaron Hansen"]
|
10
|
+
spec.email = ["nathan@nathanpalmer.com"]
|
11
|
+
spec.summary = %q{Generates a json schema for restpack_serializer models}
|
12
|
+
# spec.description = %q{TODO: Write a longer description. Optional.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
|
24
|
+
spec.add_dependency "restpack_serializer"
|
25
|
+
end
|
data/lib/ember/schema.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "ember/schema/version"
|
3
|
+
|
4
|
+
module Ember
|
5
|
+
module Schema
|
6
|
+
def self.generate
|
7
|
+
schema_hash = {}
|
8
|
+
# Rails.application.eager_load! # populate descendants
|
9
|
+
|
10
|
+
RestPack::Serializer.class_map.sort_by { |s| s[0] }.map { |s| s[1] }.each do |serializer_class|
|
11
|
+
begin
|
12
|
+
next if serializer_class == ApplicationSerializer
|
13
|
+
next if serializer_class.respond_to?(:ignore) && serializer_class.ignore
|
14
|
+
klass = get_klass(serializer_class)
|
15
|
+
if klass.present?
|
16
|
+
# if we are dealing with a polymorphic class, then process accordingly
|
17
|
+
if klass.respond_to?(:base_class) && klass != klass.base_class
|
18
|
+
p "--Skipping inherited class: '#{klass.name}', it will be processed with parent"
|
19
|
+
next
|
20
|
+
end
|
21
|
+
schema = schema(serializer_class, klass)
|
22
|
+
name = klass.name.camelize
|
23
|
+
schema_hash[name] = schema
|
24
|
+
p "#{klass.name}: Complete"
|
25
|
+
# Check for inherited serializer classes now
|
26
|
+
serializer_class.descendants.sort_by { |s| s.name }.each do |child_serializer_class|
|
27
|
+
begin
|
28
|
+
# to be inherited, it has to have a subclass thats not the base and a klass that is inherited
|
29
|
+
if child_serializer_class == ApplicationSerializer || # skip, default class
|
30
|
+
child_serializer_class.superclass == ApplicationSerializer || # skip, base is default class, not inherited
|
31
|
+
child_serializer_class.superclass == RestPack::Serializer || # skip, default class
|
32
|
+
child_serializer_class == serializer_class # skip serializer is itself
|
33
|
+
next
|
34
|
+
end
|
35
|
+
child_klass = get_klass(child_serializer_class)
|
36
|
+
if child_klass.present?
|
37
|
+
# if we are dealing with a polymorphic class, then process accordingly
|
38
|
+
next unless child_klass.respond_to?(:base_class) # this is not active record
|
39
|
+
next if child_klass == child_klass.base_class # this is the base class
|
40
|
+
next unless child_klass.base_class == klass # this is not a subclass of klass
|
41
|
+
diff_schema = inherited_schema(child_serializer_class, child_klass, schema)
|
42
|
+
child_name = child_klass.name.camelize
|
43
|
+
# Modify parents schema
|
44
|
+
schema[:descendants] ||= {}
|
45
|
+
schema[:descendants][child_name] = diff_schema
|
46
|
+
p " > #{child_klass.name}: Child Complete"
|
47
|
+
end
|
48
|
+
rescue => e
|
49
|
+
p e
|
50
|
+
print e.backtrace.join("\r\n")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
rescue => e
|
55
|
+
p e
|
56
|
+
print e.backtrace.join("\r\n")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
schema_hash
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def self.get_klass(serializer)
|
66
|
+
return serializer.model_class
|
67
|
+
# module_name = serializer.name.deconstantize
|
68
|
+
# class_name = serializer.root_name.camelize
|
69
|
+
# full_name = [module_name, class_name].reject(&:empty?).join("::")
|
70
|
+
# begin
|
71
|
+
# return full_name.constantize
|
72
|
+
# rescue => e
|
73
|
+
# p " - Unable to find model: '#{full_name}'. Skipping schema processing."
|
74
|
+
# return nil
|
75
|
+
# end
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.schema(serializer, klass)
|
79
|
+
columns = if klass.respond_to? :columns_hash then klass.columns_hash else {} end
|
80
|
+
|
81
|
+
attrs = {}
|
82
|
+
(serializer.serializable_attributes || {}).each do |id, name|
|
83
|
+
options = serializer.serializable_attributes_options[id] || {}
|
84
|
+
if options[:type].present?
|
85
|
+
attrs[name] = options[:type].to_s
|
86
|
+
else
|
87
|
+
# If no type is given, attempt to get it from the Active Model class
|
88
|
+
if column = columns[name.to_s]
|
89
|
+
attrs[name] = column.type
|
90
|
+
else
|
91
|
+
# Other wise default to string
|
92
|
+
attrs[name] = "string"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
associations = {}
|
98
|
+
|
99
|
+
serializer.can_include.each do |association_name|
|
100
|
+
#association = association_class.new(attr, self)
|
101
|
+
|
102
|
+
if model_association = klass.reflect_on_association(association_name)
|
103
|
+
# Real association.
|
104
|
+
associations[association_name] = { model_association.macro => model_association.class_name.pluralize.underscore.downcase }
|
105
|
+
# elsif model_association = get_type(association)
|
106
|
+
# # Computed association. We could infer has_many vs. has_one from
|
107
|
+
# # the association class, but that would make it different from
|
108
|
+
# # real associations, which read has_one vs. belongs_to from the
|
109
|
+
# # model.
|
110
|
+
# associations[association.key] = { model_association => association.key }
|
111
|
+
end
|
112
|
+
#associations[association_name][:async] = (association.options[:async] || false) if association.options.has_key? :async
|
113
|
+
end
|
114
|
+
|
115
|
+
return { :attributes => attrs, :associations => associations }
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.inherited_schema(serializer, klass, base_schema)
|
119
|
+
schema = schema(serializer, klass)
|
120
|
+
|
121
|
+
schema_diff = {}
|
122
|
+
schema_diff[:attributes] = diff(base_schema[:attributes], schema[:attributes])
|
123
|
+
schema_diff[:associations] = diff(base_schema[:associations], schema[:associations])
|
124
|
+
return schema_diff
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.diff(base, child)
|
128
|
+
diff = {}
|
129
|
+
child.each do |key, value|
|
130
|
+
if !base.has_key?(key) || (base.has_key?(key) && base[key] != value)
|
131
|
+
diff[key] = value
|
132
|
+
end
|
133
|
+
end
|
134
|
+
return diff
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
load "tasks/ember.rake"
|
@@ -0,0 +1,35 @@
|
|
1
|
+
namespace :db do
|
2
|
+
namespace :schema do
|
3
|
+
desc 'Regenerate the Ember schema.js based on the serializers'
|
4
|
+
task :ember => :environment do
|
5
|
+
schema_hash = Ember::Schema.generate
|
6
|
+
schema_json = JSON.pretty_generate(schema_hash)
|
7
|
+
File.open 'db/schema.js', 'w' do |f|
|
8
|
+
f << schema_json
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# Automatically generate schema when migration changes occur
|
16
|
+
##
|
17
|
+
if ActiveRecord::Base.dump_schema_after_migration
|
18
|
+
namespace :db do
|
19
|
+
task :_dump => [ 'db:schema:ember' ]
|
20
|
+
end
|
21
|
+
else
|
22
|
+
namespace :db do
|
23
|
+
task :migrate do
|
24
|
+
Rake::Task['db:schema:ember'].invoke
|
25
|
+
end
|
26
|
+
|
27
|
+
namespace :migrate do
|
28
|
+
[:change, :up, :down, :reset, :redo].each do |t|
|
29
|
+
task t do
|
30
|
+
Rake::Task['db:schema:ember'].invoke
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ember-schema
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nathan Palmer
|
8
|
+
- Aaron Hansen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-02-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.6'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.6'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rake
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: restpack_serializer
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
description:
|
57
|
+
email:
|
58
|
+
- nathan@nathanpalmer.com
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- Gemfile
|
65
|
+
- LICENSE.txt
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- ember-schema.gemspec
|
69
|
+
- lib/ember/schema.rb
|
70
|
+
- lib/ember/schema/version.rb
|
71
|
+
- lib/tasks/ember.rake
|
72
|
+
homepage: ''
|
73
|
+
licenses:
|
74
|
+
- MIT
|
75
|
+
metadata: {}
|
76
|
+
post_install_message:
|
77
|
+
rdoc_options: []
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
requirements: []
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 2.2.2
|
93
|
+
signing_key:
|
94
|
+
specification_version: 4
|
95
|
+
summary: Generates a json schema for restpack_serializer models
|
96
|
+
test_files: []
|