dr_nic_magic_models 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. data/Rakefile +9 -9
  2. data/lib/base.rb +10 -95
  3. data/lib/connection_adapters/abstract/schema_statements.rb +0 -0
  4. data/lib/connection_adapters/abstract_adapter.rb +32 -0
  5. data/lib/connection_adapters/mysql_adapter.rb +42 -0
  6. data/lib/connection_adapters/postgresql_adapter.rb +45 -0
  7. data/lib/dr_nic_magic_models/schema.rb +210 -8
  8. data/lib/dr_nic_magic_models/validations.rb +35 -18
  9. data/lib/dr_nic_magic_models/version.rb +2 -2
  10. data/lib/dr_nic_magic_models.rb +13 -2
  11. data/lib/module.rb +0 -18
  12. data/lib/rails.rb +19 -0
  13. data/lib/schema_dumper.rb +0 -0
  14. data/scripts/txt2js +57 -0
  15. data/test/connections/native_postgresql/connection.rb +14 -0
  16. data/test/fixtures/adjectives.yml +3 -0
  17. data/test/fixtures/adjectives_fun_users.yml +3 -0
  18. data/test/fixtures/db_definitions/mysql.drop.sql +4 -30
  19. data/test/fixtures/db_definitions/mysql.sql +30 -2
  20. data/test/fixtures/db_definitions/postgresql.drop.sql +4 -0
  21. data/test/fixtures/db_definitions/postgresql.sql +56 -0
  22. data/test/fixtures/fun_users.yml +8 -1
  23. data/test/fixtures/group_tag.yml +3 -1
  24. data/test/fixtures/groups.yml +9 -1
  25. data/test/foreign_keys_test.rb +0 -0
  26. data/test/fun_user_plus.rb +2 -0
  27. data/test/invisible_model_access_test.rb +35 -7
  28. data/test/invisible_model_assoc_test.rb +34 -19
  29. data/test/invisible_model_classes_test.rb +5 -1
  30. data/website/index.html +24 -4
  31. data/website/index.txt +9 -1
  32. data/website/template.js +3 -0
  33. data/website/template.rhtml +10 -1
  34. data/website/version-raw.js +3 -0
  35. data/website/version-raw.txt +1 -0
  36. data/website/version.js +4 -0
  37. data/website/version.txt +3 -0
  38. metadata +32 -19
  39. data/lib/dr_nic_magic_models/associations.rb +0 -12
data/scripts/txt2js ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'redcloth'
4
+ require 'syntax/convertors/html'
5
+ require 'erb'
6
+ require 'active_support'
7
+ require '../lib/dr_nic_magic_models/version.rb'
8
+
9
+ version = DrNicMagicModels::VERSION::STRING
10
+ download = 'http://rubyforge.org/projects/magicmodels'
11
+
12
+ class Fixnum
13
+ def ordinal
14
+ # teens
15
+ return 'th' if (10..19).include?(self % 100)
16
+ # others
17
+ case self % 10
18
+ when 1: return 'st'
19
+ when 2: return 'nd'
20
+ when 3: return 'rd'
21
+ else return 'th'
22
+ end
23
+ end
24
+ end
25
+
26
+ class Time
27
+ def pretty
28
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
29
+ end
30
+ end
31
+
32
+ def convert_syntax(syntax, source)
33
+ return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
34
+ end
35
+
36
+ if ARGV.length >= 1
37
+ src, template = ARGV
38
+ template ||= 'template.js'
39
+ else
40
+ puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
41
+ exit!
42
+ end
43
+
44
+ template = ERB.new(File.open(template).read)
45
+
46
+ title = nil
47
+ body = nil
48
+ File.open(src) do |fsrc|
49
+ title_text = fsrc.readline
50
+ body = fsrc.read
51
+ title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
52
+ end
53
+ stat = File.stat(src)
54
+ created = stat.ctime
55
+ modified = stat.mtime
56
+
57
+ $stdout << template.result(binding)
@@ -0,0 +1,14 @@
1
+ print "Using Postgres\n"
2
+ require 'logger'
3
+
4
+ ActiveRecord::Base.logger = Logger.new("debug.log")
5
+
6
+ db1 = "dr_nic_magic_models_unittest"
7
+
8
+ ActiveRecord::Base.establish_connection(
9
+ :adapter => "postgresql",
10
+ :username => "postgres",
11
+ :password => "postgres",
12
+ :encoding => "utf8",
13
+ :database => db1
14
+ )
@@ -0,0 +1,3 @@
1
+ first:
2
+ id: 1
3
+ name: kind
@@ -0,0 +1,3 @@
1
+ first:
2
+ fun_user_id: 1
3
+ adjective_id: 1
@@ -1,30 +1,4 @@
1
- DROP TABLE accounts;
2
- DROP TABLE funny_jokes;
3
- DROP TABLE companies;
4
- DROP TABLE topics;
5
- DROP TABLE developers;
6
- DROP TABLE projects;
7
- DROP TABLE developers_projects;
8
- DROP TABLE customers;
9
- DROP TABLE orders;
10
- DROP TABLE movies;
11
- DROP TABLE subscribers;
12
- DROP TABLE booleantests;
13
- DROP TABLE auto_id_tests;
14
- DROP TABLE entrants;
15
- DROP TABLE colnametests;
16
- DROP TABLE mixins;
17
- DROP TABLE people;
18
- DROP TABLE readers;
19
- DROP TABLE binaries;
20
- DROP TABLE computers;
21
- DROP TABLE tasks;
22
- DROP TABLE posts;
23
- DROP TABLE comments;
24
- DROP TABLE authors;
25
- DROP TABLE categories;
26
- DROP TABLE categories_posts;
27
- DROP TABLE fk_test_has_fk;
28
- DROP TABLE fk_test_has_pk;
29
- DROP TABLE keyboards;
30
- DROP TABLE legacy_things;
1
+ DROP TABLE fun_users;
2
+ DROP TABLE groups;
3
+ DROP TABLE group_memberships;
4
+ DROP TABLE group_tag;
@@ -1,16 +1,20 @@
1
1
  CREATE TABLE `fun_users` (
2
2
  `id` int(11) NOT NULL auto_increment,
3
+ `type` varchar(255) NOT NULL,
3
4
  `firstname` varchar(50) NOT NULL,
4
5
  `lastname` varchar(50) NOT NULL,
5
6
  `login` varchar(50) NOT NULL,
6
- `email` varchar(50) NULL,
7
+ `email` varchar(50) NULL,
7
8
  PRIMARY KEY (`id`)
8
9
  ) TYPE=InnoDB;
9
10
 
10
11
  CREATE TABLE `groups` (
11
12
  `id` int(11) NOT NULL auto_increment,
12
- `name` varchar(50) NOT NULL,
13
+ `name` varchar(50) NOT NULL UNIQUE,
13
14
  `description` varchar(50) default NULL,
15
+ `some_int` integer default NULL,
16
+ `some_float` float default NULL,
17
+ `some_bool` boolean default NULL,
14
18
  PRIMARY KEY (`id`)
15
19
  ) TYPE=InnoDB;
16
20
 
@@ -21,10 +25,34 @@ CREATE TABLE `group_memberships` (
21
25
  PRIMARY KEY (`id`)
22
26
  ) TYPE=InnoDB;
23
27
 
28
+ CREATE TABLE `adjectives` (
29
+ `id` int(11) NOT NULL auto_increment,
30
+ `name` varchar(255),
31
+ PRIMARY KEY (`id`)
32
+ ) TYPE=InnoDB;
33
+
34
+ CREATE TABLE `adjectives_fun_users` (
35
+ `fun_user_id` int(11) NOT NULL,
36
+ `adjective_id` int(11) NOT NULL,
37
+ PRIMARY KEY (`fun_user_id`,`adjective_id`)
38
+ ) TYPE=InnoDB;
39
+
40
+
24
41
  CREATE TABLE `group_tag` (
25
42
  `id` int(11) NOT NULL auto_increment,
26
43
  `name` varchar(50) NOT NULL,
27
44
  `group_id` int(11) NOT NULL,
45
+ `referenced_group_id` int(11) NULL UNIQUE,
28
46
  PRIMARY KEY (`id`)
29
47
  ) TYPE=InnoDB;
30
48
 
49
+ ALTER TABLE `group_tag`
50
+ ADD FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`) ON DELETE CASCADE;
51
+
52
+ ALTER TABLE `group_tag`
53
+ ADD FOREIGN KEY (`referenced_group_id`) REFERENCES `groups` (`id`) ON DELETE CASCADE;
54
+
55
+ ALTER TABLE `adjectives_fun_users`
56
+ ADD FOREIGN KEY (`adjective_id`) REFERENCES `adjectives` (`id`) ON DELETE CASCADE;
57
+
58
+
@@ -0,0 +1,4 @@
1
+ DROP TABLE fun_users;
2
+ DROP TABLE groups;
3
+ DROP TABLE group_memberships;
4
+ DROP TABLE group_tag;
@@ -0,0 +1,56 @@
1
+ CREATE TABLE "fun_users" (
2
+ "id" SERIAL NOT NULL,
3
+ "type" varchar(255) NOT NULL,
4
+ "firstname" varchar(50) NOT NULL,
5
+ "lastname" varchar(50) NOT NULL,
6
+ "login" varchar(50) NOT NULL,
7
+ "email" varchar(50) NULL,
8
+ PRIMARY KEY ("id")
9
+ );
10
+
11
+ CREATE TABLE "groups" (
12
+ "id" SERIAL NOT NULL,
13
+ "name" varchar(50) NOT NULL UNIQUE,
14
+ "description" varchar(50) default NULL,
15
+ "some_int" integer default NULL,
16
+ "some_float" float default NULL,
17
+ "some_bool" boolean default NULL,
18
+ PRIMARY KEY ("id")
19
+ );
20
+
21
+ CREATE TABLE "group_memberships" (
22
+ "id" SERIAL,
23
+ "fun_user_id" int NOT NULL,
24
+ "group_id" int NOT NULL,
25
+ PRIMARY KEY ("id")
26
+ );
27
+
28
+ CREATE TABLE "adjectives" (
29
+ "id" SERIAL,
30
+ "name" varchar(255),
31
+ PRIMARY KEY ("id")
32
+ );
33
+
34
+ CREATE TABLE "adjectives_fun_users" (
35
+ "fun_user_id" int NOT NULL,
36
+ "adjective_id" int NOT NULL,
37
+ PRIMARY KEY ("fun_user_id","adjective_id")
38
+ );
39
+
40
+ CREATE TABLE "group_tag" (
41
+ "id" SERIAL NOT NULL,
42
+ "name" varchar(50) NOT NULL,
43
+ "group_id" int NOT NULL,
44
+ "referenced_group_id" int NULL UNIQUE,
45
+ PRIMARY KEY ("id")
46
+ );
47
+
48
+ ALTER TABLE "group_tag"
49
+ ADD FOREIGN KEY ("group_id") REFERENCES "groups" ("id") ON DELETE CASCADE;
50
+
51
+ ALTER TABLE "group_tag"
52
+ ADD FOREIGN KEY ("referenced_group_id") REFERENCES "groups" ("id") ON DELETE CASCADE;
53
+
54
+ ALTER TABLE "adjectives_fun_users"
55
+ ADD FOREIGN KEY ("adjective_id") REFERENCES "adjectives" ("id") ON DELETE CASCADE;
56
+
@@ -4,4 +4,11 @@ first:
4
4
  lastname: Person
5
5
  login: first
6
6
  email: first@person.com
7
-
7
+ type: FunUser
8
+ second:
9
+ id: 2
10
+ firstname: Second
11
+ lastname: Person
12
+ login: sec
13
+ email: sec@person.com
14
+ type: FunUserPlus
@@ -2,8 +2,10 @@ first:
2
2
  id: 1
3
3
  name: Test
4
4
  group_id: 1
5
+ referenced_group_id: 1
5
6
  second:
6
7
  id: 2
7
8
  name: Also Test
8
9
  group_id: 1
9
-
10
+ referenced_group_id: NULL
11
+
@@ -1,4 +1,12 @@
1
1
  first:
2
2
  id: 1
3
3
  name: Group One
4
- description: First group
4
+ description: First group
5
+ other:
6
+ id: 2
7
+ name: Group Plus
8
+ description: Extended Group
9
+ other:
10
+ id: 2
11
+ name: Group Plus
12
+ description: Extended Group
File without changes
@@ -0,0 +1,2 @@
1
+ class FunUserPlus < FunUser
2
+ end
@@ -1,4 +1,5 @@
1
1
  require 'abstract_unit'
2
+ require 'pp'
2
3
 
3
4
  class InvisibleModelAccessTest < Test::Unit::TestCase
4
5
  fixtures :fun_users, :groups, :group_memberships, :group_tag
@@ -15,14 +16,22 @@ class InvisibleModelAccessTest < Test::Unit::TestCase
15
16
  end
16
17
  end
17
18
 
18
- def test_create
19
- assert group = Group.create(:name => 'New Group')
19
+ def test_sti
20
+ x = FunUserPlus.find(:all)
21
+ assert x.inject {|n,v| n &= v.class == FunUserPlus}, "Wrong object class in FunUserPlus.find(:all)"
22
+ plus = x.first
23
+ assert_not_nil plus
24
+ assert plus.is_a?(FunUser)
25
+ assert plus.class == FunUserPlus
26
+ end
27
+
28
+ def test_new
29
+ assert group = Group.new(:name => 'New Group')
20
30
  assert_equal Group, group.class
21
31
  end
22
32
 
23
33
  def test_update
24
- assert @group.update_attributes(:name => 'Group 1')
25
- assert_equal Group, @group.class
34
+ assert @group.update_attributes(:name => 'Group 1'), "Couldn't update:\n#{str=""; @group.errors.each_full { |msg| str += "#{msg}\n" }; str }"
26
35
  end
27
36
 
28
37
  def test_delete
@@ -31,7 +40,26 @@ class InvisibleModelAccessTest < Test::Unit::TestCase
31
40
 
32
41
  def test_validations
33
42
  group = Group.new
34
- assert !group.valid?
35
- assert_not_nil group.errors[:name]
43
+ group.description = "x"*100
44
+ group.some_int = 99.9
45
+ group.some_float = "bah"
46
+ # Active record seems to interpolate booleans anyway to either true, false or nil...
47
+ # group.some_bool = "xxx" => false (!)
48
+
49
+ assert !group.valid?, "Group should not be valid"
50
+ [:name, :description, :some_int, :some_float].each do |x|
51
+ assert_not_nil group.errors[x], "Failed on #{x}=[#{group.send(x)}], it should be invalid"
52
+ end
53
+
54
+ group = Group.new
55
+ group.name = "name"
56
+ group.description = "x"*49
57
+ group.some_int = 99
58
+ group.some_float = 99.9
59
+ group.some_bool = true
60
+ assert group.valid?, "Group should be valid"
61
+
62
+ group.name = @group.name
63
+ assert !group.valid?, "Groups should have unique names"
36
64
  end
37
- end
65
+ end
@@ -1,27 +1,52 @@
1
1
  require 'abstract_unit'
2
2
 
3
3
  class InvisibleModelAssocTest < Test::Unit::TestCase
4
- fixtures :fun_users, :groups, :group_memberships
4
+ fixtures :fun_users, :groups, :group_memberships, :group_tag, :adjectives, :adjectives_fun_users
5
5
 
6
6
  def setup
7
7
  @group = groups(:first)
8
+ @group_tag = group_tag(:first)
8
9
  @user = fun_users(:first)
9
10
  @membership = group_memberships(:first_first)
10
11
  end
11
12
 
12
- def test_has_some
13
- assert_equal @membership, @user.group_membership
14
- assert_equal [@membership], @user.group_memberships
15
- assert_equal @membership, @group.group_membership
13
+ def test_hatbm
14
+ assert @user.adjectives == [adjectives(:first)]
15
+ end
16
+
17
+ def test_fk
18
+
19
+ gt = GroupTag.find(1)
20
+
21
+ # Not using FKs
22
+ g = gt.group
23
+ assert g.class == Group
24
+ assert g.id == 1
25
+
26
+ # Using FKs
27
+ g = gt.referenced_group
28
+ assert g.class == Group
29
+ assert g.id == 1
30
+
31
+ end
32
+
33
+ def test_has_many
16
34
  assert_equal [@membership], @group.group_memberships
35
+ assert_equal @group, @membership.group
36
+ end
37
+
38
+ def test_has_one
39
+ assert_equal @group, @group_tag.referenced_group
40
+ assert_equal @group_tag, @group.group_tag_as_referenced_group
17
41
  end
18
42
 
19
43
  def test_belongs_to
20
44
  assert_equal @user, @membership.fun_user
21
45
  assert_equal @group, @membership.group
22
- GroupTag.find(:all, :conditions => ['group_id = ?', @group.id]).each do |group_tag|
23
- assert_equal @group, group_tag.group
24
- end
46
+ manual_result = GroupTag.find(:all, :conditions => ['group_tag.group_id = ?', @group.id]) #.sort{|a,b| a.id <=> b.id}
47
+ auto_result = @group.group_tags #.sort{|a,b| a.id <=> b.id}
48
+ assert manual_result == auto_result, "[#{manual_result.join(',')}] != [#{auto_result.join(',')}]"
49
+
25
50
  end
26
51
 
27
52
  def test_indirect
@@ -29,14 +54,4 @@ class InvisibleModelAssocTest < Test::Unit::TestCase
29
54
  assert_equal [@group], @user.groups
30
55
  end
31
56
 
32
- # TODO - Support these
33
- #def test_more_indirect
34
- # group_tags = GroupTag.find(:all, :conditions => ['group_id = ?', @group.id])
35
- # assert_equal group_tags, @user.group_tags
36
- #end
37
-
38
- #def test_more_indirect_via_belongs_to
39
- # @group_tag = group_tag(:first)
40
- # assert_equal [@user], @group_tag.fun_users
41
- #end
42
- end
57
+ end
@@ -2,6 +2,10 @@ require 'abstract_unit'
2
2
 
3
3
  class InvisibleModelClassesTest < Test::Unit::TestCase
4
4
 
5
+ def setup
6
+
7
+ end
8
+
5
9
  def test_available
6
10
  assert_not_nil Group
7
11
  assert_not_nil FunUser
@@ -16,4 +20,4 @@ class InvisibleModelClassesTest < Test::Unit::TestCase
16
20
  assert_equal 'group_tag', GroupTag.table_name
17
21
  end
18
22
 
19
- end
23
+ end
data/website/index.html CHANGED
@@ -11,6 +11,7 @@
11
11
  <style>
12
12
 
13
13
  </style>
14
+ <script type="text/javascript" src="version-raw.js"></script>
14
15
  <script type="text/javascript">
15
16
  window.onload = function() {
16
17
  settings = {
@@ -24,6 +25,8 @@
24
25
  }
25
26
  var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
27
  versionBox.applyCornersToAll();
28
+
29
+ document.getElementById("version_num").innerHTML = version;
27
30
  }
28
31
  </script>
29
32
  </head>
@@ -33,9 +36,20 @@
33
36
  <h1>Dr Nic&#8217;s Magic Models</h1>
34
37
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/magicmodels"; return false'>
35
38
  Get Version
36
- <a href="http://rubyforge.org/projects/magicmodels" class="numbers">0.7.1</a>
39
+ <a id="version_num" href="http://rubyforge.org/projects/magicmodels" class="numbers"></a>
37
40
  </div>
38
- <blockquote>
41
+ <h2>News alert</h2>
42
+
43
+
44
+ <p>Assocations now generated using <a href="foreignkeys.html">Foreign Keys</a> too!</p>
45
+
46
+
47
+ <p>Now&#8230; on with the magic show!
48
+ <br />
49
+ <br /></p>
50
+
51
+
52
+ <blockquote>
39
53
  <strong>conjure</strong> 1. To create events that appear to be magical<br />
40
54
  - <a href="http://www.dcopperfield.com/">David Copperfield</a> website
41
55
  </blockquote>
@@ -155,7 +169,7 @@ with:
155
169
  <pre class="syntax">
156
170
  <span class="ident">create_table</span> <span class="symbol">:groups</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">t</span><span class="punct">|</span>
157
171
  <span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:name</span><span class="punct">,</span> <span class="symbol">:string</span><span class="punct">,</span> <span class="symbol">:null</span> <span class="punct">=&gt;</span> <span class="constant">false</span>
158
- <span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:description</span><span class="punct">,</span> <span class="symbol">:datetime</span>
172
+ <span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:description</span><span class="punct">,</span> <span class="symbol">:string</span>
159
173
  <span class="keyword">end</span>
160
174
  </pre></p>
161
175
 
@@ -357,9 +371,15 @@ other stories and things.</p>
357
371
  <p>Comments are welcome. Send an email to <a href="mailto:drnicwilliams@gmail.com">Dr Nic Williams</a>
358
372
  or via his blog at <a href="http://www.drnicwilliams.com">http://www.drnicwilliams.com</a></p>
359
373
  <p class="coda">
360
- <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 10th August 2006<br>
374
+ <a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 20th September 2006<br>
361
375
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
362
376
  </p>
363
377
  </div>
378
+ <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
379
+ </script>
380
+ <script type="text/javascript">
381
+ _uacct = "UA-567811-3";
382
+ urchinTracker();
383
+ </script>
364
384
  </body>
365
385
  </html>
data/website/index.txt CHANGED
@@ -1,5 +1,13 @@
1
1
  h1. Dr Nic's Magic Models
2
2
 
3
+ h2. News alert
4
+
5
+ Assocations now generated using "Foreign Keys":foreignkeys.html too!
6
+
7
+ Now... on with the magic show!
8
+ <br />
9
+ <br />
10
+
3
11
  <blockquote>
4
12
  *conjure* 1. To create events that appear to be magical<br />
5
13
  - "David Copperfield":http://www.dcopperfield.com/ website
@@ -102,7 +110,7 @@ with:
102
110
  <pre syntax="ruby">
103
111
  create_table :groups do |t|
104
112
  t.column :name, :string, :null => false
105
- t.column :description, :datetime
113
+ t.column :description, :string
106
114
  end
107
115
  </pre>
108
116
 
@@ -0,0 +1,3 @@
1
+ // <%= title %>
2
+ var version = <%= version.to_json %>;
3
+ <%= body %>
@@ -11,6 +11,7 @@
11
11
  <style>
12
12
 
13
13
  </style>
14
+ <script type="text/javascript" src="version-raw.js"></script>
14
15
  <script type="text/javascript">
15
16
  window.onload = function() {
16
17
  settings = {
@@ -24,6 +25,8 @@
24
25
  }
25
26
  var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
27
  versionBox.applyCornersToAll();
28
+
29
+ document.getElementById("version_num").innerHTML = version;
27
30
  }
28
31
  </script>
29
32
  </head>
@@ -33,7 +36,7 @@
33
36
  <h1><%= title %></h1>
34
37
  <div id="version" class="clickable" onclick='document.location = "<%= download %>"; return false'>
35
38
  Get Version
36
- <a href="<%= download %>" class="numbers"><%= version %></a>
39
+ <a id="version_num" href="<%= download %>" class="numbers"></a>
37
40
  </div>
38
41
  <%= body %>
39
42
  <p class="coda">
@@ -41,5 +44,11 @@
41
44
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
42
45
  </p>
43
46
  </div>
47
+ <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
48
+ </script>
49
+ <script type="text/javascript">
50
+ _uacct = "UA-567811-3";
51
+ urchinTracker();
52
+ </script>
44
53
  </body>
45
54
  </html>
@@ -0,0 +1,3 @@
1
+ // Version JS file
2
+ var version = "0.8.0";
3
+
@@ -0,0 +1 @@
1
+ h1. Version JS file
@@ -0,0 +1,4 @@
1
+ // Version JS file
2
+ var version = "0.8.0";
3
+
4
+ document.write(" - " + version);
@@ -0,0 +1,3 @@
1
+ h1. Version JS file
2
+
3
+ document.write(" - " + version);