diff --git a/.gitignore b/.gitignore index 9fbfae1..95a2476 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ Gemfile.lock GEM_VERSION *.gem +/gemfiles diff --git a/.travis.yml b/.travis.yml index 0df4cf3..8a3adf1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -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 diff --git a/Gemfile b/Gemfile index 24a3706..8a501e8 100644 --- a/Gemfile +++ b/Gemfile @@ -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" diff --git a/gemfiles/virtus-0_5_x.gemfile b/gemfiles/virtus-0_5_x.gemfile new file mode 100644 index 0000000..93d8e36 --- /dev/null +++ b/gemfiles/virtus-0_5_x.gemfile @@ -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' diff --git a/gemfiles/virtus-edge.gemfile b/gemfiles/virtus-edge.gemfile new file mode 100644 index 0000000..d235313 --- /dev/null +++ b/gemfiles/virtus-edge.gemfile @@ -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' diff --git a/gemfiles/virtus-latest.gemfile b/gemfiles/virtus-latest.gemfile new file mode 100644 index 0000000..32ecf86 --- /dev/null +++ b/gemfiles/virtus-latest.gemfile @@ -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' diff --git a/json-schematized.gemspec b/json-schematized.gemspec index 6e5e0f9..b9ed2a7 100644 --- a/json-schematized.gemspec +++ b/json-schematized.gemspec @@ -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" diff --git a/lib/json/schematized/basic_wrapper.rb b/lib/json/schematized/basic_wrapper.rb index be4af51..32be6e2 100644 --- a/lib/json/schematized/basic_wrapper.rb +++ b/lib/json/schematized/basic_wrapper.rb @@ -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 diff --git a/lib/json/schematized/virtus_0_5_x_wrapper.rb b/lib/json/schematized/virtus_0_5_x_wrapper.rb new file mode 100644 index 0000000..48e41c1 --- /dev/null +++ b/lib/json/schematized/virtus_0_5_x_wrapper.rb @@ -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 diff --git a/lib/json/schematized/virtus_1_x_x_wrapper.rb b/lib/json/schematized/virtus_1_x_x_wrapper.rb new file mode 100644 index 0000000..ad1cc26 --- /dev/null +++ b/lib/json/schematized/virtus_1_x_x_wrapper.rb @@ -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 diff --git a/lib/json/schematized/virtus_wrapper.rb b/lib/json/schematized/virtus_wrapper.rb index 6a6cdfd..960198c 100644 --- a/lib/json/schematized/virtus_wrapper.rb +++ b/lib/json/schematized/virtus_wrapper.rb @@ -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