ember-schema 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -2
- data/lib/ember/schema.rb +26 -65
- data/lib/ember/schema/active_model.rb +84 -0
- data/lib/ember/schema/rest_pack.rb +56 -0
- data/lib/ember/schema/version.rb +1 -1
- data/lib/tasks/ember.rake +7 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 916f39406eef607fbc18202a2153630ae903354c
|
4
|
+
data.tar.gz: 9003198bddc8dc9a39a865ed89d229d7c8005d7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7415f1c58de8c8b7cf23818763ebd8108ae93fc5592b289ab11e4184b751f7bff6d12bc48053b23061d96228de8ed41de4e2dc9783f1cb8cb969beea11cfd027
|
7
|
+
data.tar.gz: f88f864da8831648a261a8e38cb2ffa7859f9caed9b444688309ec7d3f833818ff92faaec4e83e74e3e82550d990255088fcc2cbc05ff77b12c2ae8a1ae5b32f
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Ember::Schema
|
1
|
+
# UnchartedCode Ember::Schema
|
2
2
|
|
3
3
|
Generates a json schema for restpack_serializer models
|
4
4
|
|
@@ -18,7 +18,17 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
The schema will automatically be generated when you run db:migrate
|
22
|
+
|
23
|
+
```
|
24
|
+
rake db:migrate
|
25
|
+
```
|
26
|
+
|
27
|
+
and it will show up in db/schema.js. You can also fire it off manually like this
|
28
|
+
|
29
|
+
```
|
30
|
+
rake db:schema:ember
|
31
|
+
```
|
22
32
|
|
23
33
|
## Contributing
|
24
34
|
|
data/lib/ember/schema.rb
CHANGED
@@ -1,44 +1,58 @@
|
|
1
1
|
require "rake"
|
2
2
|
require "ember/schema/version"
|
3
|
+
require "ember/schema/rest_pack"
|
4
|
+
require "ember/schema/active_model"
|
3
5
|
|
4
6
|
module Ember
|
5
7
|
module Schema
|
6
|
-
def self.generate
|
8
|
+
def self.generate(type)
|
9
|
+
return unless const_defined?("::#{type.to_s}")
|
10
|
+
|
7
11
|
schema_hash = {}
|
8
|
-
# Rails.application.eager_load! # populate descendants
|
9
12
|
|
10
|
-
|
13
|
+
case type.to_s
|
14
|
+
when "RestPack::Serializer"
|
15
|
+
generator = RestPack.new
|
16
|
+
when "ActiveModel::Serializer"
|
17
|
+
generator = ActiveModel.new
|
18
|
+
else
|
19
|
+
return
|
20
|
+
end
|
21
|
+
|
22
|
+
generator.serializers.each do |serializer_class|
|
11
23
|
begin
|
12
24
|
next if serializer_class == ApplicationSerializer
|
13
25
|
next if serializer_class.respond_to?(:ignore) && serializer_class.ignore
|
14
|
-
|
26
|
+
|
27
|
+
klass = generator.get_klass(serializer_class)
|
15
28
|
if klass.present?
|
16
29
|
# if we are dealing with a polymorphic class, then process accordingly
|
17
30
|
if klass.respond_to?(:base_class) && klass != klass.base_class
|
18
31
|
p "--Skipping inherited class: '#{klass.name}', it will be processed with parent"
|
19
32
|
next
|
20
33
|
end
|
21
|
-
|
22
|
-
|
34
|
+
|
35
|
+
schema = generator.schema(serializer_class, klass)
|
36
|
+
name = generator.camelize(serializer_class, klass)
|
23
37
|
schema_hash[name] = schema
|
24
38
|
p "#{klass.name}: Complete"
|
25
39
|
# Check for inherited serializer classes now
|
26
|
-
|
40
|
+
generator.descendants(serializer_class).each do |child_serializer_class|
|
27
41
|
begin
|
28
42
|
# to be inherited, it has to have a subclass thats not the base and a klass that is inherited
|
29
43
|
if child_serializer_class == ApplicationSerializer || # skip, default class
|
30
44
|
child_serializer_class.superclass == ApplicationSerializer || # skip, base is default class, not inherited
|
31
|
-
child_serializer_class.superclass ==
|
45
|
+
child_serializer_class.superclass == generator.superclass || # skip, default class
|
32
46
|
child_serializer_class == serializer_class # skip serializer is itself
|
33
47
|
next
|
34
48
|
end
|
35
|
-
child_klass = get_klass(child_serializer_class)
|
49
|
+
child_klass = generator.get_klass(child_serializer_class)
|
36
50
|
if child_klass.present?
|
37
51
|
# if we are dealing with a polymorphic class, then process accordingly
|
38
52
|
next unless child_klass.respond_to?(:base_class) # this is not active record
|
39
53
|
next if child_klass == child_klass.base_class # this is the base class
|
40
54
|
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)
|
55
|
+
diff_schema = inherited_schema(child_serializer_class, child_klass, schema, generator)
|
42
56
|
child_name = child_klass.name.camelize
|
43
57
|
# Modify parents schema
|
44
58
|
schema[:descendants] ||= {}
|
@@ -62,61 +76,8 @@ module Ember
|
|
62
76
|
|
63
77
|
private
|
64
78
|
|
65
|
-
def self.
|
66
|
-
|
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)
|
79
|
+
def self.inherited_schema(serializer, klass, base_schema, generator)
|
80
|
+
schema = generator.schema(serializer, klass)
|
120
81
|
|
121
82
|
schema_diff = {}
|
122
83
|
schema_diff[:attributes] = diff(base_schema[:attributes], schema[:attributes])
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Ember
|
2
|
+
module Schema
|
3
|
+
class ActiveModel
|
4
|
+
def superclass
|
5
|
+
::ActiveModel::Serializer
|
6
|
+
end
|
7
|
+
|
8
|
+
def serializers
|
9
|
+
::ActiveModel::Serializer.descendants.sort_by(&:final_name)
|
10
|
+
end
|
11
|
+
|
12
|
+
def descendants(serializer)
|
13
|
+
serializers
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_klass(serializer)
|
17
|
+
module_name = serializer.name.deconstantize
|
18
|
+
class_name = serializer.root_name.camelize
|
19
|
+
full_name = [module_name, class_name].reject(&:empty?).join("::")
|
20
|
+
begin
|
21
|
+
return full_name.constantize
|
22
|
+
rescue => e
|
23
|
+
p " - Unable to find model: '#{full_name}'. Skipping schema processing."
|
24
|
+
return nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def camelize(serializer, klass)
|
29
|
+
(serializer._root || klass.name).camelize
|
30
|
+
end
|
31
|
+
|
32
|
+
def schema(serializer, klass)
|
33
|
+
columns = if klass.respond_to? :columns_hash then klass.columns_hash else {} end
|
34
|
+
|
35
|
+
attrs = {}
|
36
|
+
serializer._attributes.each do |name|
|
37
|
+
option = serializer._options[name] || {}
|
38
|
+
if option[:type].present?
|
39
|
+
attrs[name] = option[:type]
|
40
|
+
else
|
41
|
+
# If no type is given, attempt to get it from the Active Model class
|
42
|
+
if column = columns[name.to_s]
|
43
|
+
attrs[name] = column.type
|
44
|
+
else
|
45
|
+
# Other wise default to string
|
46
|
+
attrs[name] = "string"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
associations = {}
|
52
|
+
serializer._associations.each do |attr, association|
|
53
|
+
#association = association_class.new(attr, self)
|
54
|
+
|
55
|
+
if model_association = get_type(association)
|
56
|
+
# Real association.
|
57
|
+
association_class_name = association.options[:class_name]
|
58
|
+
key = association.key.gsub(/_id/,'')
|
59
|
+
associations[key] = { model_association => association_class_name || key }
|
60
|
+
associations[key][:async] = (association.options[:async] || false) if association.options.has_key? :async
|
61
|
+
associations[key][:polymorphic] = (association.options[:polymorphic] || false) if association.options.has_key? :polymorphic
|
62
|
+
else
|
63
|
+
# Computed association. We could infer has_many vs. has_one from
|
64
|
+
# the association class, but that would make it different from
|
65
|
+
# real associations, which read has_one vs. belongs_to from the
|
66
|
+
# model.
|
67
|
+
associations[association.key] = nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
return { :attributes => attrs, :associations => associations }
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_type(association)
|
75
|
+
if association.is_a? ::ActiveModel::Serializer::Association::HasMany
|
76
|
+
return "has_many"
|
77
|
+
elsif association.is_a? ::ActiveModel::Serializer::Association::HasOne
|
78
|
+
return "belongs_to"
|
79
|
+
end
|
80
|
+
return nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Ember
|
2
|
+
module Schema
|
3
|
+
class RestPack
|
4
|
+
def superclass
|
5
|
+
::RestPack::Serializer
|
6
|
+
end
|
7
|
+
|
8
|
+
def serializers
|
9
|
+
::RestPack::Serializer.class_map.sort_by { |s| s[0] }.map { |s| s[1] }
|
10
|
+
end
|
11
|
+
|
12
|
+
def descendants(serializer)
|
13
|
+
serializer.descendants.sort_by { |s| s.name }
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_klass(serializer)
|
17
|
+
serializer.model_class
|
18
|
+
end
|
19
|
+
|
20
|
+
def camelize(serializer, klass)
|
21
|
+
klass.name.camelize
|
22
|
+
end
|
23
|
+
|
24
|
+
def schema(serializer, klass)
|
25
|
+
columns = if klass.respond_to? :columns_hash then klass.columns_hash else {} end
|
26
|
+
|
27
|
+
attrs = {}
|
28
|
+
(serializer.serializable_attributes || {}).each do |id, name|
|
29
|
+
options = serializer.serializable_attributes_options[id] || {}
|
30
|
+
if options[:type].present?
|
31
|
+
attrs[name] = options[:type].to_s
|
32
|
+
else
|
33
|
+
# If no type is given, attempt to get it from the Active Model class
|
34
|
+
if column = columns[name.to_s]
|
35
|
+
attrs[name] = column.type
|
36
|
+
else
|
37
|
+
# Other wise default to string
|
38
|
+
attrs[name] = "string"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
associations = {}
|
44
|
+
|
45
|
+
serializer.can_include.each do |association_name|
|
46
|
+
if model_association = klass.reflect_on_association(association_name)
|
47
|
+
# Real association
|
48
|
+
associations[association_name] = { model_association.macro => model_association.class_name.pluralize.underscore.downcase }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
return { :attributes => attrs, :associations => associations }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/ember/schema/version.rb
CHANGED
data/lib/tasks/ember.rake
CHANGED
@@ -2,7 +2,13 @@ namespace :db do
|
|
2
2
|
namespace :schema do
|
3
3
|
desc 'Regenerate the Ember schema.js based on the serializers'
|
4
4
|
task :ember => :environment do
|
5
|
-
|
5
|
+
if defined? RestPack::Serializer
|
6
|
+
schema_hash = Ember::Schema.generate(RestPack::Serializer)
|
7
|
+
else
|
8
|
+
Rails.application.eager_load! # populate descendants
|
9
|
+
schema_hash = Ember::Schema.generate(ActiveModel::Serializer)
|
10
|
+
end
|
11
|
+
|
6
12
|
schema_json = JSON.pretty_generate(schema_hash)
|
7
13
|
File.open 'db/schema.js', 'w' do |f|
|
8
14
|
f << schema_json
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ember-schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Palmer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-02-
|
12
|
+
date: 2015-02-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -67,6 +67,8 @@ files:
|
|
67
67
|
- Rakefile
|
68
68
|
- ember-schema.gemspec
|
69
69
|
- lib/ember/schema.rb
|
70
|
+
- lib/ember/schema/active_model.rb
|
71
|
+
- lib/ember/schema/rest_pack.rb
|
70
72
|
- lib/ember/schema/version.rb
|
71
73
|
- lib/tasks/ember.rake
|
72
74
|
homepage: ''
|