X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class-Schema-Loader.git;a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FBase.pm;h=4fdc9e79c32d4dfed8845d2dd23a74d38cb1c887;hp=923209cc45f65b899683d19ef795c533ce335efb;hb=6d0f96209ca74e7bc0857df2ce3a78b7f15a5ce9;hpb=d7e0e0e8e9517098567f1a5637771505476ccbc1 diff --git a/lib/DBIx/Class/Schema/Loader/Base.pm b/lib/DBIx/Class/Schema/Loader/Base.pm index 923209c..4fdc9e7 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -28,9 +28,10 @@ use DBIx::Class (); use Encode qw/encode decode/; use List::Util qw/all any none/; use File::Temp 'tempfile'; +use curry; use namespace::clean; -our $VERSION = '0.07045'; +our $VERSION = '0.07049'; __PACKAGE__->mk_group_ro_accessors('simple', qw/ schema @@ -412,15 +413,15 @@ L relationships, they default to off. Can also be a coderef, for more precise control, in which case the coderef gets -this hash of parameters (as a list:) +this hash of parameters (as a list): rel_name # the name of the relationship rel_type # the type of the relationship: 'belongs_to', 'has_many' or 'might_have' local_source # the DBIx::Class::ResultSource object for the source the rel is *from* remote_source # the DBIx::Class::ResultSource object for the source the rel is *to* - local_table # a DBIx::Class::Schema::Loader::Table object for the table of the source the rel is from + local_table # the DBIx::Class::Schema::Loader::Table object for the table of the source the rel is from local_cols # an arrayref of column names of columns used in the rel in the source it is from - remote_table # a DBIx::Class::Schema::Loader::Table object for the table of the source the rel is to + remote_table # the DBIx::Class::Schema::Loader::Table object for the table of the source the rel is to remote_cols # an arrayref of column names of columns used in the rel in the source it is to attrs # the attributes that would be set @@ -561,10 +562,6 @@ database and/or schema. Only load matching tables. -=head2 exclude - -Exclude matching tables. - These can be specified either as a regex (preferably on the C form), or as an arrayref of arrayrefs. Regexes are matched against the (unqualified) table name, while arrayrefs are matched according to @@ -582,6 +579,13 @@ For example: In this case only the tables C and C in C and C in C will be dumped. +=head2 exclude + +Exclude matching tables. + +The tables to exclude are specified in the same way as for the +L option. + =head2 moniker_map Overrides the default table name to moniker translation. Either @@ -610,14 +614,27 @@ a hashref of unqualified table name keys and moniker values =item * -a coderef for a translator function taking a L argument (which stringifies to the -unqualified table name) and returning a scalar moniker +a coderef that returns the moniker, which is called with the following +arguments: + +=over + +=item * + +the L object for the table -The function is also passed a coderef that can be called with either -of the hashref forms to get the moniker mapped accordingly. This is -useful if you need to handle some monikers specially, but want to use -the hashref form for the rest. +=item * + +the default moniker that DBIC would ordinarily give this table + +=item * + +a coderef that can be called with either of the hashref forms to get +the moniker mapped accordingly. This is useful if you need to handle +some monikers specially, but want to use the hashref form for the +rest. + +=back =back @@ -640,7 +657,7 @@ together. Examples: Map for overriding the monikerization of individual L. The keys are the moniker part to override, the value is either a -hashref of coderef for mapping the corresponding part of the +hashref or coderef for mapping the corresponding part of the moniker. If a coderef is used, it gets called with the moniker part and the hash key the code ref was found under. @@ -661,23 +678,36 @@ L takes precedence over this. Same as moniker_map, but for column accessor names. The nested hashref form is traversed according to L, with an extra level at the bottom for the column name. If a coderef is -passed, the code is called with arguments of +passed, the code is called with the following arguments: + +=over + +=item * + +the L object for the column + +=item * + +the default accessor name that DBICSL would ordinarily give this column + +=item * + +a hashref of this form: - the DBIx::Class::Schema::Loader::Column object for the column, - default accessor name that DBICSL would ordinarily give this column, { table_class => name of the DBIC class we are building, table_moniker => calculated moniker for this table (after moniker_map if present), - table => table object of interface DBIx::Class::Schema::Loader::Table, + table => the DBIx::Class::Schema::Loader::Table object for the table, full_table_name => schema-qualified name of the database table (RDBMS specific), schema_class => name of the schema class we are building, column_info => hashref of column info (data_type, is_nullable, etc), } - coderef ref that can be called with a hashref map -The L and -L objects stringify to their -unqualified names. +=item * + +a coderef that can be called with a hashref map + +=back =head2 rel_name_map @@ -713,9 +743,9 @@ If it is a coderef, it will be passed a hashref of this form: remote_moniker => moniker of the DBIC class we are related to, remote_columns => columns in the other table in the relationship, # for type => "many_to_many" only: - link_class => name of the DBIC class for the link table - link_moniker => moniker of the DBIC class for the link table - link_rel_name => name of the relationship to the link table + link_class => name of the DBIC class for the link table, + link_moniker => moniker of the DBIC class for the link table, + link_rel_name => name of the relationship to the link table, } In addition it is passed a coderef that can be called with a hashref map. @@ -882,8 +912,8 @@ L for a column. Must be a coderef that returns a hashref with the extra attributes. -Receives the L
(which -stringifies to the unqualified table name), column name and column_info. +Receives the L object, column name +and column_info. For example: @@ -960,12 +990,13 @@ are methods, which will cause namespace::autoclean to spare them from removal. This prevents the "Hey, where'd my overloads go?!" effect. -If you don't care about operator overloads, enabling this option falls back to -just using L itself. +If you don't care about operator overloads (or if you know your Moose is at at +least version 2.1400, where MooseX::MarkAsMethods is no longer necessary), +enabling this option falls back to just using L itself. If none of the above made any sense, or you don't have some pressing need to only use L, leaving this set to the default is -recommended. +just fine. =head2 col_collision_map @@ -1151,9 +1182,17 @@ sub new { $self->_validate_result_roles_map; if ($self->use_moose) { - if (not DBIx::Class::Schema::Loader::Optional::Dependencies->req_ok_for('use_moose')) { - die sprintf "You must install the following CPAN modules to enable the use_moose option: %s.\n", - DBIx::Class::Schema::Loader::Optional::Dependencies->req_missing_for('use_moose'); + if ($self->only_autoclean) { + if (not DBIx::Class::Schema::Loader::Optional::Dependencies->req_ok_for('use_moose_only_autoclean')) { + die sprintf "You must install the following CPAN modules to enable the use_moose and only_autoclean options: %s.\n", + DBIx::Class::Schema::Loader::Optional::Dependencies->req_missing_for('use_moose_only_autoclean'); + } + } + else { + if (not DBIx::Class::Schema::Loader::Optional::Dependencies->req_ok_for('use_moose')) { + die sprintf "You must install the following CPAN modules to enable the use_moose option: %s.\n", + DBIx::Class::Schema::Loader::Optional::Dependencies->req_missing_for('use_moose'); + } } } @@ -1985,7 +2024,8 @@ sub _dump_to_dir { my @attr = qw/resultset_namespace default_resultset_class/; - unshift @attr, 'result_namespace' unless (not $self->result_namespace) || $self->result_namespace eq 'Result'; + unshift @attr, 'result_namespace' + if $self->result_namespace && $self->result_namespace ne 'Result'; for my $attr (@attr) { if ($self->$attr) { @@ -2246,15 +2286,22 @@ sub _parse_generated_file { my $mark_md5 = $2; # Pull out the version and timestamp from the line above - ($ver, $ts) = $gen =~ m/^# Created by DBIx::Class::Schema::Loader( v[\d.]+)?( @ [\d-]+ [\d:]+)?\r?\Z/m; + ($ver, $ts) = $gen =~ m/^# Created by DBIx::Class::Schema::Loader( v[\d._]+)?( @ [\d-]+ [\d:]+)?\r?\Z/m; $ver =~ s/^ v// if $ver; $ts =~ s/^ @ // if $ts; $gen .= $pre_md5; $real_md5 = Digest::MD5::md5_base64(encode 'UTF-8', $gen); - croak "Checksum mismatch in '$fn', the auto-generated part of the file has been modified outside of this loader. Aborting.\nIf you want to overwrite these modifications, set the 'overwrite_modifications' loader option.\n" - if !$self->overwrite_modifications && $real_md5 ne $mark_md5; - + if ($real_md5 ne $mark_md5) { + if ($self->overwrite_modifications) { + # Setting this to something that is not a valid MD5 forces + # the file to be rewritten. + $real_md5 = 'not an MD5'; + } + else { + croak "Checksum mismatch in '$fn', the auto-generated part of the file has been modified outside of this loader. Aborting.\nIf you want to overwrite these modifications, set the 'overwrite_modifications' loader option.\n"; + } + } last; } else { @@ -2557,7 +2604,7 @@ sub _make_column_accessor_name { my $accessor = $self->_run_user_map( $self->col_accessor_map, - sub { $self->_default_column_accessor_name( shift ) }, + $self->curry::_default_column_accessor_name, $column_name, $column_context_info, ); @@ -2810,7 +2857,7 @@ sub _table2moniker { $self->_run_user_map( $self->moniker_map, - sub { $self->_default_table2moniker( shift ) }, + $self->curry::_default_table2moniker, $table ); }