From: Peter Rabbitson Date: Thu, 14 Jul 2016 13:20:03 +0000 (+0200) Subject: Get rid of Package::Stash \o/ X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=b090048f6d8bd2cba0bae8ea7ec26459dd20dca8;p=dbsrgits%2FDBIx-Class.git Get rid of Package::Stash \o/ Internal tooling advanced sufficiently without planning for any of that: a good indicator things are on the right track! Read under -w --- diff --git a/Makefile.PL b/Makefile.PL index 5ef9948..df82cb7 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -85,10 +85,6 @@ my $test_requires = { # 'Sub::Uplevel' => '0.19', - # this is already a dep of n::c, but just in case - used by t/55namespaces_cleaned.t - # remove and do a manual glob-collection if n::c is no longer a dep - 'Package::Stash' => '0.28', - # needed for testing only, not for operation # we will move away from this dep eventually, perhaps to DBD::CSV or something %{ DBIx::Class::Optional::Dependencies->req_list_for('test_rdbms_sqlite') }, diff --git a/lib/DBIx/Class/CDBICompat/ColumnGroups.pm b/lib/DBIx/Class/CDBICompat/ColumnGroups.pm index 47eefd5..6ead1f7 100644 --- a/lib/DBIx/Class/CDBICompat/ColumnGroups.pm +++ b/lib/DBIx/Class/CDBICompat/ColumnGroups.pm @@ -98,7 +98,7 @@ sub _register_column_group { grep { $_ ne $class and - ($_->can($name)||0) == $existing_accessor + ( $Class::C3::MRO{$_} || {} )->{methods}{$name} } @{mro::get_linear_isa($class)} ) ) diff --git a/lib/DBIx/Class/ResultSetManager.pm b/lib/DBIx/Class/ResultSetManager.pm index 3ae9502..addc8c3 100644 --- a/lib/DBIx/Class/ResultSetManager.pm +++ b/lib/DBIx/Class/ResultSetManager.pm @@ -2,9 +2,8 @@ package DBIx::Class::ResultSetManager; use strict; use warnings; use base 'DBIx::Class'; -use Package::Stash (); -use DBIx::Class::_Util 'set_subname'; +use DBIx::Class::_Util qw( set_subname describe_class_methods ); use namespace::clean; warn "DBIx::Class::ResultSetManager never left experimental status and @@ -56,25 +55,22 @@ sub _register_attributes { my $cache = $self->_attr_cache; return if keys %$cache == 0; - foreach my $meth (keys %{ { map - { $_ => 1 } + for my $meth( map - { Package::Stash->new($_)->list_all_symbols("CODE") } - @{ mro::get_linear_isa( ref $self || $self ) } - } } ) { - # *DO NOT* rely on P::S returning crefs in reverse mro order - # but instead ask the mro to redo the lookup + { $_->{name} } + grep + { $_->{attributes}{ResultSet} } + map + { $_->[0] } + values %{ describe_class_methods( ref $self || $self )->{methods} } + ) { # This codepath is extremely old, miht as well keep it running # as-is with no room for surprises - my $attrs = $cache->{$self->can($meth)}; - next unless $attrs; - if ($attrs->[0] eq 'ResultSet') { - no strict 'refs'; - my $resultset_class = $self->_setup_resultset_class; - my $name = join '::',$resultset_class, $meth; - *$name = set_subname $name, $self->can($meth); - delete ${"${self}::"}{$meth}; - } + no strict 'refs'; + my $resultset_class = $self->_setup_resultset_class; + my $name = join '::',$resultset_class, $meth; + *$name = set_subname $name, $self->can($meth); + delete ${"${self}::"}{$meth}; } } diff --git a/xt/extra/internals/namespaces_cleaned.t b/xt/extra/internals/namespaces_cleaned.t index 19768a8..700a908 100644 --- a/xt/extra/internals/namespaces_cleaned.t +++ b/xt/extra/internals/namespaces_cleaned.t @@ -35,41 +35,48 @@ BEGIN { use strict; use warnings; -# FIXME This is a crock of shit, needs to go away -# currently here to work around https://rt.cpan.org/Ticket/Display.html?id=74151 -# kill with fire when PS::XS / RT#74151 is *finally* fixed -BEGIN { - my $PS_provider; - - if ( "$]" < 5.010 ) { - require Package::Stash::PP; - $PS_provider = 'Package::Stash::PP'; - } - else { - require Package::Stash; - $PS_provider = 'Package::Stash'; - } - eval <<"EOS" or die $@; - -sub stash_for (\$) { - $PS_provider->new(\$_[0]); -} -1; -EOS -} - use Test::More; use DBICTest; use File::Find; use File::Spec; -use DBIx::Class::_Util 'get_subname'; +use DBIx::Class::_Util qw( get_subname describe_class_methods ); # makes sure we can load at least something use DBIx::Class; use DBIx::Class::Carp; -my @modules = grep { +my @modules = map { + # FIXME: AS THIS IS CLEARLY A LACK OF DEFENSE IN describe_class_methods :FIXME + # FIXME !!! without this detaint I get the test into an infloop on 5.16.x + # (maybe other versions): https://travis-ci.org/ribasushi/dbix-class/jobs/144738784#L26762 + # + # or locally like: + # + # ~$ ulimit -v $(( 1024 * 256 )); perl -d:Confess -Ilib -Tl xt/extra/internals/namespaces_cleaned.t + # ... + # DBIx::Class::MethodAttributes::_attr_cache("DBIx::Class::Storage::DBI::ODBC::Firebird") called at lib/DBIx/Class/MethodAttributes.pm line 166 + # DBIx::Class::MethodAttributes::_attr_cache("DBIx::Class::Storage::DBI::ODBC::Firebird") called at lib/DBIx/Class/MethodAttributes.pm line 166 + # DBIx::Class::MethodAttributes::_attr_cache("DBIx::Class::Storage::DBI::ODBC::Firebird") called at lib/DBIx/Class/MethodAttributes.pm line 166 + # DBIx::Class::MethodAttributes::_attr_cache("DBIx::Class::Storage::DBI::ODBC::Firebird") called at lib/DBIx/Class/MethodAttributes.pm line 154 + # DBIx::Class::MethodAttributes::FETCH_CODE_ATTRIBUTES("DBIx::Class::Storage::DBI::ODBC::Firebird", CODE(0x42ac2b0)) called at /home/rabbit/perl5/perlbrew/perls/5.16.2/lib/5.16.2/x86_64-linux-thread-multi-ld/attributes.pm line 101 + # attributes::get(CODE(0x42ac2b0)) called at lib/DBIx/Class/_Util.pm line 885 + # eval {...} called at lib/DBIx/Class/_Util.pm line 885 + # DBIx::Class::_Util::describe_class_methods("DBIx::Class::Storage::DBI::ODBC::Firebird") called at xt/extra/internals/namespaces_cleaned.t line 129 + # Out of memory! + # Out of memory! + # Out of memory! + # ... + # Segmentation fault + # + # FIXME: AS THIS IS CLEARLY A LACK OF DEFENSE IN describe_class_methods :FIXME + # Sweeping it under the rug for now as this is an xt/ test, + # but someone *must* find what is going on eventually + # FIXME: AS THIS IS CLEARLY A LACK OF DEFENSE IN describe_class_methods :FIXME + + ( $_ =~ /(.+)/ ) + +} grep { my ($mod) = $_ =~ /(.+)/; # not all modules are loadable at all times @@ -115,10 +122,13 @@ for my $mod (@modules) { SKIP: { skip "$mod exempt from namespace checks",1 if $skip_idx->{$mod}; - my %all_method_like = (map - { %{stash_for($_)->get_all_symbols('CODE')} } - (reverse @{mro::get_linear_isa($mod)}) - ); + my %all_method_like = + map + { $_->[0]{name} => $mod->can( $_->[0]{name} ) } + grep + { $_->[0]{via_class} ne 'UNIVERSAL' } + values %{ describe_class_methods($mod)->{methods} } + ; my %parents = map { $_ => 1 } @{mro::get_linear_isa($mod)};