Skip to content
This repository has been archived by the owner on May 12, 2021. It is now read-only.

Commit

Permalink
rewrote the app using isolated jasmine tests
Browse files Browse the repository at this point in the history
  • Loading branch information
searls committed Apr 8, 2012
1 parent 64aa972 commit 503f65a
Show file tree
Hide file tree
Showing 57 changed files with 11,789 additions and 1,407 deletions.
22 changes: 13 additions & 9 deletions Guardfile
@@ -1,13 +1,17 @@
require './app'

guard 'sprockets2', :sprockets => App.sprockets, :digest => false do
watch(%r{^assets/.+$})
watch('app.rb')
group :a do
guard 'sprockets2', :sprockets => App.sprockets, :digest => false do
watch(%r{^assets/.+$})
watch('app.rb')
end
end

spec_location = "spec/%s_spec"
guard 'jasmine-headless-webkit' do
watch(%r{^src/(.*)\.(coffee|js)$}) { |m| newest_js_file(spec_location % m[1]) }
watch(%r{^spec/helpers*})
watch(%r{^spec/(.*)_spec\..*}) { |m| newest_js_file(spec_location % m[1]) }
end
group :j do
spec_location = "spec/%s_spec"
guard 'jasmine-headless-webkit' do
watch(%r{^src/(.*)\.(coffee|js)$}) { |m| newest_js_file(spec_location % m[1]) }
watch(%r{^spec/helpers*})
watch(%r{^spec/(.*)_spec\..*}) { |m| newest_js_file(spec_location % m[1]) }
end
end
18 changes: 18 additions & 0 deletions Rakefile
@@ -1,5 +1,7 @@
require 'rake/packagetask'
require 'rake/clean'


require 'jasmine-headless-webkit'
require 'jasmine/headless/task'

Expand All @@ -11,5 +13,21 @@ include Rake::DSL if defined?(Rake::DSL)
Jasmine::Headless::Task.new
Cucumber::Rake::Task.new

# Rake::PackageTask.new("words", :noversion) do |p|
# p.package_dir = "dist"
# p.need_zip = true
# p.package_files.include("public/**/*")
# end
#
#
# task :zip_it do
# file "words.zip" => "dist/words.zip" do
# chdir("dist/words/public") do
# sh %{zip ../../words *}
# puts "ZIP"
# end
# end
# end

task :default => ['jasmine:headless', 'cucumber']

1 change: 0 additions & 1 deletion app.rb
Expand Up @@ -14,7 +14,6 @@ class App < Sinatra::Base
set :root, File.expand_path('../', __FILE__)
set :sprockets, Sprockets::Environment.new(root)
set :precompile, [ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]
# set :precompile, [ /.*/ ]
set :assets_prefix, 'assets'
set :assets_path, File.join(root, 'public', assets_prefix)

Expand Down
13 changes: 10 additions & 3 deletions assets/javascripts/application.js
@@ -1,6 +1,13 @@
//= require ./vendor/jquery-min.js
//= require ./vendor/underscore-min.js
//= require ./vendor/backbone-min.js
//= require ./vendor/jquery-min
//= require ./vendor/underscore-min
//= require ./vendor/backbone-min
//= require_tree ./vendor

//= require src/bootstrap
//= require_tree ./src/helpers
//= require_tree ./src/models
//= require_tree ./src/collections
//= require_tree ./src/views
//= require_tree ./src

//= require_tree .
11 changes: 11 additions & 0 deletions assets/javascripts/src/bootstrap.coffee
@@ -0,0 +1,11 @@
window.app =
views: {}
models: {}
collections: {}
configuration: {}
initializers: {}
helpers: {}
dom: {}


_.mixin(_.str.exports())
15 changes: 0 additions & 15 deletions assets/javascripts/src/change-words.coffee

This file was deleted.

3 changes: 3 additions & 0 deletions assets/javascripts/src/collections/configurations.coffee
@@ -0,0 +1,3 @@
class app.collections.Configurations extends Backbone.Collection
model: app.models.Configuration
localStorage: new Backbone.LocalStorage("Configurations")
@@ -0,0 +1 @@
class app.collections.DictionaryEntries extends Backbone.Collection
9 changes: 9 additions & 0 deletions assets/javascripts/src/configuration/fetches-config.coffee
@@ -0,0 +1,9 @@
class app.configuration.FetchesConfig
fetch: ->
configs = new app.collections.Configurations
configs.fetch()
if config = configs.at(0)
config
else
configs.add({})
configs.at(0)
11 changes: 11 additions & 0 deletions assets/javascripts/src/dom/replaces-words.coffee
@@ -0,0 +1,11 @@
class app.dom.ReplacesWords
replace: (entries) ->
$("*").each (el, i) ->
if $(this).children().length == 0
replaceAsNeeded = (word) ->
match = _(entries).find (entry) -> entry.original == word
if match then match.replacement else word

$(this).text _($(this).text()).chain().words().reduce((memo, word) ->
"#{memo} #{replaceAsNeeded(word)}"
, "").value()
6 changes: 6 additions & 0 deletions assets/javascripts/src/helpers/super-view.coffee
@@ -0,0 +1,6 @@
class app.helpers.SuperView extends Backbone.View
render: ->
@$el.html(JST[@template](@serialize?()))
@trigger('rendered')

serialize: -> model: @model?.toJSON()
@@ -0,0 +1,8 @@
class app.initializers.ListensForMessages
listen: ->
$(document).ready ->
if $('body').hasClass('js-background-page')
chrome.extension.onRequest.addListener (request, sender, sendResponse) ->
response = switch request.type
when "config" then new app.configuration.FetchesConfig().fetch().toJSON()
sendResponse(response)
@@ -0,0 +1,7 @@
class app.initializers.RendersConfiguration
render: ->
$(window.document).ready ->
if $('body').hasClass('js-options-page')
config = new app.configuration.FetchesConfig().fetch()
view = new app.views.Configuration(model: config)
$('.root').append(view.render().el)
5 changes: 5 additions & 0 deletions assets/javascripts/src/initializers/transforms-content.coffee
@@ -0,0 +1,5 @@
class app.initializers.TransformsContent
transform: ->
chrome.extension.sendRequest {type: "config"}, (config) ->
$(document).ready ->
new app.dom.ReplacesWords().replace(config.dictionary.entries)
11 changes: 11 additions & 0 deletions assets/javascripts/src/models/configuration.coffee
@@ -0,0 +1,11 @@
class app.models.Configuration extends Backbone.RelationalModel
relations: [
{
type: Backbone.HasOne
key: 'dictionary'
relatedModel: 'app.models.Dictionary'
}
]

defaults: ->
dictionary: new app.models.Dictionary
2 changes: 2 additions & 0 deletions assets/javascripts/src/models/dictionary-entry.coffee
@@ -0,0 +1,2 @@
class app.models.DictionaryEntry extends Backbone.RelationalModel

9 changes: 9 additions & 0 deletions assets/javascripts/src/models/dictionary.coffee
@@ -0,0 +1,9 @@
class app.models.Dictionary extends Backbone.RelationalModel
relations: [
{
type: Backbone.HasMany
key: 'entries'
relatedModel: 'app.models.DictionaryEntry'
collectionType: 'app.collections.DictionaryEntries'
}
]
49 changes: 0 additions & 49 deletions assets/javascripts/src/options-page.coffee

This file was deleted.

2 changes: 2 additions & 0 deletions assets/javascripts/src/pages/background.coffee
@@ -0,0 +1,2 @@
new app.initializers.ListensForMessages().listen()

5 changes: 5 additions & 0 deletions assets/javascripts/src/pages/content.coffee
@@ -0,0 +1,5 @@
new app.initializers.TransformsContent().transform()




1 change: 1 addition & 0 deletions assets/javascripts/src/pages/options.coffee
@@ -0,0 +1 @@
new app.initializers.RendersConfiguration().render()
18 changes: 18 additions & 0 deletions assets/javascripts/src/views/configuration.coffee
@@ -0,0 +1,18 @@
class app.views.Configuration extends app.helpers.SuperView
template: "templates/configuration"
events:
"click .js-save": "save"
"click .js-reset": "reset"

initialize: ->
@bind('rendered', @renderDictionary)

renderDictionary: ->
@$('.fields').append(new app.views.Dictionary(model: @model.get('dictionary')).render().el)

save: (e) ->
e.preventDefault()
@model.save()

reset: ->
@model.destroy()
13 changes: 13 additions & 0 deletions assets/javascripts/src/views/dictionary-entry.coffee
@@ -0,0 +1,13 @@
class app.views.DictionaryEntry extends app.helpers.SuperView
template: "templates/dictionary-entry"
events:
"click .js-remove": "handleRemove"
"change :input": "handleChange"

handleRemove: ->
@model.collection.remove(@model)
@remove()

handleChange: (e) ->
$input = $(e.target)
@model.set($input.attr('name'), $input.val())
20 changes: 20 additions & 0 deletions assets/javascripts/src/views/dictionary.coffee
@@ -0,0 +1,20 @@
class app.views.Dictionary extends app.helpers.SuperView
template: "templates/dictionary"
events:
"click .js-add": "handleAdd"

initialize: ->
@bind('rendered', @renderItems)

handleAdd: (e) ->
e.preventDefault()
@model.get('entries').add({})
@renderItem(@model.get('entries').last())

renderItems: ->
@model.get('entries').each (item) =>
@renderItem(item)

renderItem: (item) ->
entryView = new app.views.DictionaryEntry(model: item)
@$el.append(entryView.render().el)
8 changes: 8 additions & 0 deletions assets/javascripts/templates/configuration.jst.eco
@@ -0,0 +1,8 @@
<form class="form-inline">
<div class="fields">
</div>
<div class="well">
<button class="js-save">Save</button>
<button class="js-reset">Delete</button>
</div>
</form>
4 changes: 4 additions & 0 deletions assets/javascripts/templates/dictionary-entry.jst.eco
@@ -0,0 +1,4 @@
<div>
<input type="text" class="input" placeholder="replace this word" name="original" value="<%= @model.original %>" />
<input type="text" class="input" placeholder="with this word" name="replacement" value="<%= @model.replacement %>" />
</div>
1 change: 1 addition & 0 deletions assets/javascripts/templates/dictionary.jst.eco
@@ -0,0 +1 @@
<button class="js-add">Add</button>

0 comments on commit 503f65a

Please sign in to comment.