[Jifty-commit] r2687 - in jifty/branches/virtual-models: . lib
lib/Jifty/Model t/TestApp-DatabaseBackedModels
t/TestApp-DatabaseBackedModels/bin
t/TestApp-DatabaseBackedModels/doc
t/TestApp-DatabaseBackedModels/etc
t/TestApp-DatabaseBackedModels/lib
t/TestApp-DatabaseBackedModels/lib/TestApp
t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels
t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Action
t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Model
t/TestApp-DatabaseBackedModels/share
t/TestApp-DatabaseBackedModels/share/po
t/TestApp-DatabaseBackedModels/share/web
t/TestApp-DatabaseBackedModels/share/web/static
t/TestApp-DatabaseBackedModels/share/web/templates
t/TestApp-DatabaseBackedModels/t t/TestApp-DatabaseBackedModels/var
t/TestApp-DatabaseBackedModels/var/mason
t/TestApp-DatabaseBackedModels/var/mason/cache
t/TestApp-DatabaseBackedModels/var/mason/obj
jifty-commit at lists.jifty.org
jifty-commit at lists.jifty.org
Sun Jan 28 09:23:49 EST 2007
Author: jesse
Date: Sun Jan 28 09:23:49 2007
New Revision: 2687
Added:
jifty/branches/virtual-models/lib/Jifty/Model/ModelClass.pm
jifty/branches/virtual-models/lib/Jifty/Model/ModelClassCollection.pm
jifty/branches/virtual-models/lib/Jifty/Model/ModelClassColumn.pm
jifty/branches/virtual-models/lib/Jifty/Model/ModelClassColumnCollection.pm
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/Makefile.PL
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/bin/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/bin/jifty (contents, props changed)
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/doc/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/etc/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/etc/config.yml
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Action/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Bootstrap.pm
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Model/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/log/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/share/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/share/po/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/share/web/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/share/web/static/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/share/web/templates/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/00-prototype.t
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/01-insert.t
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/var/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/var/mason/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/var/mason/cache/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/var/mason/obj/
jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/var/mason/obj/.__obj_create_marker
Modified:
jifty/branches/virtual-models/ (props changed)
jifty/branches/virtual-models/lib/Jifty.pm
Log:
r21623 at hualien: jesse | 2007-01-28 22:23:15 +0800
* First draft of "virtual models" for jifty. EVERYTHING subject to change. Also, they' don't curently handle upgrades at all.
Modified: jifty/branches/virtual-models/lib/Jifty.pm
==============================================================================
--- jifty/branches/virtual-models/lib/Jifty.pm (original)
+++ jifty/branches/virtual-models/lib/Jifty.pm Sun Jan 28 09:23:49 2007
@@ -7,7 +7,7 @@
use encoding 'utf8';
# Work around the fact that Time::Local caches thing on first require
BEGIN { local $ENV{'TZ'} = "GMT"; require Time::Local;}
-$Jifty::VERSION = '0.70117';
+$Jifty::VERSION = '0.70127';
=head1 NAME
@@ -148,20 +148,20 @@
);
Jifty->class_loader($class_loader);
- $class_loader->require;
+ Jifty->class_loader->require;
Jifty->handler(Jifty::Handler->new());
Jifty->api(Jifty::API->new());
# Let's get the database rocking and rolling
Jifty->setup_database_connection(%args);
+ Jifty->class_loader->require_classes_from_database() if (Jifty->handle());
# Call the application's start method to let it do anything
# application specific for startup
my $app = Jifty->app_class;
- $app->start()
- if $app->can('start');
+ $app->start() if $app->can('start');
}
Added: jifty/branches/virtual-models/lib/Jifty/Model/ModelClass.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/lib/Jifty/Model/ModelClass.pm Sun Jan 28 09:23:49 2007
@@ -0,0 +1,113 @@
+use warnings;
+use strict;
+
+=head1 NAME
+
+Jifty::Model::ModelClass - Tracks Jifty-related metadata
+
+=head1 SYNOPSIS
+
+
+=head1 DESCRIPTION
+
+Every Jifty application automatically inherits this table, which
+describes information about Jifty models which are stored only in the
+database. It uses this information to construct new model classes on
+the fly as they're required by the application.
+
+=cut
+
+package Jifty::Model::ModelClass;
+use Jifty::Model::ModelClassColumnCollection; # we can drop this when we switch to Jifty::DBI's od branch
+use base qw( Jifty::Record );
+use Jifty::DBI::Schema;
+use Jifty::Record schema {
+ column name => type is 'text';
+ column description => type is 'text';
+ column since_version => type is 'text';
+ column included_columns => refers_to Jifty::Model::ModelClassColumnCollection by 'model_class';
+};
+
+=head2 table
+
+Database-backed models are stored in the table C<_jifty_models>.
+
+=cut
+
+sub table {'_jifty_models'}
+
+=head2 since
+
+The metadata table first appeared in Jifty version 0.70127
+
+=cut
+
+sub since {'0.70127'}
+
+
+=head2 qualified_class
+
+Returns the fully qualified class name of the model class described the current ModelClass object.
+
+=cut
+
+sub qualified_class {
+ my $self = shift;
+ my $fully_qualified_class = Jifty->config->framework('ApplicationClass')."::Model::".$self->name;
+ return $fully_qualified_class;
+}
+
+=head2 instantiate
+
+For the currently loaded ModelClass object, loads up all its columns and
+creates a model class definition and evals it into existence. Basically,
+you call this method to create a live model class. It should probably
+only be called by the Jifty classloader.
+
+=cut
+
+sub instantiate {
+ my $self = shift;
+ $self->_instantiate_stub_class;
+ $self->qualified_class->_init_columns();
+ my $cols = $self->included_columns;
+ while (my $col = $cols->next) {
+ my $column = Jifty::DBI::Column->new({ name => $col->name } );
+ $self->qualified_class->COLUMNS->{$col->name} = $column;
+ for (qw(readable writable hints indexed max_length render_as mandatory)) {
+ $column->$_( $col->$_());
+ }
+ $column->type($col->storage_type);
+
+
+ $self->qualified_class->_init_methods_for_column($column)
+ }
+
+ return 1;
+}
+
+
+
+sub _instantiate_stub_class {
+ my $self = shift;
+ my $base_class
+ = Jifty->config->framework('ApplicationClass') . "::Record";
+ my $fully_qualified_class = $self->qualified_class();
+ my $class = <<EOF;
+use warnings;
+use strict;
+package $fully_qualified_class;
+use base qw'$base_class';
+
+sub _autogenerated {1}
+1;
+
+EOF
+
+ eval "$class";
+ if ($@) {
+ warn $@;
+ }
+}
+
+1;
Added: jifty/branches/virtual-models/lib/Jifty/Model/ModelClassCollection.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/lib/Jifty/Model/ModelClassCollection.pm Sun Jan 28 09:23:49 2007
@@ -0,0 +1,16 @@
+use warnings;
+use strict;
+
+package Jifty::Model::ModelClassCollection;
+use base qw/Jifty::Collection/;
+
+=head2 record_class
+
+This deals with collections of L<Jifty::Model::ModelClass>s.
+
+=cut
+
+sub record_class { 'Jifty::Model::ModelClass' }
+
+
+1;
Added: jifty/branches/virtual-models/lib/Jifty/Model/ModelClassColumn.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/lib/Jifty/Model/ModelClassColumn.pm Sun Jan 28 09:23:49 2007
@@ -0,0 +1,67 @@
+use warnings;
+use strict;
+
+=head1 NAME
+
+Jifty::Model::ModelClassColumn - Tracks Jifty-related metadata
+
+=head1 SYNOPSIS
+
+
+=head1 DESCRIPTION
+
+Every Jifty application automatically inherits this table, which
+describes information about Jifty models which are stored only in the
+database. It uses this information to construct new model classes on
+the fly as they're required by the application.
+
+=cut
+
+package Jifty::Model::ModelClassColumn;
+use base qw( Jifty::Record );
+
+use Jifty::DBI::Schema;
+use Jifty::Model::ModelClass;
+
+use Jifty::Record schema {
+ column name => type is 'text';
+ column model_class => refers_to Jifty::Model::ModelClass;
+ column label => type is 'text';
+ column hints => type is 'text';
+ column storage_type => type is 'text'; # should be a ref to a list
+ column max_length => type is 'int';
+ column sort_order => type is 'int';
+ column validator => type is 'text'; # should be a ref to a list. or maybe take code
+ column valid_values => type is 'text'; # should be a ref to a list. or maybe take code
+ column canonicalizer => type is 'text'; # ditto
+ column autocompleter => type is 'text'; # ditto
+ column mandatory => type is 'boolean';
+ column since_version => type is 'text';
+ column render_as => type is 'text'; # should actually be a reference to a list
+ column filters => type is 'text'; # should actually be a reference to a list
+ column description => type is 'text';
+ column indexed => type is 'boolean';
+ column readable => type is 'boolean', default is 'true';
+ column writable => type is 'boolean', default is 'true';
+ column default_value => type is 'text';
+};
+
+
+
+=head2 table
+
+Database-backed models are stored in the table C<_jifty_models>.
+
+=cut
+
+sub table {'_jifty_modelcolumns'}
+
+=head2 since
+
+The metadata table first appeared in Jifty version 0.70127
+
+=cut
+
+sub since {'0.70127'}
+
+1;
Added: jifty/branches/virtual-models/lib/Jifty/Model/ModelClassColumnCollection.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/lib/Jifty/Model/ModelClassColumnCollection.pm Sun Jan 28 09:23:49 2007
@@ -0,0 +1,16 @@
+use warnings;
+use strict;
+
+package Jifty::Model::ModelClassColumnCollection;
+use base qw/Jifty::Collection/;
+
+=head2 record_class
+
+This deals with collections of L<Jifty::Model::ModelClassColumn>s.
+
+=cut
+
+sub record_class { 'Jifty::Model::ModelClassColumn' }
+
+
+1;
Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/Makefile.PL
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/Makefile.PL Sun Jan 28 09:23:49 2007
@@ -0,0 +1,6 @@
+use inc::Module::Install;
+name('TestApp::DatabaseBackedModels');
+version('0.01');
+requires('Jifty' => '0.70127');
+
+WriteAll;
Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/bin/jifty
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/bin/jifty Sun Jan 28 09:23:49 2007
@@ -0,0 +1,15 @@
+#!/usr/bin/env perl
+use warnings;
+use strict;
+use File::Basename qw(dirname);
+use UNIVERSAL::require;
+
+BEGIN {
+ Jifty::Util->require or die $UNIVERSAL::require::ERROR;
+ my $root = Jifty::Util->app_root;
+ unshift @INC, "$root/lib" if ($root);
+}
+
+use Jifty::Script;
+local $SIG{INT} = sub { warn "Stopped\n"; exit; };
+Jifty::Script->dispatch();
Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/etc/config.yml
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/etc/config.yml Sun Jan 28 09:23:49 2007
@@ -0,0 +1,40 @@
+---
+framework:
+ AdminMode: 1
+ ApplicationClass: TestApp::DatabaseBackedModels
+ ApplicationName: TestApp-DatabaseBackedModels
+ Database:
+ CheckSchema: 1
+ Database: testapp_databasebackedmodels
+ Driver: SQLite
+ Host: localhost
+ Password: ''
+ RecordBaseClass: Jifty::DBI::Record::Cachable
+ User: ''
+ Version: 0.0.1
+ DevelMode: 1
+ L10N:
+ PoDir: share/po
+ LogLevel: INFO
+ Mailer: Sendmail
+ MailerArgs: []
+
+ Plugins: []
+
+ PubSub:
+ Backend: Memcached
+ Enable: ~
+ Web:
+ BaseURL: http://localhost
+ DataDir: var/mason
+ Globals: []
+
+ MasonConfig:
+ autoflush: 0
+ default_escape_flags: h
+ error_format: text
+ error_mode: fatal
+ Port: 8888
+ ServeStaticFiles: 1
+ StaticRoot: share/web/static
+ TemplateRoot: share/web/templates
Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Bootstrap.pm
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/lib/TestApp/DatabaseBackedModels/Bootstrap.pm Sun Jan 28 09:23:49 2007
@@ -0,0 +1,19 @@
+package TestApp::DatabaseBackedModels::Bootstrap;
+use warnings;
+use strict;
+use base 'Jifty::Bootstrap';
+sub run {
+
+# my $user = TestApp::DatabaseBackedModels::CurrentUser->new( _bootstrap => 1);
+# my $modelclass = Jifty::Model::ModelClass->new(current_user => $user);
+# $modelclass->create( name => 'Widget');
+#
+# my $col = Jifty::Model::ModelClassColumn->new(current_user => $user);
+# $col->create( name => 'name', label => 'Name', storage_type => 'text', hints => 'This is the widget name', model_class => $modelclass);
+# my $col2 = Jifty::Model::ModelClassColumn->new(current_user => $user);
+# $col2->create( name => 'inventory', label => 'Inventory', storage_type => 'int', hints => 'How many do we have on hand?', model_class => $modelclass);
+#
+};
+
+
+1;
Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/00-prototype.t
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/00-prototype.t Sun Jan 28 09:23:49 2007
@@ -0,0 +1,19 @@
+#!/usr/bin/env perl
+
+use warnings;
+use strict;
+
+=head1 DESCRIPTION
+
+This is a template for your own tests. Copy it and modify it.
+
+=cut
+
+use lib 't/lib';
+use Jifty::SubTest;
+
+use Jifty::Test tests => 1;
+
+ok(1, "Loaded the test script");
+1;
+
Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/01-insert.t
==============================================================================
--- (empty file)
+++ jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/t/01-insert.t Sun Jan 28 09:23:49 2007
@@ -0,0 +1,101 @@
+#!/usr/bin/env perl
+
+use warnings;
+use strict;
+
+=head1 DESCRIPTION
+
+This is a template for your own tests. Copy it and modify it.
+
+=cut
+
+use lib 't/lib';
+use Jifty::SubTest;
+
+use Jifty::Test tests => 24;
+
+ok(1, "Loaded the test script");
+
+
+my $u = Jifty::CurrentUser->new(_bootstrap => 1);
+{
+eval { my $model = TestApp::DatabaseBackedModels::Model::Object->new(current_user => $u); };
+my $result = $@;
+ok($result, "Failed to instantiate an 'object' model before running our tests");
+}
+my $model = Jifty::Model::ModelClass->new(current_user => $u);
+$model->create(name => 'Object', description =>'You know. like widgets');
+ok($model->id);
+
+my $col = Jifty::Model::ModelClassColumn->new(current_user => $u);
+$col->create(name => 'name',
+ model_class => $model,
+ storage_type => 'text',
+ label => 'Object name',
+ hints => q{What's it called, yo?});
+
+ok($col->id);
+my $col2 = Jifty::Model::ModelClassColumn->new(current_user => $u);
+$col2->create(name => 'inventory',
+ model_class => $model,
+ storage_type => 'int',
+ label => 'Volume on hand',
+ hints => q{How many you gots?});
+
+ok($col2->id, "Got column ".$col2->id);
+
+my $col3 = Jifty::Model::ModelClassColumn->new(current_user => $u);
+$col3->create(name => 'password',
+ model_class => $model,
+ storage_type => 'text',
+ render_as => 'Password',
+ readable => 0,
+ writable =>1
+ );
+
+ok($col3->id, "Got column ".$col2->id);
+
+ok($model->instantiate);
+use Jifty::DBI::SchemaGenerator;
+foreach my $statement ( Jifty::DBI::SchemaGenerator->new( Jifty->handle )
+ ->_db_schema_table_from_model( $model->qualified_class )
+ ->sql_create_table( Jifty->handle->dbh ) ) {
+ my $ret = Jifty->handle->simple_query($statement);
+ $ret or die "error creating a table: " . $ret->error_message;
+
+}
+{
+my $object = TestApp::DatabaseBackedModels::Model::Object->new(current_user => $u);
+isa_ok($object, 'TestApp::DatabaseBackedModels::Model::Object');
+can_ok($object, 'id');
+can_ok($object, 'create');
+can_ok($object, 'name');
+can_ok($object, 'set_name');
+can_ok($object, 'inventory');
+can_ok($object, 'password');
+can_ok($object, 'set_password');
+
+my $id = $object->create( name => 'Widget', inventory => '30', password => 'secret');
+ok($id, "Created id ".$id);
+is($id,$object->id);
+my $object_clone = TestApp::DatabaseBackedModels::Model::Object->new(current_user => $u);
+
+$object_clone->load($id);
+is($object_clone->name, 'Widget');
+is($object_clone->inventory, '30');
+is($object_clone->password,'');
+is($object_clone->__value('password'), 'secret');
+$object_clone->set_password('foo!');
+
+is($object_clone->__value('password'), 'foo!');
+
+$object_clone->set_inventory(40);
+is($object_clone->inventory, 40);
+$object_clone->set_name('Thingy');
+is($object_clone->name, 'Thingy');
+
+
+}
+
+1;
+
Added: jifty/branches/virtual-models/t/TestApp-DatabaseBackedModels/var/mason/obj/.__obj_create_marker
==============================================================================
More information about the Jifty-commit
mailing list