gorm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/gorm.rb ADDED
@@ -0,0 +1,30 @@
1
+ require 'gorm/schema'
2
+
3
+ module Gorm
4
+
5
+ # Creates a Schema under the given package +path+ and makes it available to a
6
+ # block that can then define it using the Schema::SchemaDefinitionMethods.
7
+ # ==== Arguments
8
+ # * +path+ - A / separated path where the source files should be generated.
9
+ # Do not include any file extension, they will be added automatically
10
+ # depending on the target language.
11
+ # ==== Options
12
+ # * <tt>:namespace</tt> - If provided, all generated classes will be placed
13
+ # inside this namespace.
14
+ def self.schema(path, opt={}, &block) # :yields: s
15
+ s = Schema.new path, opt
16
+ block.call s unless s.nil?
17
+ s.generate!
18
+ nil
19
+ end
20
+
21
+ def self.template_path(subpath) # :nodoc:
22
+ spec = Gem.loaded_specs['gorm']
23
+ prefix = if spec.nil?
24
+ File.expand_path File.join(File.dirname(__FILE__), '..')
25
+ else
26
+ spec.gem_dir
27
+ end
28
+ File.join prefix, 'templates', subpath
29
+ end
30
+ end
@@ -0,0 +1,24 @@
1
+ module Gorm
2
+
3
+ # Represents a column in a Table.
4
+ class Column
5
+
6
+ # The name of this column, both in the database and the ORM class.
7
+ attr_reader :name
8
+
9
+ # The type of this column. For example, <tt>:string</tt> or <tt>:integer</tt> or ...
10
+ attr_reader :type
11
+
12
+ def initialize(name, type, opt={}) # :nodoc:
13
+ @name = name
14
+ @type = type
15
+ # TODO: process opts
16
+ end
17
+
18
+ def <=>(other) # :nodoc:
19
+ @name <=> other.name
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,48 @@
1
+ module Gorm
2
+
3
+ # A migration within a Schema
4
+ class Migration
5
+
6
+ # Defines the ordering of migrations.
7
+ attr_reader :index
8
+
9
+ def initialize(schema, opt={}) # :nodoc:
10
+ @schema = schema
11
+ @index = opt[:index]
12
+ end
13
+
14
+ # A special migration which is always the first in any schema.
15
+ # Introduces a meta table that is used to keep track of the current
16
+ # database schema version.
17
+ def self.new_meta(schema)
18
+ Migration.new schema, :index => 0
19
+ end
20
+
21
+ # Generate a stub for the migration method.
22
+ # ==== Options
23
+ # * <tt>:qualify</tt> - Should the stub be qualified with a class name?
24
+ def method_stub(opt={})
25
+ prefix = opt[:qualify] ? "#{@schema.class_name}::" : ""
26
+ "bool #{prefix}applyMigration#{@index}()"
27
+ end
28
+
29
+ # Generate a call to the migration method.
30
+ def method_call
31
+ "applyMigration#{@index}()"
32
+ end
33
+
34
+ # An interface for defining a Migration.
35
+ module MigrationDefinitionMethods
36
+ # Creates a Table called +name+ and makes it available to a block that
37
+ # can then define it using the Table::TableDefinitionMethods.
38
+ def create_table(name, &block) # :yields: t
39
+ t = @schema.register_table name
40
+ block.call t unless block.nil?
41
+ nil
42
+ end
43
+ end
44
+
45
+ include MigrationDefinitionMethods
46
+
47
+ end
48
+ end
@@ -0,0 +1,70 @@
1
+ require 'gorm/migration'
2
+ require 'gorm/table'
3
+ # $LOAD_PATH << File.join(File.dirname(__FILE__), '../../../cog/lib')
4
+ require 'cog/mixins/uses_templates'
5
+
6
+ module Gorm
7
+
8
+ # A collection of migrations which cumulatively defines a database schema.
9
+ class Schema
10
+
11
+ include Cog::Mixins::UsesTemplates
12
+
13
+ # Where to place the generated code.
14
+ attr_reader :output_path
15
+
16
+ # Namespace to place generated class into.
17
+ attr_reader :namespace
18
+
19
+ # The class name to use for the generated schema class.
20
+ attr_reader :class_name
21
+
22
+ # List of migrations ordered as there were defined.
23
+ attr_reader :migrations
24
+
25
+ # The include guard name to use in the header file.
26
+ attr_reader :include_guard_name
27
+
28
+ def initialize(path, opt={}) # :nodoc:
29
+ @output_path = path.to_s
30
+ @include_guard_name = @output_path.gsub(/[^A-Za-z0-9]/, '_').upcase
31
+ @namespace = opt[:namespace]
32
+ @class_name = @output_path.split('/').last
33
+ @migrations = [Migration.new_meta self]
34
+ @tables = {}
35
+ end
36
+
37
+ # Register or retrieve a registered model
38
+ def register_table(name)
39
+ @tables[name] = @tables[name] || Table.new(self, name)
40
+ end
41
+
42
+ # Generate the ORM source code
43
+ def generate!
44
+ [:cpp, :h].each do |ext|
45
+ stamp Gorm::template_path("schema.#{ext}"),
46
+ :use_absolute_path => true,
47
+ :target => "#{@output_path}.#{ext}"
48
+ end
49
+ end
50
+
51
+ # Index of the last migration
52
+ def app_schema_version
53
+ @migrations.last.index
54
+ end
55
+
56
+ # An interface for defining a Schema
57
+ module SchemaDefinitionMethods
58
+ # Adds a new Migration to this schema and makes it available to a block
59
+ # that can then define it using the Migration::MigrationDefinitionMethods.
60
+ def migration(&block)
61
+ @migrations << Migration.new(self, :index => @migrations.last.index + 1)
62
+ block.call @migrations.last unless block.nil?
63
+ nil
64
+ end
65
+ end
66
+
67
+ include SchemaDefinitionMethods
68
+
69
+ end
70
+ end
data/lib/gorm/table.rb ADDED
@@ -0,0 +1,58 @@
1
+ require 'gorm/column'
2
+ require 'active_support/core_ext'
3
+
4
+ module Gorm
5
+
6
+ # Represents a table in a Schema.
7
+ class Table
8
+
9
+ # The name of the table in the database
10
+ attr_reader :table_name
11
+
12
+ # The name of the ORM class for this table
13
+ attr_reader :class_name
14
+
15
+ def initialize(schema, name) # :nodoc:
16
+ @schema = schema
17
+ @table_name = name.to_s.pluralize.dasherize
18
+ @class_name = name.to_s.singularize.camelize
19
+ @columns = {}
20
+ end
21
+
22
+ # A sorted list of columns in the table
23
+ def columns
24
+ @columns.values.sort
25
+ end
26
+
27
+ # An interface for defining a Table
28
+ module TableDefinitionMethods
29
+ # Define a Column in this table.
30
+ # ==== Arguments
31
+ # * +name+ - The name of the field. Use lowercase.
32
+ # * +type+ - One of <tt>:string</tt>, <tt>:text</tt>, <tt>:integer</tt>
33
+ # ==== Options
34
+ # * <tt>:limit</tt> - A maximum size when using <tt>:string</tt> type.
35
+ def column(name, type, opt={})
36
+ col = @columns[name] || Column.new(name, type, opt)
37
+ end
38
+
39
+ # Shortcut for a call to #column with +type+ set to <tt>:integer</tt>.
40
+ def integer(name, opt={})
41
+ column name, :integer, opt
42
+ end
43
+
44
+ # Shortcut for a call to #column with +type+ set to <tt>:string</tt>.
45
+ def string(name, opt={})
46
+ column name, :string, opt
47
+ end
48
+
49
+ # Shortcut for a call to #column with +type+ set to <tt>:text</tt>.
50
+ def text(name, opt={})
51
+ column name, :text, opt
52
+ end
53
+ end
54
+
55
+ include TableDefinitionMethods
56
+
57
+ end
58
+ end
@@ -0,0 +1,3 @@
1
+ module Gorm
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gorm
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Kevin Tonon
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-10-27 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rake
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rdoc
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :development
47
+ version_requirements: *id002
48
+ description:
49
+ email: kevin@betweenconcepts.com
50
+ executables: []
51
+
52
+ extensions: []
53
+
54
+ extra_rdoc_files: []
55
+
56
+ files:
57
+ - lib/gorm/column.rb
58
+ - lib/gorm/migration.rb
59
+ - lib/gorm/schema.rb
60
+ - lib/gorm/table.rb
61
+ - lib/gorm.rb
62
+ - lib/gorm_version.rb
63
+ homepage: https://github.com/ktonon/gorm
64
+ licenses: []
65
+
66
+ post_install_message:
67
+ rdoc_options:
68
+ - --title
69
+ - gorm
70
+ - -ri
71
+ require_paths:
72
+ - lib
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ hash: 3
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
91
+ version: "0"
92
+ requirements: []
93
+
94
+ rubyforge_project:
95
+ rubygems_version: 1.8.24
96
+ signing_key:
97
+ specification_version: 3
98
+ summary: A code-Generating Object Relational Mapper.
99
+ test_files: []
100
+