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
107 changes: 85 additions & 22 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,32 +1,95 @@
name: CI
on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
ruby: [2.6]
active_record: [5.2, 6.0]
dry_types: [1.0, 1.2]

ruby: ['2.6']
active_record: ['5.2', '6.0']
dry_types: ['1.0', '1.2']
include:
- ruby: 2.7
active_record: 6.1
dry_types: 1.5
# Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
- ruby: '2.7'
active_record: '6.1'
dry_types: '1.6'
- ruby: '2.7'
active_record: '7.0'
dry_types: '1.6'
- ruby: '2.7'
active_record: '7.1'
dry_types: '1.6'
- ruby: '3.0'
active_record: 6.1
dry_types: 1.5
- ruby: 3.1
active_record: 7.0.1
dry_types: 1.5

runs-on: ubuntu-latest
active_record: '6.1'
dry_types: '1.6'
- ruby: '3.0'
active_record: '7.0'
dry_types: '1.6'
- ruby: '3.0'
active_record: '7.1'
dry_types: '1.6'
- ruby: '3.1'
active_record: '7.0'
dry_types: '1.6'
- ruby: '3.1'
active_record: '7.1'
dry_types: '1.6'
- ruby: '3.1'
active_record: '7.2'
dry_types: '1.6'
- ruby: '3.2'
active_record: '7.0'
dry_types: '1.6'
- ruby: '3.2'
active_record: '7.1'
dry_types: '1.6'
- ruby: '3.2'
active_record: '7.2'
dry_types: '1.6'
- ruby: '3.2'
active_record: '8.0'
dry_types: '1.6'
- ruby: '3.2'
active_record: '8.1'
dry_types: '1.6'
- ruby: '3.3'
active_record: '7.1'
dry_types: '1.6'
- ruby: '3.3'
active_record: '7.2'
dry_types: '1.6'
- ruby: '3.3'
active_record: '8.0'
dry_types: '1.6'
- ruby: '3.3'
active_record: '8.1'
dry_types: '1.6'
- ruby: '3.4'
active_record: '7.2'
dry_types: '1.6'
- ruby: '3.4'
active_record: '8.0'
dry_types: '1.6'
- ruby: '3.4'
active_record: '8.1'
dry_types: '1.6'
- ruby: '4.0'
active_record: '7.2'
dry_types: '1.6'
- ruby: '4.0'
active_record: '8.0'
dry_types: '1.6'
- ruby: '4.0'
active_record: '8.1'
dry_types: '1.6'
env:
ACTIVERECORD: ${{ matrix.active_record }}
DRY_TYPES: ${{ matrix.dry_types }}
steps:
- uses: actions/checkout@v3
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
# bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- run: ACTIVERECORD=${{ matrix.active_record}} DRY_TYPES=${{ matrix.dry_types }} bundle install
- run: ACTIVERECORD=${{ matrix.active_record}} DRY_TYPES=${{ matrix.dry_types }} bundle exec rake
- uses: actions/checkout@v6
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
- run: bundle install
- run: bundle exec rake
19 changes: 15 additions & 4 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
source "https://rubygems.org"
gemspec
gem "minitest-line"
gem "trailblazer-core-utils"

{ "dry-types" => ENV['DRY_TYPES'], "activerecord" => ENV['ACTIVERECORD']}.each do |gem_name, dependency|
next if dependency.nil?
gem gem_name, dependency
if ENV['DRY_TYPES']
gem "dry-types", ENV['DRY_TYPES']
end

gem "sqlite3", ENV.fetch('ACTIVERECORD', '5.2').to_f >= 6 ? '~> 1.4' : '~> 1.3.0'
if ENV['ACTIVERECORD']
gem "activerecord", "~> #{ENV['ACTIVERECORD']}.0"
end

activerecord_version = ENV.fetch('ACTIVERECORD', '5.2').to_f
if activerecord_version.to_f >= 8
gem "sqlite3", "~> 2.1"
elsif activerecord_version.to_f >= 6
gem "sqlite3", "~> 1.4"
else
gem "sqlite3", "~> 1.3.0"
end

# gem "declarative-builder"
6 changes: 3 additions & 3 deletions test/callback_group_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -158,11 +158,11 @@ class Group < Disposable::Callback::Group

it do
expect(Group.hooks.size).must_equal 4
expect(Group.hooks[0].to_s).must_equal "[:on_change, :change!, {}]"
assert_equal "[:on_change, :change!, {}]", Trailblazer::Core::Utils.inspect(Group.hooks[0].to_s)
# Group.hooks[1][1][:nested].hooks.to_s.must_equal "[[:on_add, [:notify_album!]],[:on_add, [:reset_song!]]]"
expect(Group.hooks[2].to_s).must_equal "[:on_change, :rehash_name!, {:property=>:title}]"
assert_equal "[:on_change, :rehash_name!, {:property=>:title}]", Trailblazer::Core::Utils.inspect(Group.hooks[2].to_s)

expect(Group.definitions.get(Group.hooks[3][1])[:nested].hooks.to_s).must_equal "[[:on_change, :sing!, {}]]"
assert_equal "[[:on_change, :sing!, {}]]", Trailblazer::Core::Utils.inspect(Group.definitions.get(Group.hooks[3][1])[:nested].hooks.to_s)
end

class EmptyGroup < Group
Expand Down
30 changes: 15 additions & 15 deletions test/rescheme_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,19 +40,19 @@ def hello
expect(decorator.new(nil).hello).must_equal "hello"
expect(decorator.new(nil).ciao).must_equal "ciao"

expect(decorator.representable_attrs.get(:id).inspect).must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>"
expect(decorator.representable_attrs.get(:title).inspect).must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :deserializer=>{:skip_parse=>\"skip lambda\"}, :name=>\"title\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"skip lambda\"}>"
assert_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:id).inspect)
assert_equal "#<Representable::Definition ==>title @options={:writeable=>false, :deserializer=>{:skip_parse=>\"skip lambda\"}, :name=>\"title\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"skip lambda\"}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:title).inspect)

songs = decorator.representable_attrs.get(:songs)
options = songs.instance_variable_get(:@options)
options[:nested].extend(Declarative::Inspect)
expect(options.inspect).must_equal "{:readable=>false, :deserializer=>{:skip_parse=>\"another lambda\", :music=>true, :writeable=>false}, :nested=>#<Class:>, :extend=>#<Class:>, :name=>\"songs\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"another lambda\", :music=>true, :writeable=>false}"
assert_equal "{:readable=>false, :deserializer=>{:skip_parse=>\"another lambda\", :music=>true, :writeable=>false}, :nested=>#<Class:>, :extend=>#<Class:>, :name=>\"songs\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"another lambda\", :music=>true, :writeable=>false}", Trailblazer::Core::Utils.inspect(options)

# nested works.
expect(options[:nested].new(nil).hello).must_equal "hello"
expect(options[:nested].new(nil).ciao).must_equal "ciao"

expect(options[:nested].representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"a crazy cool instance method\"}>"
assert_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[], :skip_parse=>\"a crazy cool instance method\"}>", Trailblazer::Core::Utils.inspect(options[:nested].representable_attrs.get(:name).inspect)
end

# :options_from and :include is optional
Expand All @@ -61,8 +61,8 @@ def hello
definitions_from: lambda { |nested| nested.definitions }
)

expect(decorator.representable_attrs.get(:id).inspect).must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>"
expect(decorator.representable_attrs.get(:title).inspect).must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :deserializer=>{:skip_parse=>\"skip lambda\"}, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>"
assert_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:id).inspect)
assert_equal "#<Representable::Definition ==>title @options={:writeable=>false, :deserializer=>{:skip_parse=>\"skip lambda\"}, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:title).inspect)
end


Expand All @@ -73,9 +73,9 @@ def hello
exclude_options: [:deserializer]
)

expect(decorator.representable_attrs.get(:id).inspect).must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>"
expect(decorator.representable_attrs.get(:title).inspect).must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>"
expect(decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>"
assert_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[]}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:id).inspect)
assert_equal "#<Representable::Definition ==>title @options={:writeable=>false, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:title).inspect)
assert_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect)
end


Expand All @@ -85,8 +85,8 @@ def hello
definitions_from: lambda { |nested| nested.definitions },
) { |dfn| dfn.merge!(amazing: true) }

expect(decorator.representable_attrs.get(:id).inspect).must_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[], :amazing=>true}>"
expect(decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[], :amazing=>true}>"
assert_equal "#<Representable::Definition ==>id @options={:name=>\"id\", :parse_filter=>[], :render_filter=>[], :amazing=>true}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:id).inspect)
assert_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[], :amazing=>true}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect)
end

it "recursive: false only copies first level" do
Expand All @@ -97,8 +97,8 @@ def hello
exclude_options: [:deserializer]
)

expect(decorator.representable_attrs.get(:title).inspect).must_equal "#<Representable::Definition ==>title @options={:writeable=>false, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>"
expect(decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>"
assert_equal "#<Representable::Definition ==>title @options={:writeable=>false, :name=>\"title\", :parse_filter=>[], :render_filter=>[]}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:title).inspect)
assert_equal "#<Representable::Definition ==>name @options={:as=>\"Name\", :deserializer=>{:skip_parse=>\"a crazy cool instance method\"}, :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>", Trailblazer::Core::Utils.inspect(decorator.representable_attrs.get(:songs).representer_module.representable_attrs.get(:name).inspect)
end

describe ":exclude_properties" do
Expand Down Expand Up @@ -145,8 +145,8 @@ class Album < Disposable::Twin
artist = decorator.representable_attrs.get(:artist)
options = artist.instance_variable_get(:@options)
nested_extend = options[:nested]
expect(options.extend(Declarative::Inspect).inspect).must_equal "{:private_name=>:artist, :nested=>#<Class:>, :name=>\"artist\", :extend=>#<Class:>, :parse_filter=>[], :render_filter=>[]}"
assert_equal "{:private_name=>:artist, :nested=>#<Class:>, :name=>\"artist\", :extend=>#<Class:>, :parse_filter=>[], :render_filter=>[]}", Trailblazer::Core::Utils.inspect(options.extend(Declarative::Inspect).inspect)
assert nested_extend < Representable::Decorator
expect(nested_extend.representable_attrs.get(:name).inspect).must_equal "#<Representable::Definition ==>name @options={:private_name=>:name, :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>"
assert_equal "#<Representable::Definition ==>name @options={:private_name=>:name, :name=>\"name\", :parse_filter=>[], :render_filter=>[]}>", Trailblazer::Core::Utils.inspect(nested_extend.representable_attrs.get(:name).inspect)
end
end
2 changes: 1 addition & 1 deletion test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# require "representable/debug"
# require "pp"
require "declarative/testing"
require "trailblazer/core"

require "disposable/twin/coercion"
DRY_TYPES_CONSTANT = Disposable::Twin::Coercion::DRY_TYPES_CONSTANT
Expand Down Expand Up @@ -78,4 +79,3 @@ def saved?
end
end
end

8 changes: 4 additions & 4 deletions test/twin/hash_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class Song < Disposable::Twin

song.sync

expect(model.inspect).must_equal "#<struct HashTest::Model id=nil, content={\"band\"=>{\"label\"=>{\"location\"=>\"San Francisco\"}}, \"releases\"=>[]}>"
assert_equal "#<struct HashTest::Model id=nil, content={\"band\"=>{\"label\"=>{\"location\"=>\"San Francisco\"}}, \"releases\"=>[]}>", Trailblazer::Core::Utils.inspect(model.inspect)
end

it "#appends to collections" do
Expand All @@ -76,7 +76,7 @@ class Song < Disposable::Twin

song.sync

expect(model.inspect).must_equal "#<struct HashTest::Model id=nil, content={\"band\"=>{\"label\"=>{}}, \"releases\"=>[{\"version\"=>1}]}>"
assert_equal "#<struct HashTest::Model id=nil, content={\"band\"=>{\"label\"=>{}}, \"releases\"=>[{\"version\"=>1}]}>", Trailblazer::Core::Utils.inspect(model.inspect)
end

it "doesn't erase existing, undeclared content" do
Expand All @@ -88,7 +88,7 @@ class Song < Disposable::Twin
# puts song.content.class.ancestors
song.sync

expect(model.inspect).must_equal "#<struct HashTest::Model id=nil, content={\"artist\"=>{}, \"band\"=>{\"label\"=>{\"location\"=>\"San Francisco\"}}, \"releases\"=>[]}>"
assert_equal "#<struct HashTest::Model id=nil, content={\"artist\"=>{}, \"band\"=>{\"label\"=>{\"location\"=>\"San Francisco\"}}, \"releases\"=>[]}>", Trailblazer::Core::Utils.inspect(model.inspect)
end

it "doesn't erase existing, undeclared content in existing content" do
Expand All @@ -99,7 +99,7 @@ class Song < Disposable::Twin

song.sync

expect(model.inspect).must_equal "#<struct HashTest::Model id=nil, content={\"band\"=>{\"label\"=>{\"owner\"=>\"Brett Gurewitz\", \"location\"=>\"San Francisco\"}, \"genre\"=>\"Punkrock\"}, \"releases\"=>[]}>"
assert_equal "#<struct HashTest::Model id=nil, content={\"band\"=>{\"label\"=>{\"owner\"=>\"Brett Gurewitz\", \"location\"=>\"San Francisco\"}, \"genre\"=>\"Punkrock\"}, \"releases\"=>[]}>", Trailblazer::Core::Utils.inspect(model.inspect)
end


Expand Down
4 changes: 2 additions & 2 deletions test/twin/inherit_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ class Compilation < Album

# definitions are not shared.
it do
expect(Twin::Album.definitions.get(:name).extend(Declarative::Inspect).inspect).must_equal "#<Disposable::Twin::Definition: @options={:fromage=>:_name, :private_name=>:name, :name=>\"name\"}>"
expect(Twin::Compilation.definitions.get(:name).extend(Declarative::Inspect).inspect).must_equal "#<Disposable::Twin::Definition: @options={:fromage=>:_name, :private_name=>:name, :name=>\"name\", :writeable=>false}>" # FIXME: where did :inherit go?
assert_equal "#<Disposable::Twin::Definition: @options={:fromage=>:_name, :private_name=>:name, :name=>\"name\"}>", Trailblazer::Core::Utils.inspect(Twin::Album.definitions.get(:name).extend(Declarative::Inspect).inspect)
assert_equal "#<Disposable::Twin::Definition: @options={:fromage=>:_name, :private_name=>:name, :name=>\"name\", :writeable=>false}>", Trailblazer::Core::Utils.inspect(Twin::Compilation.definitions.get(:name).extend(Declarative::Inspect).inspect) # FIXME: where did :inherit go?
end


Expand Down
6 changes: 3 additions & 3 deletions test/twin/unnest_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ class Twin < Disposable::Twin
end

it "copies property option" do
expect(Twin.definitions.get(:id).extend(Declarative::Inspect).inspect).must_equal %{#<Disposable::Twin::Definition: @options={:nice=>\"yes\", :private_name=>:id, :name=>\"id\", :readable=>false, :writeable=>false}>}
expect(Twin.definitions.get(:ids).extend(Declarative::Inspect).inspect).must_equal %{#<Disposable::Twin::Definition: @options={:status=>\"healthy\", :collection=>true, :private_name=>:ids, :name=>\"ids\", :readable=>false, :writeable=>false}>}
assert_equal %{#<Disposable::Twin::Definition: @options={:nice=>\"yes\", :private_name=>:id, :name=>\"id\", :readable=>false, :writeable=>false}>}, Trailblazer::Core::Utils.inspect(Twin.definitions.get(:id).extend(Declarative::Inspect).inspect)
assert_equal %{#<Disposable::Twin::Definition: @options={:status=>\"healthy\", :collection=>true, :private_name=>:ids, :name=>\"ids\", :readable=>false, :writeable=>false}>}, Trailblazer::Core::Utils.inspect(Twin.definitions.get(:ids).extend(Declarative::Inspect).inspect)
# also copies :nested.
expect(Twin.definitions.get(:email).extend(Declarative::Inspect).inspect).must_equal %{#<Disposable::Twin::Definition: @options={:private_name=>:email, :nested=>#<Class:>, :name=>\"email\", :readable=>false, :writeable=>false}>}
assert_equal %{#<Disposable::Twin::Definition: @options={:private_name=>:email, :nested=>#<Class:>, :name=>\"email\", :readable=>false, :writeable=>false}>}, Trailblazer::Core::Utils.inspect(Twin.definitions.get(:email).extend(Declarative::Inspect).inspect)
end

it "exposes accessors on top-level twin" do
Expand Down