ichabod 0.0.1 → 0.0.2

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.
@@ -0,0 +1,206 @@
1
+ Math.guid = function(){
2
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
3
+ var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
4
+ return v.toString(16);
5
+ }).toUpperCase();
6
+ };
7
+
8
+ var Model = Klass.create();
9
+
10
+ // Alias create
11
+ Model.setup = Model.create;
12
+
13
+ Model.extend({
14
+ init: function(){
15
+ this.records = {};
16
+ this.attributes = [];
17
+ },
18
+
19
+ find: function(id){
20
+ var record = this.records[id];
21
+ if ( !record ) throw("Unknown record");
22
+ return record.dup();
23
+ },
24
+
25
+ exists: function(id){
26
+ try {
27
+ return this.find(id);
28
+ } catch (e) {
29
+ return false;
30
+ }
31
+ },
32
+
33
+ populate: function(values){
34
+ // Reset model & records
35
+ this.init();
36
+
37
+ for (var i=0, il = values.length; i < il; i++) {
38
+ var record = this.inst(values[i]);
39
+ record.newRecord = false;
40
+ this.records[record.id] = record;
41
+ }
42
+ },
43
+
44
+ select: function(callback){
45
+ var result = [];
46
+
47
+ for (var key in this.records)
48
+ if (callback(this.records[key]))
49
+ result.push(this.records[key]);
50
+
51
+ return this.dupArray(result);
52
+ },
53
+
54
+ findByAttribute: function(name, value){
55
+ for (var key in this.records)
56
+ if (this.records[key][name] == value)
57
+ return this.records[key].dup();
58
+ },
59
+
60
+ findAllByAttribute: function(name, value){
61
+ return(this.select(function(item){
62
+ return(item[name] == value);
63
+ }));
64
+ },
65
+
66
+ each: function(callback){
67
+ for (var key in this.records) {
68
+ callback(this.records[key]);
69
+ }
70
+ },
71
+
72
+ all: function(){
73
+ return this.dupArray(this.recordsValues());
74
+ },
75
+
76
+ first: function(){
77
+ var record = this.recordsValues()[0];
78
+ return(record && record.dup());
79
+ },
80
+
81
+ last: function(){
82
+ var values = this.recordsValues()
83
+ var record = values[values.length - 1];
84
+ return(record && record.dup());
85
+ },
86
+
87
+ count: function(){
88
+ return this.recordsValues().length;
89
+ },
90
+
91
+ deleteAll: function(){
92
+ for (var key in this.records)
93
+ delete this.records[key];
94
+ },
95
+
96
+ destroyAll: function(){
97
+ for (var key in this.records)
98
+ this.records[key].destroy();
99
+ },
100
+
101
+ update: function(id, atts){
102
+ this.find(id).updateAttributes(atts);
103
+ },
104
+
105
+ create: function(atts){
106
+ var record = this.inst(atts);
107
+ record.save();
108
+ return record;
109
+ },
110
+
111
+ destroy: function(id){
112
+ this.find(id).destroy();
113
+ },
114
+
115
+ // Private
116
+
117
+ recordsValues: function(){
118
+ var result = []
119
+ for (var key in this.records)
120
+ result.push(this.records[key])
121
+ return result;
122
+ },
123
+
124
+ dupArray: function(array){
125
+ return array.map(function(item){
126
+ return item.dup();
127
+ });
128
+ }
129
+ });
130
+
131
+ Model.include({
132
+ newRecord: true,
133
+
134
+ init: function(atts){
135
+ if (atts) this.load(atts);
136
+ },
137
+
138
+ isNew: function(){
139
+ return this.newRecord;
140
+ },
141
+
142
+ validate: function(){ },
143
+
144
+ load: function(attributes){
145
+ for(var name in attributes)
146
+ this[name] = attributes[name];
147
+ },
148
+
149
+ attributes: function(){
150
+ var result = {};
151
+ for(var i in this.parent.attributes) {
152
+ var attr = this.parent.attributes[i];
153
+ result[attr] = this[attr];
154
+ }
155
+ result.id = this.id;
156
+ return result;
157
+ },
158
+
159
+ eql: function(rec){
160
+ return(rec && rec.id === this.id &&
161
+ rec.parent === this.parent);
162
+ },
163
+
164
+ save: function(){
165
+ if (this.validate() == false) return false;
166
+ this.newRecord ? this.create() : this.update();
167
+ },
168
+
169
+ updateAttribute: function(name, value){
170
+ this[name] = value;
171
+ return this.save();
172
+ },
173
+
174
+ updateAttributes: function(attributes){
175
+ this.load(attributes);
176
+ return this.save();
177
+ },
178
+
179
+ destroy: function(){
180
+ delete this.parent.records[this.id];
181
+ },
182
+
183
+ dup: function(){
184
+ return Object.create(this);
185
+ },
186
+
187
+ toJSON: function(){
188
+ return(JSON.stringify(this.attributes()));
189
+ },
190
+
191
+ // Private
192
+
193
+ update: function(){
194
+ this.parent.records[this.id] = this.dup();
195
+ },
196
+
197
+ generateID: function(){
198
+ return Math.guid();
199
+ },
200
+
201
+ create: function(){
202
+ if ( !this.id ) this.id = this.generateID();
203
+ this.newRecord = false;
204
+ this.parent.records[this.id] = this.dup();
205
+ }
206
+ });
@@ -0,0 +1,45 @@
1
+ module("Model test", {
2
+ setup: function(){
3
+ this.Asset = Model.setup();
4
+ }
5
+ });
6
+
7
+ test("load()", function(){
8
+ var a = this.Asset.inst();
9
+ a.load({
10
+ local: true,
11
+ name: "test.pdf"
12
+ });
13
+
14
+ ok(a.local, "Load sets properties");
15
+ equals(a.name, "test.pdf", "load() sets properties (2)");
16
+
17
+ var b = this.Asset.inst({
18
+ name: "test2.pdf"
19
+ });
20
+
21
+ equals(b.name, "test2.pdf", "Calls load() on instantiation");
22
+ });
23
+
24
+ test("attributes()", function(){
25
+ this.Asset.attributes = ["name"];
26
+
27
+ var a = this.Asset.inst();
28
+ a.name = "test.pdf";
29
+ a.id = 1;
30
+
31
+ same(a.attributes(), {
32
+ name: "test.pdf",
33
+ id: 1
34
+ });
35
+ });
36
+
37
+ test("find()", function(){
38
+ var a = this.Asset.create();
39
+
40
+ equals(this.Asset.find(a.id).id, a.id, "Returns saved assets");
41
+
42
+ raises(function(){
43
+ this.Asset.find("non-existant-id");
44
+ }, "Raises when Asset doesn't exist");
45
+ });
data/ichabod.gemspec ADDED
@@ -0,0 +1,62 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ichabod}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Alex MacCaw"]
12
+ s.date = %q{2011-03-15}
13
+ s.default_executable = %q{ichabod}
14
+ s.email = %q{info@eribium.org}
15
+ s.executables = ["ichabod"]
16
+ s.extra_rdoc_files = [
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ "MIT-LICENSE",
21
+ "README.md",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "bin/ichabod",
25
+ "examples/index.html",
26
+ "examples/jasmine/index.html",
27
+ "examples/jasmine/klass.js",
28
+ "examples/jasmine/lib/MIT.LICENSE",
29
+ "examples/jasmine/lib/jasmine-html.js",
30
+ "examples/jasmine/lib/jasmine.css",
31
+ "examples/jasmine/lib/jasmine.js",
32
+ "examples/jasmine/model.js",
33
+ "examples/jasmine/model.spec.js",
34
+ "lib/ichabod.rb",
35
+ "lib/ichabod/coercion.rb",
36
+ "lib/ichabod/delegate/load.rb",
37
+ "lib/ichabod/delegate/ui.rb",
38
+ "lib/ichabod/repl.rb",
39
+ "lib/ichabod/runtime.rb",
40
+ "lib/ichabod/script_object/ichabod.rb",
41
+ "lib/ichabod/script_object/ruby.rb",
42
+ "lib/ichabod/tests.rb",
43
+ "lib/ichabod/version.rb",
44
+ "lib/js/jasmine.js",
45
+ "lib/js/qunit.js"
46
+ ]
47
+ s.homepage = %q{http://github.com/maccman/ichabod}
48
+ s.licenses = ["MIT"]
49
+ s.require_paths = ["lib"]
50
+ s.rubygems_version = %q{1.6.0}
51
+ s.summary = %q{Ichabod allows headless JavaScript testing using WebKit from the command line.}
52
+
53
+ if s.respond_to? :specification_version then
54
+ s.specification_version = 3
55
+
56
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
57
+ else
58
+ end
59
+ else
60
+ end
61
+ end
62
+
@@ -1,5 +1,5 @@
1
1
  module Ichabod
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
 
4
4
  class Version
5
5
  def self.to_s
data/lib/js/jasmine.js CHANGED
@@ -33,7 +33,6 @@ window.addEventListener("load", function(){
33
33
 
34
34
  C.fn.log = function(str){
35
35
  Ruby.puts(str);
36
- console.log(str)
37
36
  };
38
37
 
39
38
  C.fn.print = function(str){
data/lib/js/qunit.js CHANGED
@@ -1,10 +1,26 @@
1
1
  window.addEventListener("load", function(){
2
+ var ansi = {
3
+ green: '\033[32m',
4
+ red: '\033[31m',
5
+ yellow: '\033[33m',
6
+ none: '\033[0m'
7
+ };
8
+
9
+ var puts = function(str){
10
+ Ruby.puts(str);
11
+ };
12
+
13
+ var print = function(str){
14
+ Ruby.print(str);
15
+ };
16
+
2
17
  QUnit.testDone = function(result){
3
- console.log('test Done');
18
+ puts("Results for: " + result.name);
19
+ print(ansi.red + result.failed + " failed, " + ansi.none);
20
+ print(ansi.green + result.passed + " passed, " + ansi.none);
21
+ print("Total " + result.total);
22
+ puts("");
23
+
4
24
  Ichabod.exit();
5
- // result.name
6
- // result.failed
7
- // result.passed
8
- // result.total
9
25
  };
10
26
  });
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: ichabod
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Alex MacCaw
@@ -14,7 +14,7 @@ date: 2011-03-15 00:00:00 +13:00
14
14
  default_executable: ichabod
15
15
  dependencies: []
16
16
 
17
- description: Ichabod wraps JavaScript in a loving MacRuby embrace.
17
+ description:
18
18
  email: info@eribium.org
19
19
  executables:
20
20
  - ichabod
@@ -26,6 +26,7 @@ files:
26
26
  - MIT-LICENSE
27
27
  - README.md
28
28
  - Rakefile
29
+ - VERSION
29
30
  - bin/ichabod
30
31
  - examples/index.html
31
32
  - examples/jasmine/index.html
@@ -36,6 +37,13 @@ files:
36
37
  - examples/jasmine/lib/jasmine.js
37
38
  - examples/jasmine/model.js
38
39
  - examples/jasmine/model.spec.js
40
+ - examples/qunit/index.html
41
+ - examples/qunit/klass.js
42
+ - examples/qunit/lib/qunit.css
43
+ - examples/qunit/lib/qunit.js
44
+ - examples/qunit/model.js
45
+ - examples/qunit/model.test.js
46
+ - ichabod.gemspec
39
47
  - lib/ichabod.rb
40
48
  - lib/ichabod/coercion.rb
41
49
  - lib/ichabod/delegate/load.rb
@@ -75,6 +83,6 @@ rubyforge_project:
75
83
  rubygems_version: 1.6.0
76
84
  signing_key:
77
85
  specification_version: 3
78
- summary: Ichabod wraps JavaScript in a loving MacRuby embrace.
86
+ summary: Ichabod allows headless JavaScript testing using WebKit from the command line.
79
87
  test_files: []
80
88