[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