From 4a17ea0f29eec4571528e9f8072c4da1f7d817c1 Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Thu, 28 Nov 2013 08:38:52 -0200 Subject: [PATCH 01/11] Testing support for several Virtus Gems and Ruby versions --- .travis.yml | 4 ++++ Gemfile | 3 +++ gemfiles/virtus-0_5_x.gemfile | 8 ++++++++ gemfiles/virtus-edge.gemfile | 8 ++++++++ gemfiles/virtus-latest.gemfile | 6 ++++++ 5 files changed, 29 insertions(+) create mode 100644 gemfiles/virtus-0_5_x.gemfile create mode 100644 gemfiles/virtus-edge.gemfile create mode 100644 gemfiles/virtus-latest.gemfile diff --git a/.travis.yml b/.travis.yml index 0df4cf3..e31f50c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,10 @@ 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 diff --git a/Gemfile b/Gemfile index 24a3706..18c049d 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,9 @@ 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..12408c9 --- /dev/null +++ b/gemfiles/virtus-0_5_x.gemfile @@ -0,0 +1,8 @@ +source :rubygems + +gemspec + +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..24125d7 --- /dev/null +++ b/gemfiles/virtus-edge.gemfile @@ -0,0 +1,8 @@ +source :rubygems + +gemspec + +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..f5d5692 --- /dev/null +++ b/gemfiles/virtus-latest.gemfile @@ -0,0 +1,6 @@ +source :rubygems + +gemspec + +# Gem activesupport ~> 4.0.0 requires Ruby ~> 1.9.3 +gem 'activesupport', '~> 3.2.0' From 5063b399e064bd9a7f6745b5d263fe2f2148d304 Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Thu, 28 Nov 2013 09:28:03 -0200 Subject: [PATCH 02/11] changing source of RubyGems URL --- Gemfile | 2 +- gemfiles/virtus-0_5_x.gemfile | 2 +- gemfiles/virtus-edge.gemfile | 2 +- gemfiles/virtus-latest.gemfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 18c049d..8a501e8 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,4 @@ -source :rubygems +source 'https://rubygems.org' gemspec diff --git a/gemfiles/virtus-0_5_x.gemfile b/gemfiles/virtus-0_5_x.gemfile index 12408c9..5edea31 100644 --- a/gemfiles/virtus-0_5_x.gemfile +++ b/gemfiles/virtus-0_5_x.gemfile @@ -1,4 +1,4 @@ -source :rubygems +source 'https://rubygems.org' gemspec diff --git a/gemfiles/virtus-edge.gemfile b/gemfiles/virtus-edge.gemfile index 24125d7..eb81948 100644 --- a/gemfiles/virtus-edge.gemfile +++ b/gemfiles/virtus-edge.gemfile @@ -1,4 +1,4 @@ -source :rubygems +source 'https://rubygems.org' gemspec diff --git a/gemfiles/virtus-latest.gemfile b/gemfiles/virtus-latest.gemfile index f5d5692..e881b8a 100644 --- a/gemfiles/virtus-latest.gemfile +++ b/gemfiles/virtus-latest.gemfile @@ -1,4 +1,4 @@ -source :rubygems +source 'https://rubygems.org' gemspec From 2e16caeda86a32d9864001c1173d527d81a04359 Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Thu, 28 Nov 2013 09:35:04 -0200 Subject: [PATCH 03/11] fix for TravisCI error of unknown folder --- .travis.yml | 6 +++--- gemfiles/virtus-0_5_x.gemfile => virtus-0_5_x.gemfile | 0 gemfiles/virtus-edge.gemfile => virtus-edge.gemfile | 0 gemfiles/virtus-latest.gemfile => virtus-latest.gemfile | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename gemfiles/virtus-0_5_x.gemfile => virtus-0_5_x.gemfile (100%) rename gemfiles/virtus-edge.gemfile => virtus-edge.gemfile (100%) rename gemfiles/virtus-latest.gemfile => virtus-latest.gemfile (100%) diff --git a/.travis.yml b/.travis.yml index e31f50c..50e274d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,9 @@ 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 + - virtus-0_5_x.gemfile + - virtus-latest.gemfile + - virtus-edge.gemfile rvm: - 1.8.7 - ree diff --git a/gemfiles/virtus-0_5_x.gemfile b/virtus-0_5_x.gemfile similarity index 100% rename from gemfiles/virtus-0_5_x.gemfile rename to virtus-0_5_x.gemfile diff --git a/gemfiles/virtus-edge.gemfile b/virtus-edge.gemfile similarity index 100% rename from gemfiles/virtus-edge.gemfile rename to virtus-edge.gemfile diff --git a/gemfiles/virtus-latest.gemfile b/virtus-latest.gemfile similarity index 100% rename from gemfiles/virtus-latest.gemfile rename to virtus-latest.gemfile From 8c484cc82f8a45ab0ec89c29cb2b3fa54ee05810 Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Thu, 28 Nov 2013 09:41:37 -0200 Subject: [PATCH 04/11] fix on gem dependency version notation --- virtus-0_5_x.gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/virtus-0_5_x.gemfile b/virtus-0_5_x.gemfile index 5edea31..898a7cb 100644 --- a/virtus-0_5_x.gemfile +++ b/virtus-0_5_x.gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' gemspec -gem 'virtus', '~ 0.5.0' +gem 'virtus', '~> 0.5.0' # Gem activesupport ~> 4.0.0 requires Ruby ~> 1.9.3 gem 'activesupport', '~> 3.2.0' From 2f4e0401b868d7cebf6a32d8b7635bd15c966bfb Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Thu, 28 Nov 2013 18:11:36 -0200 Subject: [PATCH 05/11] Keeping the initial situation with the gemfiles insite gemfiles/ folder --- .travis.yml | 11 +++-------- virtus-0_5_x.gemfile => gemfiles/virtus-0_5_x.gemfile | 0 virtus-edge.gemfile => gemfiles/virtus-edge.gemfile | 0 .../virtus-latest.gemfile | 0 4 files changed, 3 insertions(+), 8 deletions(-) rename virtus-0_5_x.gemfile => gemfiles/virtus-0_5_x.gemfile (100%) rename virtus-edge.gemfile => gemfiles/virtus-edge.gemfile (100%) rename virtus-latest.gemfile => gemfiles/virtus-latest.gemfile (100%) diff --git a/.travis.yml b/.travis.yml index 50e274d..4d58b12 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,20 +3,15 @@ before_install: gem install bundler bundler_args: --without yard guard benchmarks script: "bundle exec rspec" gemfile: - - virtus-0_5_x.gemfile - - virtus-latest.gemfile - - virtus-edge.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 - jruby-19mode - jruby-head - - rbx-18mode - - rbx-19mode - ruby-head notifications: email: diff --git a/virtus-0_5_x.gemfile b/gemfiles/virtus-0_5_x.gemfile similarity index 100% rename from virtus-0_5_x.gemfile rename to gemfiles/virtus-0_5_x.gemfile diff --git a/virtus-edge.gemfile b/gemfiles/virtus-edge.gemfile similarity index 100% rename from virtus-edge.gemfile rename to gemfiles/virtus-edge.gemfile diff --git a/virtus-latest.gemfile b/gemfiles/virtus-latest.gemfile similarity index 100% rename from virtus-latest.gemfile rename to gemfiles/virtus-latest.gemfile From d6d20dcc991de3e8c911ba19c80edf8ab9967570 Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Thu, 28 Nov 2013 18:53:12 -0200 Subject: [PATCH 06/11] referencing gemspec path into Gemfiles --- gemfiles/virtus-0_5_x.gemfile | 2 +- gemfiles/virtus-edge.gemfile | 2 +- gemfiles/virtus-latest.gemfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gemfiles/virtus-0_5_x.gemfile b/gemfiles/virtus-0_5_x.gemfile index 898a7cb..93d8e36 100644 --- a/gemfiles/virtus-0_5_x.gemfile +++ b/gemfiles/virtus-0_5_x.gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gemspec +gemspec :path => '../' gem 'virtus', '~> 0.5.0' diff --git a/gemfiles/virtus-edge.gemfile b/gemfiles/virtus-edge.gemfile index eb81948..d235313 100644 --- a/gemfiles/virtus-edge.gemfile +++ b/gemfiles/virtus-edge.gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gemspec +gemspec :path => '../' gem 'virtus', :git => 'https://github.com/solnic/virtus' diff --git a/gemfiles/virtus-latest.gemfile b/gemfiles/virtus-latest.gemfile index e881b8a..32ecf86 100644 --- a/gemfiles/virtus-latest.gemfile +++ b/gemfiles/virtus-latest.gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gemspec +gemspec :path => '../' # Gem activesupport ~> 4.0.0 requires Ruby ~> 1.9.3 gem 'activesupport', '~> 3.2.0' From 7038832e826714bca71036997e611f3068240712 Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Fri, 23 May 2014 00:04:46 -0300 Subject: [PATCH 07/11] improving support to Virtus latest version --- lib/json/schematized/basic_wrapper.rb | 9 +- lib/json/schematized/virtus_0_5_x_wrapper.rb | 88 +++++++++++++++++++ lib/json/schematized/virtus_1_x_x_wrapper.rb | 78 +++++++++++++++++ lib/json/schematized/virtus_wrapper.rb | 89 +------------------- 4 files changed, 178 insertions(+), 86 deletions(-) create mode 100644 lib/json/schematized/virtus_0_5_x_wrapper.rb create mode 100644 lib/json/schematized/virtus_1_x_x_wrapper.rb diff --git a/lib/json/schematized/basic_wrapper.rb b/lib/json/schematized/basic_wrapper.rb index be4af51..cab9eed 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 From addd2c4b2f94a26f22ea735e32d619c050a9fd59 Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Fri, 23 May 2014 00:19:40 -0300 Subject: [PATCH 08/11] adjusts on CI settings --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4d58b12..e8b9bf0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,9 +10,10 @@ rvm: - 1.9.2 - 1.9.3 - 2.0.0 + - 2.1.1 - jruby-19mode - jruby-head - - ruby-head + - ree notifications: email: - manzan@gmail.com From f2e4c23a935d627b6643fa2e91f046bfc3878610 Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Fri, 23 May 2014 00:57:20 -0300 Subject: [PATCH 09/11] fix for Ruby 1.8.x support --- lib/json/schematized/basic_wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/json/schematized/basic_wrapper.rb b/lib/json/schematized/basic_wrapper.rb index cab9eed..32be6e2 100644 --- a/lib/json/schematized/basic_wrapper.rb +++ b/lib/json/schematized/basic_wrapper.rb @@ -38,7 +38,7 @@ def self.attribute_set set = [] v1x = ::Virtus.respond_to?(:module) json_schema[:properties].each_pair do |field_name, meta| - args = [field_name, BasicWrapper.meta_type(self, field_name, meta), {name: field_name}] + args = [field_name, BasicWrapper.meta_type(self, field_name, meta), {:name => field_name}] if v1x args.shift else From e7ce2bc0fcd2a0d458d7117329fbb5a98dab6d86 Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Sat, 24 May 2014 21:40:35 -0300 Subject: [PATCH 10/11] removing old Ruby versions from build --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e8b9bf0..8a3adf1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,13 +7,11 @@ gemfile: - gemfiles/virtus-latest.gemfile - gemfiles/virtus-edge.gemfile rvm: - - 1.9.2 - 1.9.3 - 2.0.0 - 2.1.1 - jruby-19mode - jruby-head - - ree notifications: email: - manzan@gmail.com From 310cddd7401f0a749062fd36fde7b9928ef08c9d Mon Sep 17 00:00:00 2001 From: Marcelo Manzan Date: Sun, 25 May 2014 00:24:05 -0300 Subject: [PATCH 11/11] New release: 0.2.3 [ci skip] --- .gitignore | 1 + json-schematized.gemspec | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) 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/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"