awe-rails 0.1.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.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ ## 0.1.(3 February 2012)
2
+
3
+ - First version
4
+ - Based on the awe-rails gem at https://github.com/indirect/awe-rails
5
+ - Layered onto a jeweler generated gem
6
+
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ gem "rails", ">= 3.1"
7
+
8
+ # Add dependencies to develop your gem here.
9
+ # Include everything needed to run rake, tests, features, etc.
10
+ group :development do
11
+ gem "rspec", "~> 2.8.0"
12
+ gem "rdoc", "~> 3.12"
13
+ gem "bundler", "~> 1.0.0"
14
+ gem "jeweler", "~> 1.8.3"
15
+ gem "simplecov", ">= 0"
16
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,109 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ actionmailer (3.2.0)
5
+ actionpack (= 3.2.0)
6
+ mail (~> 2.4.0)
7
+ actionpack (3.2.0)
8
+ activemodel (= 3.2.0)
9
+ activesupport (= 3.2.0)
10
+ builder (~> 3.0.0)
11
+ erubis (~> 2.7.0)
12
+ journey (~> 1.0.0)
13
+ rack (~> 1.4.0)
14
+ rack-cache (~> 1.1)
15
+ rack-test (~> 0.6.1)
16
+ sprockets (~> 2.1.2)
17
+ activemodel (3.2.0)
18
+ activesupport (= 3.2.0)
19
+ builder (~> 3.0.0)
20
+ activerecord (3.2.0)
21
+ activemodel (= 3.2.0)
22
+ activesupport (= 3.2.0)
23
+ arel (~> 3.0.0)
24
+ tzinfo (~> 0.3.29)
25
+ activeresource (3.2.0)
26
+ activemodel (= 3.2.0)
27
+ activesupport (= 3.2.0)
28
+ activesupport (3.2.0)
29
+ i18n (~> 0.6)
30
+ multi_json (~> 1.0)
31
+ arel (3.0.0)
32
+ builder (3.0.0)
33
+ diff-lcs (1.1.3)
34
+ erubis (2.7.0)
35
+ git (1.2.5)
36
+ hike (1.2.1)
37
+ i18n (0.6.0)
38
+ jeweler (1.8.3)
39
+ bundler (~> 1.0)
40
+ git (>= 1.2.5)
41
+ rake
42
+ rdoc
43
+ journey (1.0.0)
44
+ json (1.6.5)
45
+ mail (2.4.1)
46
+ i18n (>= 0.4.0)
47
+ mime-types (~> 1.16)
48
+ treetop (~> 1.4.8)
49
+ mime-types (1.17.2)
50
+ multi_json (1.0.4)
51
+ polyglot (0.3.3)
52
+ rack (1.4.1)
53
+ rack-cache (1.1)
54
+ rack (>= 0.4)
55
+ rack-ssl (1.3.2)
56
+ rack
57
+ rack-test (0.6.1)
58
+ rack (>= 1.0)
59
+ rails (3.2.0)
60
+ actionmailer (= 3.2.0)
61
+ actionpack (= 3.2.0)
62
+ activerecord (= 3.2.0)
63
+ activeresource (= 3.2.0)
64
+ activesupport (= 3.2.0)
65
+ bundler (~> 1.0)
66
+ railties (= 3.2.0)
67
+ railties (3.2.0)
68
+ actionpack (= 3.2.0)
69
+ activesupport (= 3.2.0)
70
+ rack-ssl (~> 1.3.2)
71
+ rake (>= 0.8.7)
72
+ rdoc (~> 3.4)
73
+ thor (~> 0.14.6)
74
+ rake (0.9.2.2)
75
+ rdoc (3.12)
76
+ json (~> 1.4)
77
+ rspec (2.8.0)
78
+ rspec-core (~> 2.8.0)
79
+ rspec-expectations (~> 2.8.0)
80
+ rspec-mocks (~> 2.8.0)
81
+ rspec-core (2.8.0)
82
+ rspec-expectations (2.8.0)
83
+ diff-lcs (~> 1.1.2)
84
+ rspec-mocks (2.8.0)
85
+ simplecov (0.5.4)
86
+ multi_json (~> 1.0.3)
87
+ simplecov-html (~> 0.5.3)
88
+ simplecov-html (0.5.3)
89
+ sprockets (2.1.2)
90
+ hike (~> 1.2)
91
+ rack (~> 1.0)
92
+ tilt (~> 1.1, != 1.3.0)
93
+ thor (0.14.6)
94
+ tilt (1.3.3)
95
+ treetop (1.4.10)
96
+ polyglot
97
+ polyglot (>= 0.3.1)
98
+ tzinfo (0.3.31)
99
+
100
+ PLATFORMS
101
+ ruby
102
+
103
+ DEPENDENCIES
104
+ bundler (~> 1.0.0)
105
+ jeweler (~> 1.8.3)
106
+ rails (>= 3.1)
107
+ rdoc (~> 3.12)
108
+ rspec (~> 2.8.0)
109
+ simplecov
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Artefact Group LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,28 @@
1
+ = awe-rails
2
+
3
+ * This gem adds a single generator to Rails 3.1, awe:install.
4
+ * Running the generator will install AWE for Rails.
5
+ * See https://github.com/sambaker/awe-core
6
+ * AWE is installed into the rails asset pipeline.
7
+ * These lines will be added to the file `app/assets/javascripts/application.js` by default:
8
+
9
+ //= require awe
10
+
11
+ == Installation
12
+
13
+ In your Gemfile, add this line:
14
+
15
+ gem "awe-rails"
16
+
17
+ Then, run bundle install. To invoke the generator, run:
18
+
19
+ rails generate awe:install
20
+
21
+ You're done!
22
+
23
+ == Copyright
24
+
25
+ Copyright (c) 2012 Artefact Group LLC.
26
+
27
+ See LICENSE.txt for further details.
28
+
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "awe-rails"
18
+ gem.homepage = "http://www.artefactgroup.com"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Gem for integrating AWE into the rails asset pipeline}
21
+ gem.description = %Q{Modeled after the jquery-rails gem. Installs the AWE files into the rails 3.1 asset pipeline}
22
+ gem.email = "shyam.habarakada@gmail.com"
23
+ gem.authors = ["Shyam Habarakada"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rspec/core'
29
+ require 'rspec/core/rake_task'
30
+ RSpec::Core::RakeTask.new(:spec) do |spec|
31
+ spec.pattern = FileList['spec/**/*_spec.rb']
32
+ end
33
+
34
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
35
+ spec.pattern = 'spec/**/*_spec.rb'
36
+ spec.rcov = true
37
+ end
38
+
39
+ task :default => :spec
40
+
41
+ require 'rdoc/task'
42
+ Rake::RDocTask.new do |rdoc|
43
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
44
+
45
+ rdoc.rdoc_dir = 'rdoc'
46
+ rdoc.title = "awe-rails #{version}"
47
+ rdoc.rdoc_files.include('README*')
48
+ rdoc.rdoc_files.include('lib/**/*.rb')
49
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
Binary file
data/awe-rails.gemspec ADDED
@@ -0,0 +1,74 @@
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 = "awe-rails"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Shyam Habarakada"]
12
+ s.date = "2012-02-04"
13
+ s.description = "Modeled after the jquery-rails gem. Installs the AWE files into the rails 3.1 asset pipeline"
14
+ s.email = "shyam.habarakada@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "CHANGELOG.md",
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE.txt",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "awe-rails-1.0.17.gem",
30
+ "awe-rails.gemspec",
31
+ "lib/awe-rails.rb",
32
+ "lib/awe/rails.rb",
33
+ "lib/awe/rails/engine.rb",
34
+ "lib/generators/awe/install/install_generator.rb",
35
+ "spec/awe-rails_spec.rb",
36
+ "spec/lib/awe-rails_spec.rb",
37
+ "spec/spec_helper.rb",
38
+ "vendor/assets/javascripts/awe-core.js",
39
+ "vendor/assets/javascripts/awe-state-machine.js"
40
+ ]
41
+ s.homepage = "http://www.artefactgroup.com"
42
+ s.licenses = ["MIT"]
43
+ s.require_paths = ["lib"]
44
+ s.rubygems_version = "1.8.10"
45
+ s.summary = "Gem for integrating AWE into the rails asset pipeline"
46
+
47
+ if s.respond_to? :specification_version then
48
+ s.specification_version = 3
49
+
50
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
+ s.add_runtime_dependency(%q<rails>, [">= 3.1"])
52
+ s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
53
+ s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
54
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
55
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
56
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
57
+ else
58
+ s.add_dependency(%q<rails>, [">= 3.1"])
59
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
60
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
61
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
62
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
63
+ s.add_dependency(%q<simplecov>, [">= 0"])
64
+ end
65
+ else
66
+ s.add_dependency(%q<rails>, [">= 3.1"])
67
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
68
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
69
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
70
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
71
+ s.add_dependency(%q<simplecov>, [">= 0"])
72
+ end
73
+ end
74
+
@@ -0,0 +1,12 @@
1
+ # Configure Rails
2
+ module Awe
3
+ module Rails
4
+
5
+ class Engine < ::Rails::Engine
6
+ config.before_configuration do
7
+ # nothing to do here (yet)
8
+ end
9
+ end
10
+
11
+ end
12
+ end
data/lib/awe/rails.rb ADDED
@@ -0,0 +1,5 @@
1
+ module Awe
2
+ module Rails
3
+ require 'awe/rails/engine'
4
+ end
5
+ end
data/lib/awe-rails.rb ADDED
@@ -0,0 +1 @@
1
+ require 'awe/rails'
@@ -0,0 +1,20 @@
1
+ require 'rails'
2
+
3
+ module Awe
4
+ module Generators
5
+ class InstallGenerator < ::Rails::Generators::Base
6
+
7
+ desc "This generator installs AWE (Artefact Web Extensions) into the rails asset pipeline"
8
+ source_root File.expand_path('../../../../../vendor/assets/javascripts', __FILE__)
9
+
10
+ def copy_awe
11
+ say_status("copying", "awe-core", :green)
12
+ copy_file "awe-core.js", "public/javascripts/awe-core.js"
13
+ say_status("copying", "awe-state-machine", :green)
14
+ copy_file "awe-state-machine.js", "public/javascripts/awe-state-machine.js"
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,5 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "AweRails" do
4
+ it "should probably test something but I am not sure what either"
5
+ end
@@ -0,0 +1,3 @@
1
+ require 'spec_helper'
2
+
3
+ it "should probably test something, but I'm damned if I know what"
@@ -0,0 +1,50 @@
1
+ <<<<<<< HEAD
2
+ <<<<<<< HEAD
3
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
5
+ require 'rspec'
6
+ require 'awe-rails'
7
+
8
+ # Requires supporting files with custom matchers and macros, etc,
9
+ # in ./support/ and its subdirectories.
10
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
11
+
12
+ RSpec.configure do |config|
13
+
14
+ end
15
+ =======
16
+ =======
17
+ >>>>>>> ccf863516cd6c75a59a22dde092099839482274b
18
+ # Set up RSpec
19
+ require 'webmock/rspec'
20
+
21
+ Spec::Runner.configure do |config|
22
+ config.include WebMock::API
23
+ end
24
+
25
+ # Set up generator tests
26
+ require 'rails/all'
27
+ require 'rails/generators'
28
+ require 'rails/generators/test_case'
29
+
30
+ class TestApp < Rails::Application
31
+ config.root = File.dirname(__FILE__)
32
+ end
33
+ Rails.application = TestApp
34
+
35
+ module Rails
36
+ def self.root
37
+ @root ||= File.expand_path("../../tmp/rails", __FILE__)
38
+ end
39
+ end
40
+ Rails.application.config.root = Rails.root
41
+
42
+ # Call configure to load the settings from
43
+ # Rails.application.config.generators to Rails::Generators
44
+ Rails::Generators.configure!
45
+
46
+
47
+ <<<<<<< HEAD
48
+ >>>>>>> ccf863516cd6c75a59a22dde092099839482274b
49
+ =======
50
+ >>>>>>> ccf863516cd6c75a59a22dde092099839482274b
@@ -0,0 +1,537 @@
1
+ /*
2
+ * Artefact Web Extensions
3
+ *
4
+ * Copyright 2012, Artefact Group LLC
5
+ * Licensed under MIT.
6
+ */
7
+ (function(global, document, namespace, undefined) {
8
+ namespace = namespace || "Awe";
9
+
10
+ // Create and export Awe
11
+ var Awe = {}
12
+
13
+ // Helpers
14
+ Awe.isArray = function(o) {
15
+ return o && o.constructor == Array.prototype.constructor;
16
+ }
17
+
18
+ Awe.isArrayOrString = function(o) {
19
+ return o && o.constructor == Array.prototype.constructor || o.constructor == String.prototype.constructor;
20
+ }
21
+
22
+ Awe.isType = function(o, type) {
23
+ return o && o.constructor == type.prototype.constructor;
24
+ }
25
+
26
+ Awe.isFunction = function(o) {
27
+ return o && o.constructor == Function.prototype.constructor;
28
+ }
29
+
30
+ // Environment-specific vars
31
+ Awe.env = {};
32
+ Awe.env.inputTouch = "ontouchstart" in global;
33
+ Awe.env.inputMouse = !Awe.env.inputTouch;
34
+
35
+ Awe.env.eventDragStart = Awe.env.inputTouch ? "touchstart" : "mousedown";
36
+ Awe.env.eventDragMove = Awe.env.inputTouch ? "touchmove" : "mousemove";
37
+ Awe.env.eventDragEnd = Awe.env.inputTouch ? "touchend" : "mouseup";
38
+ Awe.env.eventClick = Awe.env.inputTouch ? "touchend" : "click";
39
+
40
+ // Clamp a number between min/max
41
+ Awe.clamp = function(n, min, max) {
42
+ return Math.min(Math.max(n, min), max);
43
+ }
44
+
45
+ // Clamp a number between -1 and 1 before passing to Math.acos to prevent an exception.
46
+ // Ensure that this makes sense for your parameters - it is assumed they will be close to
47
+ // the clamped range but allows computational errors to be safely ignored.
48
+ Awe.acosSafe = function(rad) {
49
+ return Math.acos(Awe.clamp(rad, -1, 1));
50
+ }
51
+
52
+ // Get a query string parameter value by name
53
+ Awe.getQueryParam = function(name, url) {
54
+ url = url || global.location.href;
55
+ name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
56
+ var regexS = "[\\?&]"+name+"=([^&#]*)";
57
+ var regex = new RegExp( regexS );
58
+ var results = regex.exec( url );
59
+ if (!results)
60
+ return "";
61
+ return results[1];
62
+ }
63
+
64
+ if (Array.prototype.forEach) {
65
+ Awe.forEach = function(array, callback, thisArg) {
66
+ array.forEach(callback, thisArg);
67
+ }
68
+ } else {
69
+ Awe.forEach = function(array, callback, thisArg) {
70
+ var length = array.length;
71
+ var i = 0;
72
+ while (i < length) {
73
+ callback.call(thisArg, array[i], i);
74
+ ++i;
75
+ }
76
+ }
77
+ }
78
+
79
+ // Create an HTML element of the given type and attach to the given parent if not null.
80
+ // The config object can contain styles, attrs, a class and a background sprite to apply
81
+ // to the element
82
+ Awe.createElement = function(type, parent, config) {
83
+ var k;
84
+ var el = document.createElement(type);
85
+ config = config || {};
86
+ if (config.backgroundSprite) {
87
+ // TODO:
88
+ throw("TODO:");
89
+ //setBackgroundSprite(el, config.backgroundSprite);
90
+ }
91
+ for (k in (config.styles || {})) {
92
+ el.style[k] = config.styles[k];
93
+ }
94
+ for (k in (config.attrs || {})) {
95
+ el[k] = config.attrs[k];
96
+ }
97
+ for (k in (config.setAttrs || {})) {
98
+ el.setAttribute(k, config.setAttrs[k]);
99
+ }
100
+
101
+ if (parent)
102
+ parent.appendChild(el);
103
+
104
+ if (config.className)
105
+ el.className = config.className;
106
+
107
+ return el;
108
+ }
109
+
110
+ /*
111
+ * method: Awe.enableDrag
112
+ *
113
+ * purpose: enable drag on a DOM element
114
+ *
115
+ */
116
+
117
+ Awe.enableDrag = function(el, config) {
118
+
119
+ config = config || {};
120
+ var filters = config.filters;
121
+ var updater = config.updater || new Awe.DragUpdaterTopLeft();
122
+
123
+ // Convert a single drag filter
124
+ if (filters) {
125
+ if (!Awe.isArray(filters)) {
126
+ filters = [filters];
127
+ }
128
+ } else {
129
+ filters = [];
130
+ }
131
+
132
+ // Drag state
133
+ var touch = {};
134
+
135
+ function getClientPos(evt)
136
+ {
137
+ var p;
138
+ if (Awe.env.inputTouch)
139
+ {
140
+ // TODO: Use correct touch (lookup by touch start ID instead of always using index 0)
141
+ p = { x: evt.changedTouches[0].clientX, y: evt.changedTouches[0].clientY };
142
+ } else {
143
+ p = { x: evt.clientX, y: evt.clientY };
144
+ }
145
+ p.x += touch.anchor.x;
146
+ p.y += touch.anchor.y;
147
+ return p
148
+ }
149
+
150
+ function processDrag(clientPos, pos, start) {
151
+ if (touch.now) {
152
+ touch.maxDistanceSquared = Math.max(touch.maxDistanceSquared, (touch.now.x - touch.start.x) * (touch.now.x - touch.start.x) + (touch.now.y - touch.start.y) * (touch.now.y - touch.start.y));
153
+ } else {
154
+ touch.maxDistanceSquared = 0;
155
+ }
156
+
157
+ // Create the new drag state
158
+ var newDrag = {
159
+ clientPos: { x: clientPos.x, y: clientPos.y },
160
+ pos: { x: pos.x, y: pos.y },
161
+ dragTime: (Date.now() - touch.startTime) * 0.001,
162
+ maxDistanceSquared: touch.maxDistanceSquared
163
+ }
164
+ if (touch.lastDrag) {
165
+ newDrag.clientDelta = {
166
+ x: newDrag.clientPos.x - touch.lastDrag.clientPos.x,
167
+ y: newDrag.clientPos.y - touch.lastDrag.clientPos.y
168
+ }
169
+ newDrag.delta = {
170
+ x: newDrag.pos.x - touch.lastDrag.pos.x,
171
+ y: newDrag.pos.y - touch.lastDrag.pos.y
172
+ }
173
+ } else {
174
+ newDrag.clientDelta = { x: 0, y: 0 };
175
+ newDrag.delta = { x: 0, y: 0 };
176
+ }
177
+
178
+ // Copy current drag state to last
179
+ touch.lastDrag = {
180
+ clientPos: { x: newDrag.clientPos.x, y: newDrag.clientPos.y },
181
+ pos: { x: newDrag.pos.x, y: newDrag.pos.y },
182
+ delta: { x: newDrag.delta.x, y: newDrag.delta.y },
183
+ clientDelta: { x: newDrag.clientDelta.x, y: newDrag.clientDelta.y },
184
+ dragTime: newDrag.dragTime,
185
+ maxDistanceSquared: newDrag.maxDistanceSquared
186
+ }
187
+
188
+ return newDrag;
189
+ }
190
+
191
+ function updateDrag() {
192
+ return touch.lastDrag && {
193
+ clientPos: touch.lastDrag.clientPos,
194
+ pos: touch.lastDrag.pos,
195
+ clientDelta: { x: 0, y: 0 },
196
+ delta: { x: 0, y: 0 },
197
+ dragTime: (Date.now() - touch.startTime) * 0.001,
198
+ maxDistanceSquared: touch.lastDrag.maxDistanceSquared
199
+ }
200
+ }
201
+
202
+ // Per-frame updates
203
+ function dragUpdate(evt) {
204
+ var clientPos = touch.now || touch.start;
205
+ clientPos = { x: clientPos.x, y: clientPos.y };
206
+ var pos;
207
+ Awe.forEach(filters, function(filter) {
208
+ if (!pos && filter.animating) {
209
+ pos = filter.animate();
210
+ }
211
+ });
212
+ if (pos) {
213
+ updater.move(el, pos);
214
+ config.onChange(processDrag(clientPos, pos));
215
+ }
216
+ if (config.onUpdate) {
217
+ var drag = updateDrag();
218
+ drag && config.onUpdate(drag);
219
+ }
220
+ }
221
+
222
+ function dragMove(evt) {
223
+ Awe.cancelEvent(evt);
224
+ touch.now = getClientPos(evt);
225
+ var pos = applyFilters(touch.now);
226
+ var drag = processDrag(touch.now, pos);
227
+ if (config.onChange) {
228
+ config.onChange(drag);
229
+ }
230
+ }
231
+
232
+ function dragEnd(evt) {
233
+ if (!touch.dragging) {
234
+ return;
235
+ }
236
+ evt && Awe.cancelEvent(evt);
237
+ xRemoveEventListener(Awe.env.inputTouch ? el : document, Awe.env.eventDragMove, dragMove);
238
+ xRemoveEventListener(Awe.env.inputTouch ? el : document, Awe.env.eventDragEnd, dragEnd);
239
+ // TODO Check for animating filters before cancelling event bits
240
+ Awe.forEach(filters, function(filter) {
241
+ if (filter.end) {
242
+ filter.end();
243
+ }
244
+ });
245
+ if (updater.end) {
246
+ updater.end();
247
+ }
248
+ if (config.onRelease && evt) {
249
+ var pos = getClientPos(evt);
250
+ config.onRelease(processDrag(pos, pos));
251
+ }
252
+ if (touch.updateIntervalId) {
253
+ clearInterval(touch.updateIntervalId);
254
+ touch.updateIntervalId = null;
255
+ }
256
+ }
257
+
258
+ function applyFilters(pos) {
259
+ Awe.forEach(filters, function(filter) {
260
+ pos = filter.move(el, pos) || pos;
261
+ });
262
+ return pos;
263
+ }
264
+
265
+ function dragStart(evt) {
266
+ Awe.cancelEvent(evt);
267
+ touch.dragging = true;
268
+ touch.anchor = { x: 0, y: 0 }
269
+ // Calculate the position without the anchor
270
+ touch.now = getClientPos(evt);
271
+ // Calculate the anchor position
272
+ if (config.anchor) {
273
+ touch.anchor = config.anchor.getAnchor(el, touch.now);
274
+ // Get the client position again, taking the anchor into account
275
+ touch.now = getClientPos(evt);
276
+ }
277
+ touch.lastDrag = null;
278
+ touch.start = getClientPos(evt);
279
+ touch.startTime = Date.now();
280
+ touch.maxDistanceSquared = 0;
281
+
282
+ var pos = touch.start;
283
+ Awe.forEach(filters, function(filter) {
284
+ pos = filter.start(el, pos) || pos;
285
+ });
286
+ if (updater.start) {
287
+ updater.start(el, pos);
288
+ }
289
+
290
+ var pos = applyFilters(touch.now);
291
+
292
+ var drag = processDrag(touch.now, pos);
293
+ xAddEventListener(Awe.env.inputTouch ? el : document, Awe.env.eventDragMove, dragMove);
294
+ xAddEventListener(Awe.env.inputTouch ? el : document, Awe.env.eventDragEnd, dragEnd);
295
+ if (config.onUpdate) {
296
+ touch.updateIntervalId = setInterval(dragUpdate, config.dragUpdateInterval || 33);
297
+ }
298
+ }
299
+
300
+ xAddEventListener(el, Awe.env.eventDragStart, dragStart);
301
+
302
+ el._disableDrag = function() {
303
+ xRemoveEventListener(el, Awe.env.eventDragStart, dragStart);
304
+ // Make sure any in-progress drags have their listeners removed
305
+ dragEnd();
306
+ }
307
+ }
308
+
309
+ /*
310
+ * method: Awe.disableDrag
311
+ *
312
+ * purpose: disable drag on a DOM element
313
+ *
314
+ */
315
+ Awe.disableDrag = function(el) {
316
+ if (el._disableDrag) {
317
+ el._disableDrag();
318
+ el._disableDrag = null;
319
+ }
320
+ }
321
+
322
+ Awe.DragAnchorTopLeft = function() {
323
+ var _i = this;
324
+
325
+ _i.getAnchor = function(el, pos) {
326
+ return { x: xLeft(el) - pos.x, y: xTop(el) - pos.y }
327
+ }
328
+ }
329
+
330
+ Awe.DragFilterLimitAxes = function(minX, maxX, minY, maxY) {
331
+ var _i = this;
332
+
333
+ _i.start = function(el, pos) {
334
+ }
335
+
336
+ _i.move = function(el, pos) {
337
+ var x = Awe.clamp(pos.x, minX, maxX);
338
+ var y = Awe.clamp(pos.y, minY, maxY);
339
+ return { x: x, y: y };
340
+ }
341
+ }
342
+
343
+ // To be continued...
344
+ /*
345
+ Awe.DragFilterMomentum = function() {
346
+ var _i = this;
347
+
348
+ _i.start = function(el, pos) {
349
+ }
350
+
351
+ _i.move = function(el, pos) {
352
+ _i.animating = true;
353
+ return { x: x, y: y };
354
+ }
355
+
356
+ _i.animate = function() {
357
+ // Apply velocity and acceleration
358
+ if (vel == 0) {
359
+ _i.animating = false;
360
+ }
361
+ }
362
+ */
363
+
364
+ Awe.DragUpdaterTopLeft = function() {
365
+ var _i = this;
366
+
367
+ _i.start = function(el, pos) {
368
+ }
369
+
370
+ _i.move = function(el, pos) {
371
+ var left = pos.x;
372
+ var top = pos.y;
373
+ el.style.left = left + "px";
374
+ el.style.top = top + "px";
375
+
376
+ return pos;
377
+ }
378
+ }
379
+
380
+ /*
381
+ * method: Awe.objectToString
382
+ *
383
+ * purpose: convert an arbitrary object to string representation for logging
384
+ *
385
+ */
386
+ Awe.objectToString = function(o) {
387
+ // Do something more interesting in the future?
388
+ return JSON.stringify(o);
389
+ }
390
+
391
+ var requestAnimationFrameShim = (function() {
392
+ return global.requestAnimationFrame ||
393
+ global.webkitRequestAnimationFrame ||
394
+ global.mozRequestAnimationFrame ||
395
+ global.oRequestAnimationFrame ||
396
+ global.msRequestAnimationFrame ||
397
+ function( callback ){
398
+ global.setTimeout(callback, 1000 / 60);
399
+ };
400
+ })();
401
+
402
+ // Specify a callback
403
+ Awe.addAnimationCallback = function(callback, interval) {
404
+ var startTime = Date.now();
405
+ var lastTime = startTime;
406
+ if (interval === undefined) {
407
+ requestAnimationFrameShim(function wrapper() {
408
+ time = Date.now();
409
+ if (!callback(time - lastTime, time - startTime)) {
410
+ requestAnimationFrameShim(wrapper);
411
+ }
412
+ lastTime = time;
413
+ })
414
+ } else {
415
+ var intervalId = setInterval(function () {
416
+ time = Date.now();
417
+ if (callback(time - lastTime, time - startTime)) {
418
+ clearInterval(intervalId);
419
+ }
420
+ lastTime = time;
421
+ }, interval);
422
+ }
423
+ }
424
+
425
+ // Cancels an event to stop propogation. Use this to swallow events in listeners.
426
+ Awe.cancelEvent = function(e) {
427
+ if (e == null) {
428
+ e = global.event;
429
+ }
430
+
431
+ if (!e) {
432
+ return;
433
+ }
434
+
435
+ if (!global.attachEvent) {
436
+
437
+ if (e.stopPropagation) {
438
+ e.stopPropagation();
439
+ }
440
+ e.preventDefault();
441
+ return false
442
+ }
443
+
444
+ e.cancelBubble = true;
445
+ e.returnValue = false;
446
+
447
+ return false;
448
+ }
449
+
450
+ var _nextGuid = 0;
451
+
452
+ // Returns a string unique to this session
453
+ Awe.getGuid = function() {
454
+ return "_guid_" + ++_nextGuid;
455
+ }
456
+
457
+ // Returns a unique positive integral number > 0
458
+ Awe.getGuidNumeric = function() {
459
+ return ++_nextGuid;
460
+ }
461
+
462
+ // Classes
463
+ var hexToInt = {
464
+ "0":0,
465
+ "1":1,
466
+ "2":2,
467
+ "3":3,
468
+ "4":4,
469
+ "5":5,
470
+ "6":6,
471
+ "7":7,
472
+ "8":8,
473
+ "9":9,
474
+ "a":10,"A":10,
475
+ "b":11,"B":11,
476
+ "c":12,"C":12,
477
+ "d":13,"D":13,
478
+ "e":14,"E":14,
479
+ "f":15,"F":15,
480
+ }
481
+
482
+ // Color class parses CSS color specs in different formats ("#rrggbb", "rgb(r, g, b)" or "rgba(r, g, b, a)") and provides
483
+ // accessors to r/g/b/a components and CSS color strings.
484
+ Awe.Color = function(color) {
485
+ var _i = this;
486
+
487
+ _i.toHex = function() {
488
+ return _i.hex;
489
+ }
490
+
491
+ _i.toRGBA = function(alpha) {
492
+ if (alpha == undefined) {
493
+ alpha = _i.a;
494
+ }
495
+ return "rgba("+_i.r+","+_i.g+","+_i.b+","+alpha+")";
496
+ }
497
+
498
+ _i.toRGB = function() {
499
+ return "rgba("+_i.r+","+_i.g+","+_i.b+")";
500
+ }
501
+
502
+ if (color[0] == "#") {
503
+ _i.hex = color;
504
+ _i.r = (hexToInt[color[1]] << 4) + hexToInt[color[2]];
505
+ _i.g = (hexToInt[color[3]] << 4) + hexToInt[color[4]];
506
+ _i.b = (hexToInt[color[5]] << 4) + hexToInt[color[6]];
507
+ _i.a = 1;
508
+ } else {
509
+ if (color.indexOf('rgb(') == 0) {
510
+ color = color.substring(4,color.length-1);
511
+ } else if (color.indexOf('rgba(') == 0) {
512
+ color = color.substring(5,color.length-1);
513
+ }
514
+ var i;
515
+ _i.r = parseInt(color);
516
+ color = color.substring(color.indexOf(',')+1);
517
+ _i.g = parseInt(color);
518
+ color = color.substring(color.indexOf(',')+1);
519
+ _i.b = parseInt(color);
520
+ color = color.substring(color.indexOf(',')+1);
521
+ if (color) {
522
+ _i.a = parseFloat(color);
523
+ } else {
524
+ _i.a = 1;
525
+ }
526
+ }
527
+ }
528
+
529
+ // Allow the script URL to override the namespace, naming the library Monkey instead of Awe etc
530
+ // NOTE: This is not likely to ever be necessary, but it's an interesting theoretical exercise
531
+ var scripts = document.getElementsByTagName('script');
532
+ var scriptUrl = scripts && scripts.length && scripts[scripts.length - 1].src;
533
+ var overrideNamespace = scriptUrl && Awe.getQueryParam("namespace", scriptUrl);
534
+
535
+ global[overrideNamespace || namespace] = Awe;
536
+
537
+ })(this, document)
@@ -0,0 +1,128 @@
1
+ /*
2
+ * Artefact Web Extensions
3
+ *
4
+ * Copyright 2012, Artefact Group LLC
5
+ * Licensed under MIT.
6
+ */
7
+ (function(Awe, global, document, undefined) {
8
+
9
+ // State contains any of:
10
+ // allowOnly - array with 0 or more states (or null)
11
+ // doNotAllow - array with 1 or more states (or null)
12
+ // start function (or null)
13
+ // update function (or null)
14
+ // end function (or null)
15
+
16
+ var StateMachine = Awe.StateMachine = function(name, stateMap, initialStateId) {
17
+ var _i = this;
18
+
19
+ StateMachine.stateMachines.push(_i);
20
+
21
+ _i.name = name;
22
+ _i.states = stateMap || [];
23
+ _i.currentStateId = null;
24
+
25
+ _i.addState = function(id, state) {
26
+ if (_i.states[id]) {
27
+ throw "Duplicate state added!";
28
+ }
29
+ _i.states[id] = state;
30
+ }
31
+
32
+ _i.getCurrentStateId = function() {
33
+ return _i.currentStateId;
34
+ }
35
+
36
+ // Request a state that is assumed to be a transitional state and call the supplied callback on completion.
37
+ // The callback will not be called if the transition state is interrupted, but you can prevent this by making
38
+ // the transition state uninterruptable: pass an empty array in the transition states allowOnly field, which will
39
+ // disallow any transitions while the state is active. The transitionCompleteCallback should then change state
40
+ // once the transition is complete.
41
+ _i.requestTransitionState = function(id) {
42
+
43
+ if (typeof(arguments[arguments.length - 1]) != "function") {
44
+ throw "Last argument of StateMachine.requestTransitionState must be an on-complete callback"
45
+ }
46
+
47
+ if (_i.requestState.apply(_i, arguments)) {
48
+ _i.transitionCompleteCallback = arguments[arguments.length - 1];
49
+
50
+ if (!_i.states[_i.currentStateId].update) {
51
+ throw "ERROR: Transition states must have an update method, otherwise they will never be able to complete.";
52
+ }
53
+ return true;
54
+ }
55
+
56
+ // Remove the transition complete callback if the switch to the transition state was refused.
57
+ _i.transitionCompleteCallback = null;
58
+ return false;
59
+ }
60
+
61
+ // Request a change to the supplied state. If a current state exists that will be checked for any conditions that
62
+ // disallow transition to the new state.
63
+ _i.requestState = function(id) {
64
+
65
+ var nextState = id && _i.states[id];
66
+
67
+ if (id && !nextState) {
68
+ return false;
69
+ }
70
+
71
+ if (_i.currentStateId) {
72
+ var currentState = _i.states[_i.currentStateId];
73
+
74
+ if (!_i.currentStateDone && currentState.allowOnly && !currentState.allowOnly.indexOf(id)) {
75
+ return false;
76
+ }
77
+ if (!_i.currentStateDone && currentState.doNotAllow && currentState.doNotAllow.indexOf(id)) {
78
+ return false;
79
+ }
80
+
81
+ if (currentState.end) {
82
+ currentState.end.call(currentState, id);
83
+ }
84
+ }
85
+
86
+ if (nextState) {
87
+ nextState._startTime = Date.now();
88
+ nextState.runTime = 0;
89
+ if (nextState.start) {
90
+ nextState.start.apply(nextState, [_i.currentState && _i.currentState.id].concat(Array.prototype.slice.call(arguments,1)));
91
+ }
92
+ }
93
+
94
+ _i.currentStateId = id;
95
+
96
+ return true;
97
+ }
98
+
99
+ _i.update = function() {
100
+ var currentState = _i.states[_i.currentStateId];
101
+ currentState.runTime = (Date.now() - currentState._startTime) * 0.001;
102
+ if (currentState && currentState.update) {
103
+ // Update the current state and if it's a transition state, call the transition state callback once the
104
+ // transition state's update returns true to signify completion
105
+ if (currentState.update.call(currentState) && _i.transitionCompleteCallback) {
106
+ var callback = _i.transitionCompleteCallback;
107
+ _i.transitionCompleteCallback = null;
108
+ _i.currentStateDone = true;
109
+ callback();
110
+ _i.currentStateDone = false;
111
+ }
112
+ }
113
+ }
114
+
115
+ if (initialStateId) {
116
+ _i.requestState(initialStateId);
117
+ }
118
+
119
+ return _i;
120
+ }
121
+
122
+ StateMachine.stateMachines = []
123
+ StateMachine.update = function() {
124
+ for (var i = 0; i < StateMachine.stateMachines.length; ++i) {
125
+ StateMachine.stateMachines[i].update();
126
+ }
127
+ }
128
+ })(Awe, this, document)
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: awe-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Shyam Habarakada
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-04 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: &70279789265900 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '3.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70279789265900
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70279789265020 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 2.8.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70279789265020
36
+ - !ruby/object:Gem::Dependency
37
+ name: rdoc
38
+ requirement: &70279789264460 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '3.12'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70279789264460
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: &70279789263860 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70279789263860
58
+ - !ruby/object:Gem::Dependency
59
+ name: jeweler
60
+ requirement: &70279789263300 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 1.8.3
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70279789263300
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: &70279789262680 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70279789262680
80
+ description: Modeled after the jquery-rails gem. Installs the AWE files into the rails
81
+ 3.1 asset pipeline
82
+ email: shyam.habarakada@gmail.com
83
+ executables: []
84
+ extensions: []
85
+ extra_rdoc_files:
86
+ - LICENSE.txt
87
+ - README.rdoc
88
+ files:
89
+ - .document
90
+ - .rspec
91
+ - CHANGELOG.md
92
+ - Gemfile
93
+ - Gemfile.lock
94
+ - LICENSE.txt
95
+ - README.rdoc
96
+ - Rakefile
97
+ - VERSION
98
+ - awe-rails-1.0.17.gem
99
+ - awe-rails.gemspec
100
+ - lib/awe-rails.rb
101
+ - lib/awe/rails.rb
102
+ - lib/awe/rails/engine.rb
103
+ - lib/generators/awe/install/install_generator.rb
104
+ - spec/awe-rails_spec.rb
105
+ - spec/lib/awe-rails_spec.rb
106
+ - spec/spec_helper.rb
107
+ - vendor/assets/javascripts/awe-core.js
108
+ - vendor/assets/javascripts/awe-state-machine.js
109
+ homepage: http://www.artefactgroup.com
110
+ licenses:
111
+ - MIT
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ segments:
123
+ - 0
124
+ hash: -4385544839732221746
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubyforge_project:
133
+ rubygems_version: 1.8.10
134
+ signing_key:
135
+ specification_version: 3
136
+ summary: Gem for integrating AWE into the rails asset pipeline
137
+ test_files: []