Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
Gemfile.lock
GEM_VERSION
*.gem
/gemfiles
12 changes: 5 additions & 7 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,16 @@ language: ruby
before_install: gem install bundler
bundler_args: --without yard guard benchmarks
script: "bundle exec rspec"
gemfile:
- gemfiles/virtus-0_5_x.gemfile
- gemfiles/virtus-latest.gemfile
- gemfiles/virtus-edge.gemfile
rvm:
- 1.8.7
- ree
- 1.9.2
- 1.9.3
- 2.0.0
- jruby-18mode
- 2.1.1
- jruby-19mode
- jruby-head
- rbx-18mode
- rbx-19mode
- ruby-head
notifications:
email:
- manzan@gmail.com
5 changes: 4 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
source :rubygems
source 'https://rubygems.org'

gemspec

gem 'virtus', :git => 'https://github.com/solnic/virtus'

# Gem activesupport ~> 4.0.0 requires Ruby ~> 1.9.3
gem 'activesupport', '~> 3.2.0'

# RUBY_VERSION ~> "1.9.0"
# gem "debugger"

Expand Down
8 changes: 8 additions & 0 deletions gemfiles/virtus-0_5_x.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
source 'https://rubygems.org'

gemspec :path => '../'

gem 'virtus', '~> 0.5.0'

# Gem activesupport ~> 4.0.0 requires Ruby ~> 1.9.3
gem 'activesupport', '~> 3.2.0'
8 changes: 8 additions & 0 deletions gemfiles/virtus-edge.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
source 'https://rubygems.org'

gemspec :path => '../'

gem 'virtus', :git => 'https://github.com/solnic/virtus'

# Gem activesupport ~> 4.0.0 requires Ruby ~> 1.9.3
gem 'activesupport', '~> 3.2.0'
6 changes: 6 additions & 0 deletions gemfiles/virtus-latest.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
source 'https://rubygems.org'

gemspec :path => '../'

# Gem activesupport ~> 4.0.0 requires Ruby ~> 1.9.3
gem 'activesupport', '~> 3.2.0'
6 changes: 3 additions & 3 deletions json-schematized.gemspec
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
Gem::Specification.new do |s|
s.name = "json-schematized"
s.version = "0.2.2"
s.version = "0.2.3"
s.platform = Gem::Platform::RUBY
s.summary = "Object builder based on JSON-Schema"
s.require_paths = ["lib"]
s.files = `git ls-files -- Gemfile README.md lib/ script/ *.gemspec`.split("\n")
s.test_files = `git ls-files -- .rspec Gemfile spec/`.split("\n")
s.test_files = `git ls-files -- .rspec Gemfile gemfiles/ spec/`.split("\n")

s.description = ""
s.authors = ["Marcelo Manzan"]
s.email = "manzan@gmail.com"
s.homepage = "http://github.com/abril"
s.homepage = "http://github.com/kawamanza"

s.add_runtime_dependency "multi_json", "~> 1.0"
s.add_runtime_dependency "activesupport"
Expand Down
9 changes: 8 additions & 1 deletion lib/json/schematized/basic_wrapper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,15 @@ def self.modularize(json_schema)
def self.attribute_set
unless defined?(@attribute_set)
set = []
v1x = ::Virtus.respond_to?(:module)
json_schema[:properties].each_pair do |field_name, meta|
set << Virtus::Attribute.build(field_name, BasicWrapper.meta_type(self, field_name, meta))
args = [field_name, BasicWrapper.meta_type(self, field_name, meta), {:name => field_name}]
if v1x
args.shift
else
args.pop
end
set << Virtus::Attribute.build(*args)
end
@attribute_set = Virtus::AttributeSet.new(nil, set)
end
Expand Down
88 changes: 88 additions & 0 deletions lib/json/schematized/virtus_0_5_x_wrapper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# encoding: UTF-8

module JSON
module Schematized
module DSL
def virtus_module
VirtusWrapper.modularize(json_schema)
end
end

module VirtusWrapper
extend Wrapper

def self.included(base)
base.send(:include, modularize(base.json_schema))
base.extend ClassMethods
end

module ClassMethods
def json_schema_module
VirtusWrapper.modularize(json_schema)
end
end

def self.modularize(json_schema)
super(json_schema) do
include ::Virtus

VirtusWrapper.prepare_schema!(self, self.json_schema, :simple_types)
def self.included(base)
super
VirtusWrapper.prepare_schema!(base, json_schema, :complex_types)
end

def self.extend_object(base)
class_name = :ComplexTypes
(const_defined?(class_name) ?
const_get(class_name) :
const_set(class_name, Module.new)
).tap do |klass|
klass.send(:include, self) unless klass.include?(self)
base.extend klass
end
end
end
end

def self.prepare_model(ref, field_name, model_class, json_schema)
model_class.send(:include, modularize(json_schema))
end

def self.add_attribute!(ref, field_name, meta, kind)
opts = {}
klass = (kind.is_a?(Class) ? kind : kind.class)
if kind.is_a?(Class)
opts[:default] = klass.new if meta[:required] && kind.include?(::Virtus)
else
opts[:default] = kind.class.new
end
ref.attribute field_name, kind, opts
end

def self.collection_superclass
Array
end

class Array < ::Array
end

module Attribute
class Array < ::Virtus::Attribute::Array
primitive VirtusWrapper::Array
default primitive.new

def new_collection
(@primitive || self.class.primitive).new
end

def self.merge_options(type, options)
merged_options = super
klass = type.is_a?(Class) ? type : type.class
merged_options.merge(:primitive => klass)
end
end
end
end
end
end
78 changes: 78 additions & 0 deletions lib/json/schematized/virtus_1_x_x_wrapper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# encoding: UTF-8

module JSON
module Schematized
module DSL
def virtus_module
VirtusWrapper.modularize(json_schema)
end
end

module VirtusWrapper
extend Wrapper

def self.included(base)
base.send(:include, modularize(base.json_schema))
base.extend ClassMethods
end

module ClassMethods
def json_schema_module
VirtusWrapper.modularize(json_schema)
end
end

def self.modularize(json_schema)
super(json_schema) do
include ::Virtus.module

VirtusWrapper.prepare_schema!(self, self.json_schema, :simple_types)
def self.included(base)
super
VirtusWrapper.prepare_schema!(base, json_schema, :complex_types)
end

def self.extend_object(base)
class_name = :ComplexTypes
(const_defined?(class_name) ?
const_get(class_name) :
const_set(class_name, Module.new)
).tap do |klass|
klass.send(:include, self) unless klass.include?(self)
base.extend klass
end
end
end
end

def self.prepare_model(ref, field_name, model_class, json_schema)
model_class.send(:include, modularize(json_schema))
end

def self.add_attribute!(ref, field_name, meta, kind)
opts = {}
klass = (kind.is_a?(Class) ? kind : kind.class)
if kind.is_a?(Class)
opts[:default] = proc { klass.new } if meta[:required] && kind.include?(VirtusWrapper::Models)
else
opts[:default] = proc { kind.class.new }
end
ref.attribute field_name, kind, opts
end

def self.collection_superclass
Array
end

class Array < ::Array
end

module Attribute
class Array < ::Virtus::Attribute::Collection
primitive VirtusWrapper::Array
default Proc.new { |_, attribute| attribute.primitive.new }
end
end
end
end
end
89 changes: 4 additions & 85 deletions lib/json/schematized/virtus_wrapper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,89 +2,8 @@

require "virtus"

module JSON
module Schematized
module DSL
def virtus_module
VirtusWrapper.modularize(json_schema)
end
end

module VirtusWrapper
extend Wrapper

def self.included(base)
base.send(:include, modularize(base.json_schema))
base.extend ClassMethods
end

module ClassMethods
def json_schema_module
VirtusWrapper.modularize(json_schema)
end
end

def self.modularize(json_schema)
super(json_schema) do
include ::Virtus

VirtusWrapper.prepare_schema!(self, self.json_schema, :simple_types)
def self.included(base)
super
VirtusWrapper.prepare_schema!(base, json_schema, :complex_types)
end

def self.extend_object(base)
class_name = :ComplexTypes
(const_defined?(class_name) ?
const_get(class_name) :
const_set(class_name, Module.new)
).tap do |klass|
klass.send(:include, self) unless klass.include?(self)
base.extend klass
end
end
end
end

def self.prepare_model(ref, field_name, model_class, json_schema)
model_class.send(:include, modularize(json_schema))
end

def self.add_attribute!(ref, field_name, meta, kind)
opts = {}
klass = (kind.is_a?(Class) ? kind : kind.class)
if kind.is_a?(Class)
opts[:default] = klass.new if meta[:required] && kind.include?(::Virtus)
else
opts[:default] = kind.class.new
end
ref.attribute field_name, kind, opts
end

def self.collection_superclass
Array
end

class Array < ::Array
end

module Attribute
class Array < ::Virtus::Attribute::Array
primitive VirtusWrapper::Array
default primitive.new

def new_collection
(@primitive || self.class.primitive).new
end

def self.merge_options(type, options)
merged_options = super
klass = type.is_a?(Class) ? type : type.class
merged_options.merge(:primitive => klass)
end
end
end
end
end
if ::Virtus.respond_to? :module
require File.expand_path '../virtus_1_x_x_wrapper.rb', __FILE__
else
require File.expand_path '../virtus_0_5_x_wrapper.rb', __FILE__
end