Diff of the two buildlogs: -- --- b1/build.log 2024-05-06 02:40:43.186390749 +0000 +++ b2/build.log 2024-05-06 02:42:53.032868820 +0000 @@ -1,6 +1,6 @@ I: pbuilder: network access will be disabled during build -I: Current time: Sat Jun 7 21:02:52 -12 2025 -I: pbuilder-time-stamp: 1749373372 +I: Current time: Mon May 6 16:40:45 +14 2024 +I: pbuilder-time-stamp: 1714963245 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/trixie-reproducible-base.tgz] I: copying local configuration @@ -29,52 +29,84 @@ dpkg-source: info: applying 0003-Replace-deprecated-Fixnum-by-Integer-in-tests.patch I: using fakeroot in build. I: Installing the build-deps -I: user script /srv/workspace/pbuilder/3508570/tmp/hooks/D02_print_environment starting +I: user script /srv/workspace/pbuilder/1125425/tmp/hooks/D01_modify_environment starting +debug: Running on ionos11-amd64. +I: Changing host+domainname to test build reproducibility +I: Adding a custom variable just for the fun of it... +I: Changing /bin/sh to bash +'/bin/sh' -> '/bin/bash' +lrwxrwxrwx 1 root root 9 May 6 02:41 /bin/sh -> /bin/bash +I: Setting pbuilder2's login shell to /bin/bash +I: Setting pbuilder2's GECOS to second user,second room,second work-phone,second home-phone,second other +I: user script /srv/workspace/pbuilder/1125425/tmp/hooks/D01_modify_environment finished +I: user script /srv/workspace/pbuilder/1125425/tmp/hooks/D02_print_environment starting I: set - BUILDDIR='/build/reproducible-path' - BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other' - BUILDUSERNAME='pbuilder1' - BUILD_ARCH='amd64' - DEBIAN_FRONTEND='noninteractive' - DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=42 ' - DISTRIBUTION='trixie' - HOME='/root' - HOST_ARCH='amd64' + BASH=/bin/sh + BASHOPTS=checkwinsize:cmdhist:complete_fullquote:extquote:force_fignore:globasciiranges:globskipdots:hostcomplete:interactive_comments:patsub_replacement:progcomp:promptvars:sourcepath + BASH_ALIASES=() + BASH_ARGC=() + BASH_ARGV=() + BASH_CMDS=() + BASH_LINENO=([0]="12" [1]="0") + BASH_LOADABLES_PATH=/usr/local/lib/bash:/usr/lib/bash:/opt/local/lib/bash:/usr/pkg/lib/bash:/opt/pkg/lib/bash:. + BASH_SOURCE=([0]="/tmp/hooks/D02_print_environment" [1]="/tmp/hooks/D02_print_environment") + BASH_VERSINFO=([0]="5" [1]="2" [2]="21" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") + BASH_VERSION='5.2.21(1)-release' + BUILDDIR=/build/reproducible-path + BUILDUSERGECOS='second user,second room,second work-phone,second home-phone,second other' + BUILDUSERNAME=pbuilder2 + BUILD_ARCH=amd64 + DEBIAN_FRONTEND=noninteractive + DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=20 ' + DIRSTACK=() + DISTRIBUTION=trixie + EUID=0 + FUNCNAME=([0]="Echo" [1]="main") + GROUPS=() + HOME=/root + HOSTNAME=i-capture-the-hostname + HOSTTYPE=x86_64 + HOST_ARCH=amd64 IFS=' ' - INVOCATION_ID='18c7cda00007492195ed671046fc49d2' - LANG='C' - LANGUAGE='en_US:en' - LC_ALL='C' - MAIL='/var/mail/root' - OPTIND='1' - PATH='/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' - PBCURRENTCOMMANDLINEOPERATION='build' - PBUILDER_OPERATION='build' - PBUILDER_PKGDATADIR='/usr/share/pbuilder' - PBUILDER_PKGLIBDIR='/usr/lib/pbuilder' - PBUILDER_SYSCONFDIR='/etc' - PPID='3508570' - PS1='# ' - PS2='> ' + INVOCATION_ID=9c39782e01d747129c45d4a4c0a2cc57 + LANG=C + LANGUAGE=et_EE:et + LC_ALL=C + MACHTYPE=x86_64-pc-linux-gnu + MAIL=/var/mail/root + OPTERR=1 + OPTIND=1 + OSTYPE=linux-gnu + PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path + PBCURRENTCOMMANDLINEOPERATION=build + PBUILDER_OPERATION=build + PBUILDER_PKGDATADIR=/usr/share/pbuilder + PBUILDER_PKGLIBDIR=/usr/lib/pbuilder + PBUILDER_SYSCONFDIR=/etc + PIPESTATUS=([0]="0") + POSIXLY_CORRECT=y + PPID=1125425 PS4='+ ' - PWD='/' - SHELL='/bin/bash' - SHLVL='2' - SUDO_COMMAND='/usr/bin/timeout -k 18.1h 18h /usr/bin/ionice -c 3 /usr/bin/nice /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.qfkb9SME/pbuilderrc_IvHP --distribution trixie --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/trixie-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.qfkb9SME/b1 --logfile b1/build.log ruby-virtus_2.0.0-2.dsc' - SUDO_GID='111' - SUDO_UID='106' - SUDO_USER='jenkins' - TERM='unknown' - TZ='/usr/share/zoneinfo/Etc/GMT+12' - USER='root' - _='/usr/bin/systemd-run' - http_proxy='http://213.165.73.152:3128' + PWD=/ + SHELL=/bin/bash + SHELLOPTS=braceexpand:errexit:hashall:interactive-comments:posix + SHLVL=3 + SUDO_COMMAND='/usr/bin/timeout -k 24.1h 24h /usr/bin/ionice -c 3 /usr/bin/nice -n 11 /usr/bin/unshare --uts -- /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.qfkb9SME/pbuilderrc_0Eql --distribution trixie --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/trixie-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.qfkb9SME/b2 --logfile b2/build.log ruby-virtus_2.0.0-2.dsc' + SUDO_GID=111 + SUDO_UID=106 + SUDO_USER=jenkins + TERM=unknown + TZ=/usr/share/zoneinfo/Etc/GMT-14 + UID=0 + USER=root + _='I: set' + http_proxy=http://46.16.76.132:3128 I: uname -a - Linux ionos15-amd64 6.6.13+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.6.13-1~bpo12+1 (2024-02-15) x86_64 GNU/Linux + Linux i-capture-the-hostname 6.1.0-20-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.85-1 (2024-04-11) x86_64 GNU/Linux I: ls -l /bin - lrwxrwxrwx 1 root root 7 Jun 5 14:46 /bin -> usr/bin -I: user script /srv/workspace/pbuilder/3508570/tmp/hooks/D02_print_environment finished + lrwxrwxrwx 1 root root 7 May 3 08:24 /bin -> usr/bin +I: user script /srv/workspace/pbuilder/1125425/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy @@ -270,7 +302,7 @@ Get: 140 http://deb.debian.org/debian trixie/main amd64 ruby-rspec-expectations all 3.13.0c0e0m0s1-2 [90.2 kB] Get: 141 http://deb.debian.org/debian trixie/main amd64 ruby-rspec-mocks all 3.13.0c0e0m0s1-2 [81.3 kB] Get: 142 http://deb.debian.org/debian trixie/main amd64 ruby-rspec all 3.13.0c0e0m0s1-2 [5184 B] -Fetched 47.2 MB in 1s (82.5 MB/s) +Fetched 47.2 MB in 1s (49.8 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libpython3.11-minimal:amd64. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 19694 files and directories currently installed.) @@ -741,8 +773,8 @@ Setting up tzdata (2024a-3) ... Current default time zone: 'Etc/UTC' -Local time is now: Sun Jun 8 09:03:24 UTC 2025. -Universal Time is now: Sun Jun 8 09:03:24 UTC 2025. +Local time is now: Mon May 6 02:41:51 UTC 2024. +Universal Time is now: Mon May 6 02:41:51 UTC 2024. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up autotools-dev (20220109.1) ... @@ -877,7 +909,11 @@ fakeroot is already the newest version (1.33-1). 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. I: Building the package -I: Running cd /build/reproducible-path/ruby-virtus-2.0.0/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S > ../ruby-virtus_2.0.0-2_source.changes +I: user script /srv/workspace/pbuilder/1125425/tmp/hooks/A99_set_merged_usr starting +Not re-configuring usrmerge for trixie +I: user script /srv/workspace/pbuilder/1125425/tmp/hooks/A99_set_merged_usr finished +hostname: Name or service not known +I: Running cd /build/reproducible-path/ruby-virtus-2.0.0/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-genchanges -S > ../ruby-virtus_2.0.0-2_source.changes dpkg-buildpackage: info: source package ruby-virtus dpkg-buildpackage: info: source version 2.0.0-2 dpkg-buildpackage: info: source distribution unstable @@ -962,413 +998,357 @@ RUBYLIB=/build/reproducible-path/ruby-virtus-2.0.0/debian/ruby-virtus/usr/lib/ruby/vendor_ruby:. GEM_PATH=/build/reproducible-path/ruby-virtus-2.0.0/debian/ruby-virtus/usr/share/rubygems-integration/all:/build/reproducible-path/ruby-virtus-2.0.0/debian/.debhelper/generated/_source/home/.local/share/gem/ruby/3.1.0:/var/lib/gems/3.1.0:/usr/local/lib/ruby/gems/3.1.0:/usr/lib/ruby/gems/3.1.0:/usr/lib/x86_64-linux-gnu/ruby/gems/3.1.0:/usr/share/rubygems-integration/3.1.0:/usr/share/rubygems-integration/all:/usr/lib/x86_64-linux-gnu/rubygems-integration/3.1.0 ruby3.1 -S rake --rakelibdir /gem2deb-nonexistent -f debian/ruby-tests.rake /usr/bin/ruby3.1 -I/usr/share/rubygems-integration/all/gems/rspec-support-3.13.1/lib:/usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/lib /usr/share/rubygems-integration/all/gems/rspec-core-3.13.0/exe/rspec --pattern ./spec/\*\*/\*_spec.rb --format documentation -Randomized with seed 729 - -Using Struct as an embedded value attribute - initialize a struct object with correct attributes - -default values - you can pass a 'callable-object' to the :default option - without a default the value is nil - you can reset attribute to its default - you can set defaults for private attributes - can be supplied with the :default option - an Array - without a default the value is an empty Array - a ValueObject - does not duplicate the ValueObject - a Set - without a default the value is an empty Set - a Hash - without a default the value is an empty Hash - -Virtus#[] - is expected to eq "foo" - -Virtus::Attribute::Collection#value_coerced? - when the input is empty - is expected to equal true - when input has incorrectly typed members - is expected to equal false - when the collection type is incorrect - is expected to equal false - when input has correctly typed members - is expected to equal true - -I can extend objects - defining attributes on an object - -Virtus::Attribute::Hash#coerce - when input is coercible to hash - is expected to eq {:hello=>"World"} - when input is not coercible to hash - is expected to equal "not really a hash" - when input is a hash - when key type is an array and value type is another hash - coerces keys and values - when key/value types are primitives - uses coercer to coerce key and value - when key/value types are EVs - coerces keys and values - -Virtus::AttributeSet#<< - with a new attribute - indexes the new attribute under its #name property - adds an attribute - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - indexes the new attribute under the string version of its #name property - with a duplicate attribute - replaces the original attribute object - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - -Virtus.finalize - automatically resolves constant when it is already available - it finalizes type for an EV attribute - it finalizes value type for a hash attribute - sets attributes that don't require finalization - it finalizes member type for a collection attribute - it finalizes key type for a hash attribute - -Adding attribute called 'attributes' - when mass assignment is disabled - doesn't accept `attributes` key in initializer - allows model to use `attributes` attribute - -embedded values - #attributes returns instances of the embedded values - allows you to pass a hash for the embedded value +Randomized with seed 12639 Virtus::ValueObject using deprecated inclusion behaves like a valid value object + defines #== sets private writers - disallows cloning defines #inspect + defines #eql? + disallows cloning defines #hash - defines #== allows to construct new values using #with - defines #eql? - #name - is expected to eql "Jane Doe" #id is expected to equal 1 + #name + is expected to eql "Jane Doe" using new values {} block - without mass-assignment + with mass-assignment behaves like a valid value object - allows to construct new values using #with defines #hash - defines #inspect - disallows cloning defines #eql? defines #== + disallows cloning sets private writers - #name - is expected to eql "Jane Doe" + allows to construct new values using #with + defines #inspect #id is expected to equal 1 - with mass-assignment + #name + is expected to eql "Jane Doe" + behaves like a valid value object with mass-assignment turned on + disallows mass-assignment with a model subclass behaves like a valid value object sets private writers for additional values - defines valid #== for a subclass - disallows cloning - sets private writers + defines #inspect + defines #== allows to construct new values using #with defines #hash defines #eql? - defines #== - defines #inspect + defines valid #== for a subclass + disallows cloning + sets private writers #name is expected to eql "Jane Doe" #email is expected to eql "jane@doe.com" #id is expected to equal 1 + without mass-assignment behaves like a valid value object - defines #inspect - defines #hash defines #== - sets private writers - allows to construct new values using #with defines #eql? + allows to construct new values using #with disallows cloning - #name - is expected to eql "Jane Doe" + sets private writers + defines #hash + defines #inspect #id is expected to equal 1 - behaves like a valid value object with mass-assignment turned on - disallows mass-assignment + #name + is expected to eql "Jane Doe" -Virtus#[]= - is expected to change `object.test` from nil to "foo" +virtus attribute definitions + the constructor accepts a hash for mass-assignment + virtus creates accessor methods + Boolean attributes have a predicate method + inheritance + lets you add attributes to the subclass at runtime + lets you add attributes to the base class at runtime + inherits all the attributes from the base class + with attributes + #to_h returns the object's attributes as a hash + #attributes returns the object's attributes as a hash + #to_hash returns the object's attributes as a hash + +mass assignment with accessors + works uppon instantiation + respects accessor visibility + can be set with #attributes= + +Package + #dimensions + should be coerced to [Symbol => Float] format + is expected to have key :height + is expected to have key :width + is expected to have key :length + has 3 keys + #meta_info + has 2 keys + should be coerced to [String => String] format + is expected to have key "from" + is expected to have key "to" I can create a Virtus module - including a custom module with strict enabled including a custom module with coercion disabled - including a custom module with coercion enabled including a custom module with nullify blank enabled + including a custom module with coercion enabled + including a custom module with strict enabled -Virtus::Attribute::Collection#coerce - when input is an array - when member type is a hash with key/value coercion - coerces members - when member type is a primitive - uses coercer to coerce members - when member type is an EV - coerces members - when input is nil - returns nil - -User - is expected to respond to #addresses= - is expected to respond to #addresses - is expected to respond to #phone_numbers= - is expected to respond to #phone_numbers - #phone_numbers - first entry - is expected to be an instance of PhoneNumber - #number - is expected to eql "212-555-1212" - last entry - is expected to be an instance of PhoneNumber - #number - is expected to eql "919-444-3265" - #addresses - is expected to be an instance of Address - #locality - is expected to eql "Anytown" - #address - is expected to eql "1234 Any St." - #postal_code - is expected to eql "21234" - #region - is expected to eql "DC" +custom collection attributes + with an enumerable + behaves like a collection + coerces an empty array + can be used as Virtus attributes + coerces nil + defaults to an empty collection + coerces an array of attribute hashes + coerces its members + with an array subclass + behaves like a collection + coerces its members + defaults to an empty collection + coerces nil + can be used as Virtus attributes + coerces an empty array + coerces an array of attribute hashes -Virtus::Attribute::Boolean#coerce - when strict is turned on - with a non-coercible input - raises coercion error - with a coercible input - is expected to equal true - when strict is turned off - with a truthy value - is expected to equal true - with a falsy value - is expected to equal false +Virtus.model + when mass-assignment is disabled + with an instance + is expected not to respond to #attributes= + is expected not to respond to #attributes + with a class + is expected not to respond to #attributes + is expected not to respond to #attributes= + when :required is set + with a class + has attributes with :required option inherited from module + with an instance + has attributes with strict set to true + when constructor is disabled + does not accept attribute hash in the constructor + when strict mode is enabled + with an instance + has attributes with strict set to true + with a class + has attributes with strict set to true + with default configuration + with a class + defaults to Object for attribute type + behaves like a model with mass-assignment + accepts attribute hash + with a sub-class + has its own attributes + behaves like a model with mass-assignment + accepts attribute hash + behaves like a model with strict mode turned off + has attributes with strict set to false + behaves like a model with constructor + accepts attribute hash + behaves like a model with strict mode turned off + has attributes with strict set to false + behaves like a model with constructor + accepts attribute hash + with an instance + behaves like a model with strict mode turned off + has attributes with strict set to false + behaves like a model with mass-assignment + accepts attribute hash -Virtus::Attribute#defined? - when the attribute value has not been defined - is expected to equal false - when the attribute value has been defined - is expected to equal true +Virtus::Attribute.build + when options specify lazy accessor + is expected to be lazy + behaves like a valid attribute instance + is expected to be frozen + is expected to be an instance of Virtus::Attribute + when custom attribute class exists for a given array with member coercion defined + is expected to be an instance of # + #type + is expected to be < Axiom::Types::Collection + when type is a range + #type + is expected to equal Axiom::Types::Object (Enumerable) + behaves like a valid attribute instance + is expected to be an instance of Virtus::Attribute + is expected to be frozen + when custom attribute class exists for a given primitive + is expected to be an instance of # + #type + is expected to equal Axiom::Types::Object (BasicObject) + when options specify strict mode + is expected to be strict + behaves like a valid attribute instance + is expected to be frozen + is expected to be an instance of Virtus::Attribute + when options specify reader visibility + is expected not to be public reader + is expected to be public writer + behaves like a valid attribute instance + is expected to be an instance of Virtus::Attribute + is expected to be frozen + when type is an axiom type + #type + is expected to equal Axiom::Types::Integer (Integer) + behaves like a valid attribute instance + is expected to be frozen + is expected to be an instance of Virtus::Attribute + when options specify nullify blank mode + is expected to be nullify blank + behaves like a valid attribute instance + is expected to be frozen + is expected to be an instance of Virtus::Attribute + without options + is expected to be public reader + is expected not to be lazy + is expected to be coercible + sets up a coercer + is expected to be public writer + behaves like a valid attribute instance + is expected to be an instance of Virtus::Attribute + is expected to be frozen + when type is a string + behaves like a valid attribute instance + is expected to be an instance of Virtus::Attribute + is expected to be frozen + #type + is expected to equal Axiom::Types::Integer (Integer) + when type is a symbol of an existing class constant + behaves like a valid attribute instance + is expected to be an instance of Virtus::Attribute + is expected to be frozen + #type + is expected to equal Axiom::Types::String (String) + when coercion is turned off in options + is expected not to be coercible + behaves like a valid attribute instance + is expected to be frozen + is expected to be an instance of Virtus::Attribute + when custom collection-like attribute class exists for a given enumerable primitive + is expected to be an instance of # + #type + is expected to be < Axiom::Types::Collection + when name is passed as a string + #name + is expected to equal :something + when options specify writer visibility + is expected not to be public writer + is expected to be public reader + behaves like a valid attribute instance + is expected to be an instance of Virtus::Attribute + is expected to be frozen -Virtus::Attribute::Collection custom subclass - when primitive is set on the attribute subclass - #primitive - is expected to equal # - when primitive is not set on the attribute subclass - #primitive - is expected to equal # +Virtus::Attribute#set + is expected to equal "Jane Doe" + without coercion + is expected to change `instance.test` to "Jane Doe" + with coercion + is expected to change `instance.test` to "Jane Doe" Virtus::Attribute.build - when strict mode is used - sets strict mode for member type - when type is Set[Float] + when type is a custom collection instance sets member type behaves like a valid collection attribute instance - is expected to be frozen is expected to be an instance of Virtus::Attribute::Collection - when type is a custom collection instance + is expected to be frozen + when type is Set[Float] sets member type behaves like a valid collection attribute instance is expected to be frozen is expected to be an instance of Virtus::Attribute::Collection when type is Array subclass behaves like a valid collection attribute instance - is expected to be an instance of Virtus::Attribute::Collection is expected to be frozen - when type is Array[Virtus::Attribute::Boolean] + is expected to be an instance of Virtus::Attribute::Collection + when type is Array[Float] sets member type behaves like a valid collection attribute instance is expected to be frozen is expected to be an instance of Virtus::Attribute::Collection + when type is Array[String, Integer] + is expected to raise NotImplementedError with "build SumType from list of types ([String, Integer])" when type is an Enumerable behaves like a valid collection attribute instance - is expected to be frozen is expected to be an instance of Virtus::Attribute::Collection - when type is Array[String, Integer] - is expected to raise NotImplementedError with "build SumType from list of types ([String, Integer])" - when type is Set + is expected to be frozen + when type is Array sets default member type behaves like a valid collection attribute instance is expected to be frozen is expected to be an instance of Virtus::Attribute::Collection - when type is Array + when type is Set sets default member type behaves like a valid collection attribute instance is expected to be an instance of Virtus::Attribute::Collection is expected to be frozen - when type is Array[Float] + when type is Array[Virtus::Attribute::Boolean] sets member type behaves like a valid collection attribute instance is expected to be an instance of Virtus::Attribute::Collection is expected to be frozen + when strict mode is used + sets strict mode for member type -Virtus#attribute - raises error when :name is a reserved name on a class - returns self - raises error when :name is a reserved name on an instance - allows :attributes as an attribute name when mass-assignment is not included - allows specifying attribute without type - with a module - included in the class - behaves like an object with string attribute - can write and read the attribute - is expected to respond to #test= - is expected to respond to #test - included in the class - adds attributes from the module to a class that includes it - behaves like an object with string attribute - is expected to respond to #test - is expected to respond to #test= - can write and read the attribute - with a class - when type is :Boolean - behaves like a class with boolean attribute - defines reader and writer - defines predicate method - with a subclass - behaves like a class with boolean attribute - defines predicate method - gets attributes from the parent class - defines reader and writer - when type is Axiom::Types::Boolean - behaves like a class with boolean attribute - defines reader and writer (PENDING: this will be fixed once Attribute::Boolean subclass is gone) - defines predicate method (PENDING: this will be fixed once Attribute::Boolean subclass is gone) - when type is Boolean - behaves like a class with boolean attribute - defines predicate method - defines reader and writer - when type is Decimal - maps type to the corresponding axiom type - when type is "Boolean" - behaves like a class with boolean attribute - defines reader and writer - defines predicate method - using custom module - is expected to respond to #test= - writes and reads attributes - is expected to respond to #test - with an instance - behaves like an object with string attribute - can write and read the attribute - is expected to respond to #test - is expected to respond to #test= - -Using required attributes - raises coercion error when required attribute is nil - does not raise coercion error when not required attribute is nil +Virtus#set_default_attributes! + is expected to equal #<#:0x00007f9883c6e210 @age=30, @name="foo"> + #age + is expected to equal 30 + #name + is expected to eql "foo" -Virtus.model - when strict mode is enabled - with a class - has attributes with strict set to true - with an instance - has attributes with strict set to true - with default configuration - with a class - defaults to Object for attribute type - behaves like a model with mass-assignment - accepts attribute hash - behaves like a model with strict mode turned off - has attributes with strict set to false - behaves like a model with constructor - accepts attribute hash - with a sub-class - has its own attributes - behaves like a model with constructor - accepts attribute hash - behaves like a model with mass-assignment - accepts attribute hash - behaves like a model with strict mode turned off - has attributes with strict set to false - with an instance - behaves like a model with strict mode turned off - has attributes with strict set to false - behaves like a model with mass-assignment - accepts attribute hash - when mass-assignment is disabled - with an instance - is expected not to respond to #attributes - is expected not to respond to #attributes= - with a class - is expected not to respond to #attributes= - is expected not to respond to #attributes - when :required is set - with a class - has attributes with :required option inherited from module - with an instance - has attributes with strict set to true - when constructor is disabled - does not accept attribute hash in the constructor +overriding virtus behavior + overriding an attribute getter + super can be used to access the getter defined by virtus + calls the defined getter + overriding an attribute setter + calls the defined setter + super can be used to access the setter defined by virtus -Virtus::ValueObject - initialization - sets the attribute values provided to Class.new - writer visibility - attempts to call attribute writer methods raises NameError - attributes are configured for private writers - writer methods are set to private - #inspect - includes the class name and attribute values - equality - #== - returns true for different objects with the same state - returns false for different objects with different state - #hash - returns different values for different objects with different state - returns the same value for different objects with the same state - #eql? - returns true for different objects with the same state - returns false for different objects with different state - #equal? - returns false for different objects with different state - returns false for different objects with the same state +Virtus::Attribute.coerce + when it is set to true + is expected to equal true + with a value + sets the value and return self + when it is set to false + is expected to equal false -Virtus#attributes - with a class - behaves like attribute hash - includes all attributes - with an instance - behaves like attribute hash - includes all attributes +Virtus::Attribute::Collection#coerce + when input is nil + returns nil + when input is an array + when member type is an EV + coerces members + when member type is a hash with key/value coercion + coerces members + when member type is a primitive + uses coercer to coerce members -Virtus.config - provides global configuration +Using Struct as an embedded value attribute + initialize a struct object with correct attributes -Virtus::AttributeSet#each - with a block - when the parent has no attributes - yields the expected attributes - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - when the parent has attributes that are not duplicates - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> and #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - yields the expected attributes - when the parent has attributes that are duplicates - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - yields the expected attributes - with no block - yields the expected attributes - returns an enumerator when block is not provided +I can extend objects + defining attributes on an object -Virtus::Attribute::Boolean#value_coerced? - when input is false +Virtus::Attribute#defined? + when the attribute value has not been defined + is expected to equal false + when the attribute value has been defined is expected to equal true - when input is true + +Virtus::Attribute#coercible? + when :coerce is set to false + is expected to equal false + when :coerce is set to true is expected to equal true - when input is not coerced + +Virtus::Attribute#lazy? + when :lazy is set to false is expected to equal false + when :lazy is set to true + is expected to equal true Virtus::Attribute#required? when required option is false @@ -1376,204 +1356,250 @@ when required option is true is expected to equal true -virtus attribute definitions - Boolean attributes have a predicate method - the constructor accepts a hash for mass-assignment - virtus creates accessor methods - inheritance - inherits all the attributes from the base class - lets you add attributes to the base class at runtime - lets you add attributes to the subclass at runtime - with attributes - #to_h returns the object's attributes as a hash - #to_hash returns the object's attributes as a hash - #attributes returns the object's attributes as a hash +Adding attribute called 'attributes' + when mass assignment is disabled + doesn't accept `attributes` key in initializer + allows model to use `attributes` attribute + +Defining a ValueObject with a custom constructor + initialize a value object attribute with correct attributes + +I can define attributes within a module + including a module with attributes into a class + including a module with attributes into an instance + +Virtus::Attribute#rename + is expected not to equal #:public, :strict=>true, :r...Value value=nil>, :coercer=>#}> + is expected to be strict + #name + is expected to equal :bar Virtus::Attribute::EmbeddedValue#coerce - when primitive is Struct - when input is an attribute hash - is expected to be an instance of # - #name - is expected to eql "Piotr" - #age - is expected to eql 30 - when input is a model instance - is expected to equal # - when input is nil - is expected to equal nil when :strict mode is enabled - when input is coercible - is expected to eql # when input is not coercible raises error + when input is coercible + is expected to eql # when primitive is OpenStruct - when input is nil - is expected to equal nil when input is a model instance is expected to equal # + when input is nil + is expected to equal nil when input is an attribute hash is expected to be an instance of OpenStruct + #age + is expected to eql 30 #name is expected to eql "Piotr" + when primitive is Struct + when input is an attribute hash + is expected to be an instance of # #age is expected to eql 30 + #name + is expected to eql "Piotr" + when input is a model instance + is expected to equal # + when input is nil + is expected to equal nil -Virtus::AttributeSet#merge - with a duplicate attribute - replaces the original attribute object +Virtus::AttributeSet#reset + when the parent has attributes that are duplicates is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - with a new attribute - adds an attribute + #to_set + is expected to eq #:public, :strict=>...lue value=nil>, :coercer=>#}>}> + when the parent is nil + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + includes changes from the parent + when the parent has changed + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> and #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + includes changes from the parent + when the parent has no attributes is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + #to_set + is expected to eq #:public, :strict=>...lue value=nil>, :coercer=>#}>}> + when the parent has attributes that are not duplicates + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> and #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + #to_set + is expected to eq #:public, :strict=>...lue value=nil>, :coercer=>#}>}> -Virtus::AttributeSet#[] - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - allows indexed access to attributes by the string representation of their name +Virtus::ValueObject + #inspect + includes the class name and attribute values + initialization + sets the attribute values provided to Class.new + writer visibility + attributes are configured for private writers + attempts to call attribute writer methods raises NameError + writer methods are set to private + equality + #hash + returns the same value for different objects with the same state + returns different values for different objects with different state + #equal? + returns false for different objects with different state + returns false for different objects with the same state + #eql? + returns true for different objects with the same state + returns false for different objects with different state + #== + returns true for different objects with the same state + returns false for different objects with different state -Virtus::Attribute#coerce - when strict mode is turned off - uses coercer to coerce the input value - when strict mode is turned on - uses coercer to coerce the input value - raises error when input was not coerced - when attribute is required and input is nil - returns raises error - when attribute is not required and input is nil - returns nil - when the input is an empty String - when nullify_blank is turned on - returns nil - returns the ouput if it was coerced - when both nullify_blank and strict are turned on - does not raises an coercion error +embedded values + allows you to pass a hash for the embedded value + #attributes returns instances of the embedded values + +Virtus::Attribute::Hash.build + when type is Hash + is expected to be an instance of Virtus::Attribute::Hash + sets default value type + sets default key type + when type is Hash[String => Integer] + sets key type + is expected to be an instance of Virtus::Attribute::Hash + sets value type + when strict mode is used + sets the strict mode for key/value types + when type is Hash[Virtus::Attribute::Hash => Virtus::Attribute::Boolean] + sets key type + is expected to be an instance of Virtus::Attribute::Hash + sets value type + when type is Hash[String => Struct.new(:id)] + sets value type + is expected to be an instance of Virtus::Attribute::Hash + sets key type + when type is Hash[String => Integer, Integer => String] + is expected to raise ArgumentError with "more than one [key => value] pair in `{String=>Integer, :Integer=>:String}`" + when type is Hash[Struct.new(:id) => Integer] + sets value type + sets key type + is expected to be an instance of Virtus::Attribute::Hash + +Inheritance + inherits model from the base class + sets correct attributes on the descendant classes Virtus#attributes= - with an instance - behaves like mass-assignment - skips writing unknown attributes - allows writing known attributes with a class raises when attributes is not hash-like object (PENDING: Temporarily skipped with xit) behaves like mass-assignment skips writing unknown attributes allows writing known attributes + with an instance + behaves like mass-assignment + allows writing known attributes + skips writing unknown attributes -Virtus::Attribute#lazy? - when :lazy is set to false - is expected to equal false - when :lazy is set to true - is expected to equal true +Virtus::AttributeSet#each + with no block + yields the expected attributes + returns an enumerator when block is not provided + with a block + when the parent has attributes that are not duplicates + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> and #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + yields the expected attributes + when the parent has attributes that are duplicates + yields the expected attributes + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + when the parent has no attributes + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + yields the expected attributes -custom attributes - allows you to define coercion methods - allows you to define custom attributes +Virtus::Attribute#== (defined by including Virtus::Equalizer) + returns false when attributes have different type + returns true when attributes have same type and options + returns false when attributes have different options -I can define attributes within a module - including a module with attributes into an instance - including a module with attributes into a class +Virtus::AttributeSet#merge + with a new attribute + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + adds an attribute + with a duplicate attribute + replaces the original attribute object + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> -Virtus::Attribute#set - is expected to equal "Jane Doe" - with coercion - is expected to change `instance.test` to "Jane Doe" - without coercion - is expected to change `instance.test` to "Jane Doe" +Virtus::AttributeSet#<< + with a new attribute + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + indexes the new attribute under the string version of its #name property + adds an attribute + indexes the new attribute under its #name property + with a duplicate attribute + replaces the original attribute object + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> -Package - #dimensions - is expected to have key :width - has 3 keys - is expected to have key :length - is expected to have key :height - should be coerced to [Symbol => Float] format - #meta_info - should be coerced to [String => String] format - has 2 keys - is expected to have key "to" - is expected to have key "from" +Virtus::Attribute::Collection custom subclass + when primitive is set on the attribute subclass + #primitive + is expected to equal # + when primitive is not set on the attribute subclass + #primitive + is expected to equal # -mass assignment with accessors - works uppon instantiation - respects accessor visibility - can be set with #attributes= +Virtus::Attribute#value_coerced? + when input is coerced + is expected to equal true + when input is not coerced + is expected to equal false -Virtus::Attribute#set_default_value - with a nil - #instance_variables - is expected to include :@test - #test - is expected to equal nil - with a non-clonable object - #test - is expected to equal true - #instance_variables - is expected to include :@test - with a symbol - when it is not a method name - #test - is expected to eq "hello_world" - when it is a method name - when method is public - #test - is expected to eq "hello world" - when method is private - #test - is expected to eq "hello world" - with a callable - #test - is expected to eq "model-test" - with a clonable - #test - is expected not to equal - #test - is expected to eq [] +Virtus.new + without attribute hash + sets default values for non-lazy attributes + skips setting default values for lazy attributes + with attribute hash + skips setting attributes with private writers + sets attributes with public writers -Virtus::Attribute#get - with :lazy is set to true - is expected to eql "Jane Doe" - sets default only on first access - with :lazy is set to false - is expected to equal "Jane Doe" +Virtus instance level attributes + adding an attribute + allows setting the attribute value on the instance -Defining a ValueObject with a custom constructor - initialize a value object attribute with correct attributes +Virtus::Attribute#coerce + when the input is an empty String + when both nullify_blank and strict are turned on + does not raises an coercion error + when nullify_blank is turned on + returns the ouput if it was coerced + returns nil + when strict mode is turned off + uses coercer to coerce the input value + when strict mode is turned on + uses coercer to coerce the input value + raises error when input was not coerced + when attribute is required and input is nil + returns raises error + when attribute is not required and input is nil + returns nil -Virtus::Attribute.coerce - when it is set to true - is expected to equal true - with a value - sets the value and return self - when it is set to false +Virtus::Attribute::Collection#value_coerced? + when input has incorrectly typed members is expected to equal false - -overriding virtus behavior - overriding an attribute getter - super can be used to access the getter defined by virtus - calls the defined getter - overriding an attribute setter - calls the defined setter - super can be used to access the setter defined by virtus - -Virtus::Attribute#coercible? - when :coerce is set to true + when the input is empty is expected to equal true - when :coerce is set to false + when the collection type is incorrect is expected to equal false + when input has correctly typed members + is expected to equal true -Virtus#set_default_attributes! - is expected to equal #<#:0x00007ff1088ec348 @age=30, @name="foo"> - #age - is expected to equal 30 - #name - is expected to eql "foo" +Virtus#[] + is expected to eq "foo" + +Virtus#attributes + with an instance + behaves like attribute hash + includes all attributes + with a class + behaves like attribute hash + includes all attributes Virtus.module with a class - defaults to Object for attribute type provides attributes for the model + defaults to Object for attribute type behaves like an object extended with virtus module - with coercion turned off - builds non-coercible attributes + with mass assignment is turned off + skips including mass assignment behaves like a valid virtus object reads and writes attribute with constructor turned off @@ -1584,15 +1610,15 @@ sets defaults behaves like a valid virtus object reads and writes attribute - with mass assignment is turned off - skips including mass assignment + with coercion turned off + builds non-coercible attributes behaves like a valid virtus object reads and writes attribute with a model instance provides attributes for the instance behaves like an object extended with virtus module - with default configuration - sets defaults + with constructor turned off + skips including constructor behaves like a valid virtus object reads and writes attribute with mass assignment is turned off @@ -1603,309 +1629,319 @@ builds non-coercible attributes behaves like a valid virtus object reads and writes attribute - with constructor turned off - skips including constructor + with default configuration + sets defaults behaves like a valid virtus object reads and writes attribute - as a peer to another module within a class - provides attributes for the model from both modules - includes the attributes from both modules with multiple other modules mixed into it provides attributes for the model from all modules includes the attributes from all modules with another module provides attributes for the model behaves like an object extended with virtus module - with default configuration - sets defaults - behaves like a valid virtus object - reads and writes attribute with mass assignment is turned off skips including mass assignment behaves like a valid virtus object reads and writes attribute + with coercion turned off + builds non-coercible attributes + behaves like a valid virtus object + reads and writes attribute with constructor turned off skips including constructor behaves like a valid virtus object reads and writes attribute - with coercion turned off - builds non-coercible attributes + with default configuration + sets defaults behaves like a valid virtus object reads and writes attribute + as a peer to another module within a class + provides attributes for the model from both modules + includes the attributes from both modules + +Virtus::AttributeSet#define_reader_method + with protected visibility + defines protected writer + with private visibility + defines public writer + with public visibility + defines public writer + +Virtus::Attribute#set_default_value + with a callable + #test + is expected to eq "model-test" + with a clonable + #test + is expected to eq [] + #test + is expected not to equal + with a nil + #test + is expected to equal nil + #instance_variables + is expected to include :@test + with a symbol + when it is not a method name + #test + is expected to eq "hello_world" + when it is a method name + when method is private + #test + is expected to eq "hello world" + when method is public + #test + is expected to eq "hello world" + with a non-clonable object + #instance_variables + is expected to include :@test + #test + is expected to equal true Virtus::AttributeSet#[]= - with a duplicate attribute - allows #[] to access the attribute with a symbol - replaces the original attribute object + with a new attribute is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - allows #[] to access the attribute with a string + allows #[] to access the attribute with a symbol allows #reset to track overridden attributes - with a new attribute allows #[] to access the attribute with a string - allows #reset to track overridden attributes + adds an attribute + with a duplicate attribute + replaces the original attribute object allows #[] to access the attribute with a symbol + allows #reset to track overridden attributes is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - adds an attribute - -custom collection attributes - with an enumerable - behaves like a collection - coerces its members - coerces an empty array - coerces an array of attribute hashes - defaults to an empty collection - can be used as Virtus attributes - coerces nil - with an array subclass - behaves like a collection - coerces its members - coerces an array of attribute hashes - coerces an empty array - coerces nil - can be used as Virtus attributes - defaults to an empty collection - -Virtus::Attribute.build - when coercion is turned off in options - is expected not to be coercible - behaves like a valid attribute instance - is expected to be an instance of Virtus::Attribute - is expected to be frozen - when type is a symbol of an existing class constant - #type - is expected to equal Axiom::Types::String (String) - behaves like a valid attribute instance - is expected to be an instance of Virtus::Attribute - is expected to be frozen - when custom collection-like attribute class exists for a given enumerable primitive - is expected to be an instance of # - #type - is expected to be < Axiom::Types::Collection - when options specify reader visibility - is expected not to be public reader - is expected to be public writer - behaves like a valid attribute instance - is expected to be an instance of Virtus::Attribute - is expected to be frozen - when options specify writer visibility - is expected not to be public writer - is expected to be public reader - behaves like a valid attribute instance - is expected to be an instance of Virtus::Attribute - is expected to be frozen - when options specify strict mode - is expected to be strict - behaves like a valid attribute instance - is expected to be frozen - is expected to be an instance of Virtus::Attribute - when options specify nullify blank mode - is expected to be nullify blank - behaves like a valid attribute instance - is expected to be frozen - is expected to be an instance of Virtus::Attribute - when type is a string - #type - is expected to equal Axiom::Types::Integer (Integer) - behaves like a valid attribute instance - is expected to be an instance of Virtus::Attribute - is expected to be frozen - when options specify lazy accessor - is expected to be lazy - behaves like a valid attribute instance - is expected to be an instance of Virtus::Attribute - is expected to be frozen - when custom attribute class exists for a given primitive - is expected to be an instance of # - #type - is expected to equal Axiom::Types::Object (BasicObject) - when name is passed as a string - #name - is expected to equal :something - when custom attribute class exists for a given array with member coercion defined - is expected to be an instance of # - #type - is expected to be < Axiom::Types::Collection - when type is a range - behaves like a valid attribute instance - is expected to be an instance of Virtus::Attribute - is expected to be frozen - #type - is expected to equal Axiom::Types::Object (Enumerable) - without options - sets up a coercer - is expected to be public writer - is expected to be coercible - is expected not to be lazy - is expected to be public reader - behaves like a valid attribute instance - is expected to be an instance of Virtus::Attribute - is expected to be frozen - when type is an axiom type - #type - is expected to equal Axiom::Types::Integer (Integer) - behaves like a valid attribute instance - is expected to be an instance of Virtus::Attribute - is expected to be frozen + allows #[] to access the attribute with a string Virtus::Attribute::EmbeddedValue.build - when type is an OpenStruct subclass + when type is OpenStruct is expected to be an instance of Virtus::Attribute::EmbeddedValue is expected to be frozen #coercer is expected to be an instance of Virtus::Attribute::EmbeddedValue::FromOpenStruct - when type is a Virtus.model - is expected to be frozen + when type is an OpenStruct subclass is expected to be an instance of Virtus::Attribute::EmbeddedValue + is expected to be frozen #coercer is expected to be an instance of Virtus::Attribute::EmbeddedValue::FromOpenStruct - when type is Struct + when type includes Virtus is expected to be frozen is expected to be an instance of Virtus::Attribute::EmbeddedValue #coercer - is expected to be an instance of Virtus::Attribute::EmbeddedValue::FromStruct - when type includes Virtus + is expected to be an instance of Virtus::Attribute::EmbeddedValue::FromOpenStruct + when type is a Virtus.model is expected to be an instance of Virtus::Attribute::EmbeddedValue is expected to be frozen #coercer is expected to be an instance of Virtus::Attribute::EmbeddedValue::FromOpenStruct - when type is OpenStruct + when type is Struct is expected to be an instance of Virtus::Attribute::EmbeddedValue is expected to be frozen #coercer - is expected to be an instance of Virtus::Attribute::EmbeddedValue::FromOpenStruct - -Virtus::Attribute#== (defined by including Virtus::Equalizer) - returns true when attributes have same type and options - returns false when attributes have different options - returns false when attributes have different type + is expected to be an instance of Virtus::Attribute::EmbeddedValue::FromStruct Virtus::AttributeSet#define_writer_method - with public visibility - defines public writer with private visibility defines private writer with protected visibility defines protected writer + with public visibility + defines public writer -Virtus instance level attributes - adding an attribute - allows setting the attribute value on the instance +default values + you can set defaults for private attributes + you can reset attribute to its default + without a default the value is nil + you can pass a 'callable-object' to the :default option + can be supplied with the :default option + an Array + without a default the value is an empty Array + a Set + without a default the value is an empty Set + a Hash + without a default the value is an empty Hash + a ValueObject + does not duplicate the ValueObject -Inheritance - sets correct attributes on the descendant classes - inherits model from the base class +Virtus.config + provides global configuration -Virtus::Attribute::Hash.build - when type is Hash[String => Struct.new(:id)] - sets value type - is expected to be an instance of Virtus::Attribute::Hash - sets key type - when type is Hash[String => Integer] - is expected to be an instance of Virtus::Attribute::Hash - sets key type - sets value type - when type is Hash[Virtus::Attribute::Hash => Virtus::Attribute::Boolean] - sets value type - is expected to be an instance of Virtus::Attribute::Hash - sets key type - when type is Hash[Struct.new(:id) => Integer] - sets key type - is expected to be an instance of Virtus::Attribute::Hash - sets value type - when strict mode is used - sets the strict mode for key/value types - when type is Hash[String => Integer, Integer => String] - is expected to raise ArgumentError with "more than one [key => value] pair in `{String=>Integer, :Integer=>:String}`" - when type is Hash - sets default key type - sets default value type - is expected to be an instance of Virtus::Attribute::Hash +Virtus::Attribute::Hash#coerce + when input is not coercible to hash + is expected to equal "not really a hash" + when input is coercible to hash + is expected to eq {:hello=>"World"} + when input is a hash + when key type is an array and value type is another hash + coerces keys and values + when key/value types are EVs + coerces keys and values + when key/value types are primitives + uses coercer to coerce key and value + +Virtus::Attribute::Boolean#value_coerced? + when input is not coerced + is expected to equal false + when input is false + is expected to equal true + when input is true + is expected to equal true + +Virtus::AttributeSet#[] + allows indexed access to attributes by the string representation of their name + is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> + +Virtus::Attribute::Boolean#coerce + when strict is turned off + with a truthy value + is expected to equal true + with a falsy value + is expected to equal false + when strict is turned on + with a coercible input + is expected to equal true + with a non-coercible input + raises coercion error + +Virtus#[]= + is expected to change `object.test` from nil to "foo" Virtus#freeze - does not change dynamic default values - does not change default attributes that have been explicitly set is expected to be frozen - #name - is expected to eql "foo" + does not change default attributes that have been explicitly set + does not change dynamic default values #age is expected to equal 30 + #name + is expected to eql "foo" -Virtus::AttributeSet#define_reader_method - with protected visibility - defines protected writer - with private visibility - defines public writer - with public visibility - defines public writer +User + is expected to respond to #phone_numbers= + is expected to respond to #addresses= + is expected to respond to #addresses + is expected to respond to #phone_numbers + #phone_numbers + last entry + is expected to be an instance of PhoneNumber + #number + is expected to eql "919-444-3265" + first entry + is expected to be an instance of PhoneNumber + #number + is expected to eql "212-555-1212" + #addresses + is expected to be an instance of Address + #postal_code + is expected to eql "21234" + #locality + is expected to eql "Anytown" + #region + is expected to eql "DC" + #address + is expected to eql "1234 Any St." -Virtus::AttributeSet#reset - when the parent has attributes that are duplicates - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - #to_set - is expected to eq #:public, :strict=>...lue value=nil>, :coercer=>#}>}> - when the parent has changed - includes changes from the parent - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> and #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - when the parent has no attributes - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - #to_set - is expected to eq #:public, :strict=>...lue value=nil>, :coercer=>#}>}> - when the parent has attributes that are not duplicates - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> and #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - #to_set - is expected to eq #:public, :strict=>...lue value=nil>, :coercer=>#}>}> - when the parent is nil - is expected to equal #:public, :strict=>false, :...Value value=nil>, :coercer=>#}> - includes changes from the parent +custom attributes + allows you to define custom attributes + allows you to define coercion methods -Injectible coercer - accepts an email hash - coerces an embedded string +Virtus::Attribute#get + with :lazy is set to false + is expected to equal "Jane Doe" + with :lazy is set to true + sets default only on first access + is expected to eql "Jane Doe" -Virtus::Attribute#value_coerced? - when input is coerced - is expected to equal true - when input is not coerced - is expected to equal false +Using required attributes + does not raise coercion error when not required attribute is nil + raises coercion error when required attribute is nil -Virtus.new - without attribute hash - sets default values for non-lazy attributes - skips setting default values for lazy attributes - with attribute hash - sets attributes with public writers - skips setting attributes with private writers +Virtus#attribute + allows specifying attribute without type + allows :attributes as an attribute name when mass-assignment is not included + raises error when :name is a reserved name on a class + raises error when :name is a reserved name on an instance + returns self + using custom module + writes and reads attributes + is expected to respond to #test + is expected to respond to #test= + with an instance + behaves like an object with string attribute + can write and read the attribute + is expected to respond to #test + is expected to respond to #test= + with a module + included in the class + behaves like an object with string attribute + is expected to respond to #test= + is expected to respond to #test + can write and read the attribute + included in the class + adds attributes from the module to a class that includes it + behaves like an object with string attribute + is expected to respond to #test= + is expected to respond to #test + can write and read the attribute + with a class + when type is :Boolean + behaves like a class with boolean attribute + defines predicate method + defines reader and writer + with a subclass + behaves like a class with boolean attribute + gets attributes from the parent class + defines reader and writer + defines predicate method + when type is "Boolean" + behaves like a class with boolean attribute + defines predicate method + defines reader and writer + when type is Axiom::Types::Boolean + behaves like a class with boolean attribute + defines predicate method (PENDING: this will be fixed once Attribute::Boolean subclass is gone) + defines reader and writer (PENDING: this will be fixed once Attribute::Boolean subclass is gone) + when type is Decimal + maps type to the corresponding axiom type + when type is Boolean + behaves like a class with boolean attribute + defines reader and writer + defines predicate method -Virtus::Attribute#rename - is expected to be strict - is expected not to equal #:public, :strict=>true, :r...Value value=nil>, :coercer=>#}> - #name - is expected to equal :bar +Injectible coercer + coerces an embedded string + accepts an email hash + +Virtus.finalize + it finalizes key type for a hash attribute + it finalizes member type for a collection attribute + it finalizes type for an EV attribute + it finalizes value type for a hash attribute + automatically resolves constant when it is already available + sets attributes that don't require finalization Pending: (Failures listed here are expected and do not affect your suite's status) - 1) Virtus#attribute with a class when type is Axiom::Types::Boolean behaves like a class with boolean attribute defines reader and writer - # this will be fixed once Attribute::Boolean subclass is gone - Failure/Error: expect(object).to be_test - expected # to respond to `test?` - Shared Example Group: "a class with boolean attribute" called from ./spec/unit/virtus/attribute_spec.rb:112 - # ./spec/unit/virtus/attribute_spec.rb:15:in `block (3 levels) in ' + 1) Virtus#attributes= with a class raises when attributes is not hash-like object + # Temporarily skipped with xit + # ./spec/unit/virtus/attributes_writer_spec.rb:32 2) Virtus#attribute with a class when type is Axiom::Types::Boolean behaves like a class with boolean attribute defines predicate method # this will be fixed once Attribute::Boolean subclass is gone Failure/Error: expect(object).to_not be_test - expected # to respond to `test?` + expected # to respond to `test?` Shared Example Group: "a class with boolean attribute" called from ./spec/unit/virtus/attribute_spec.rb:112 # ./spec/unit/virtus/attribute_spec.rb:21:in `block (3 levels) in ' - 3) Virtus#attributes= with a class raises when attributes is not hash-like object - # Temporarily skipped with xit - # ./spec/unit/virtus/attributes_writer_spec.rb:32 + 3) Virtus#attribute with a class when type is Axiom::Types::Boolean behaves like a class with boolean attribute defines reader and writer + # this will be fixed once Attribute::Boolean subclass is gone + Failure/Error: expect(object).to be_test + expected # to respond to `test?` + Shared Example Group: "a class with boolean attribute" called from ./spec/unit/virtus/attribute_spec.rb:112 + # ./spec/unit/virtus/attribute_spec.rb:15:in `block (3 levels) in ' -Finished in 0.6062 seconds (files took 0.35427 seconds to load) +Finished in 1.13 seconds (files took 1.25 seconds to load) 468 examples, 0 failures, 3 pending -Randomized with seed 729 +Randomized with seed 12639 ┌──────────────────────────────────────────────────────────────────────────────┐ @@ -1936,12 +1972,14 @@ dpkg-buildpackage: info: binary-only upload (no source included) dpkg-genchanges: info: not including original source code in upload I: copying local configuration +I: user script /srv/workspace/pbuilder/1125425/tmp/hooks/B01_cleanup starting +I: user script /srv/workspace/pbuilder/1125425/tmp/hooks/B01_cleanup finished I: unmounting dev/ptmx filesystem I: unmounting dev/pts filesystem I: unmounting dev/shm filesystem I: unmounting proc filesystem I: unmounting sys filesystem I: cleaning the build env -I: removing directory /srv/workspace/pbuilder/3508570 and its subdirectories -I: Current time: Sat Jun 7 21:03:42 -12 2025 -I: pbuilder-time-stamp: 1749373422 +I: removing directory /srv/workspace/pbuilder/1125425 and its subdirectories +I: Current time: Mon May 6 16:42:50 +14 2024 +I: pbuilder-time-stamp: 1714963370