danwrong-evil 0.1.1 → 0.1.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.
data/assets/evil.js CHANGED
@@ -15,6 +15,27 @@ jQuery(function($) {
15
15
  }
16
16
  });
17
17
 
18
+ var TemplateReorder = $.klass({
19
+ initialize: function() {
20
+ this.element.tableDnD({
21
+ onDrop: $.bind(this._onDrop, this),
22
+ onDragClass: 'dragging'
23
+ });
24
+ },
25
+ _onDrop: function() {
26
+ var data = $.tableDnD.serialize();
27
+
28
+ $.post('/admin/templates/reorder', data);
29
+
30
+ this._restripe();
31
+ },
32
+ _restripe: function() {
33
+ this.element.find('tbody tr:odd').addClass('alt');
34
+ this.element.find('tbody tr:even').removeClass('alt');
35
+ }
36
+ })
37
+
18
38
 
19
- $(window).attach(Sizer, 1000, 'wide')
39
+ $(window).attach(Sizer, 1000, 'wide');
40
+ $('#templates').attach(TemplateReorder);
20
41
  });
data/evil.gemspec CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{evil}
5
- s.version = "0.1.1"
5
+ s.version = "0.1.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Dan Webb"]
9
- s.date = %q{2009-04-17}
9
+ s.date = %q{2009-04-22}
10
10
  s.default_executable = %q{evil}
11
11
  s.description = %q{A simple framework for creating sites from 3rd party data and services}
12
12
  s.email = %q{dan@danwebb.net}
13
13
  s.executables = ["evil"]
14
- s.extra_rdoc_files = ["bin/evil", "CHANGELOG", "lib/evil/application.rb", "lib/evil/extensions.rb", "lib/evil/helpers.rb", "lib/evil/models/config_pair.rb", "lib/evil/models/template.rb", "lib/evil/models/whitelist.rb", "lib/evil/models.rb", "lib/evil/open_id.rb", "lib/evil/plugin/base.rb", "lib/evil/plugin/configuration.rb", "lib/evil/plugin/environment.rb", "lib/evil/plugin/filesystem.rb", "lib/evil/plugin/tag.rb", "lib/evil/plugin.rb", "lib/evil/setup/db_tool.rb", "lib/evil/setup/generator.rb", "lib/evil/setup/migration.rb", "lib/evil.rb", "LICENSE", "README.textile"]
15
- s.files = ["assets/config.ru", "assets/evil-lib.js", "assets/evil.css", "assets/evil.js", "assets/logo.png", "bin/evil", "CHANGELOG", "evil.gemspec", "lib/evil/application.rb", "lib/evil/extensions.rb", "lib/evil/helpers.rb", "lib/evil/models/config_pair.rb", "lib/evil/models/template.rb", "lib/evil/models/whitelist.rb", "lib/evil/models.rb", "lib/evil/open_id.rb", "lib/evil/plugin/base.rb", "lib/evil/plugin/configuration.rb", "lib/evil/plugin/environment.rb", "lib/evil/plugin/filesystem.rb", "lib/evil/plugin/tag.rb", "lib/evil/plugin.rb", "lib/evil/setup/db_tool.rb", "lib/evil/setup/generator.rb", "lib/evil/setup/migration.rb", "lib/evil.rb", "LICENSE", "Manifest", "Rakefile", "README.textile", "test/app/evil_test.rb", "test/dev_env.rb", "test/test_helper.rb", "test/units/plugin/base_test.rb", "test/units/plugin/tag_test.rb", "views/_banner.haml", "views/_errors.haml", "views/index.haml", "views/layout.haml", "views/login.haml", "views/plugins/_fields.haml", "views/plugins/edit.haml", "views/plugins/fields/_password.haml", "views/plugins/fields/_text.haml", "views/plugins/new.haml", "views/templates/_fields.haml", "views/templates/edit.haml", "views/templates/new.haml"]
14
+ s.extra_rdoc_files = ["bin/evil", "CHANGELOG", "lib/evil/application.rb", "lib/evil/extensions.rb", "lib/evil/helpers.rb", "lib/evil/models/config_pair.rb", "lib/evil/models/template.rb", "lib/evil/models/whitelist.rb", "lib/evil/models.rb", "lib/evil/open_id.rb", "lib/evil/plugin/base.rb", "lib/evil/plugin/block_tag.rb", "lib/evil/plugin/configuration.rb", "lib/evil/plugin/environment.rb", "lib/evil/plugin/filesystem.rb", "lib/evil/plugin/singleton_tag.rb", "lib/evil/plugin/tag.rb", "lib/evil/plugin.rb", "lib/evil/setup/db_tool.rb", "lib/evil/setup/generator.rb", "lib/evil/setup/migration.rb", "lib/evil.rb", "LICENSE", "README.textile"]
15
+ s.files = ["assets/config.ru", "assets/evil-lib.js", "assets/evil.css", "assets/evil.js", "assets/logo.png", "bin/evil", "CHANGELOG", "evil.gemspec", "lib/evil/application.rb", "lib/evil/extensions.rb", "lib/evil/helpers.rb", "lib/evil/models/config_pair.rb", "lib/evil/models/template.rb", "lib/evil/models/whitelist.rb", "lib/evil/models.rb", "lib/evil/open_id.rb", "lib/evil/plugin/base.rb", "lib/evil/plugin/block_tag.rb", "lib/evil/plugin/configuration.rb", "lib/evil/plugin/environment.rb", "lib/evil/plugin/filesystem.rb", "lib/evil/plugin/singleton_tag.rb", "lib/evil/plugin/tag.rb", "lib/evil/plugin.rb", "lib/evil/setup/db_tool.rb", "lib/evil/setup/generator.rb", "lib/evil/setup/migration.rb", "lib/evil.rb", "LICENSE", "Manifest", "Rakefile", "README.textile", "test/application/frontend_test.rb", "test/application/openid_test.rb", "test/application/plugin_config_test.rb", "test/application/template_test.rb", "test/dev_env.rb", "test/test_helper.rb", "test/units/models/template_test.rb", "test/units/models/whitelist_test.rb", "test/units/plugin/base_test.rb", "test/units/plugin/configuration_test.rb", "test/units/plugin/environment_test.rb", "test/units/plugin/filesystem_test.rb", "test/units/plugin/tag_test.rb", "views/_banner.haml", "views/_errors.haml", "views/index.haml", "views/layout.haml", "views/login.haml", "views/plugins/_fields.haml", "views/plugins/edit.haml", "views/plugins/fields/_password.haml", "views/plugins/fields/_text.haml", "views/plugins/new.haml", "views/templates/_fields.haml", "views/templates/edit.haml", "views/templates/new.haml"]
16
16
  s.has_rdoc = true
17
17
  s.homepage = %q{http://www.evilmashups.com}
18
18
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Evil", "--main", "README.textile"]
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.rubyforge_project = %q{evil}
21
21
  s.rubygems_version = %q{1.3.1}
22
22
  s.summary = %q{A simple framework for creating sites from 3rd party data and services}
23
- s.test_files = ["test/app/evil_test.rb", "test/test_helper.rb", "test/units/plugin/base_test.rb", "test/units/plugin/tag_test.rb"]
23
+ s.test_files = ["test/application/frontend_test.rb", "test/application/openid_test.rb", "test/application/plugin_config_test.rb", "test/application/template_test.rb", "test/test_helper.rb", "test/units/models/template_test.rb", "test/units/models/whitelist_test.rb", "test/units/plugin/base_test.rb", "test/units/plugin/configuration_test.rb", "test/units/plugin/environment_test.rb", "test/units/plugin/filesystem_test.rb", "test/units/plugin/tag_test.rb"]
24
24
 
25
25
  if s.respond_to? :specification_version then
26
26
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -10,7 +10,6 @@ module Evil
10
10
  end
11
11
 
12
12
  require_whitelisted_openid(/^\/admin/)
13
- load_template_routes
14
13
 
15
14
  get '/admin/openid/login' do
16
15
  attempt_openid_authentication do |identity_url|
@@ -47,6 +46,21 @@ module Evil
47
46
  haml :"templates/new"
48
47
  end
49
48
  end
49
+
50
+ post '/admin/templates/reorder' do
51
+ order = params[:templates].collect do |id|
52
+ if id =~ /(\d)+t/
53
+ $1.to_i
54
+ end
55
+ end.compact
56
+
57
+
58
+ order.each_with_index do |id, i|
59
+ Evil::Models::Template.find(id).update_attribute :position, i
60
+ end
61
+
62
+ order.join(',')
63
+ end
50
64
 
51
65
  get '/admin/templates/:id' do
52
66
  @template = Evil::Models::Template.find(params[:id]) rescue not_found
@@ -84,6 +98,8 @@ module Evil
84
98
 
85
99
  redirect '/admin'
86
100
  end
101
+
102
+ load_template_routes
87
103
  end
88
104
  end
89
105
 
data/lib/evil/helpers.rb CHANGED
@@ -50,7 +50,7 @@ module Evil
50
50
  protected
51
51
 
52
52
  def initialize_plugins
53
- Plugin::Environment.plugins.each { |p| p.init }
53
+ Plugin::Environment.plugins.each { |p| p.init } rescue nil
54
54
  end
55
55
 
56
56
  def partial_name(template_path)
@@ -6,7 +6,7 @@ module Evil
6
6
  set_table_name :evil_templates
7
7
 
8
8
  validates_presence_of :title, :source
9
- validates_uniqueness_of :route, :if => lambda { |template| !(template.route.empty? || template.route.nil?) }
9
+ validates_uniqueness_of :route, :if => lambda { |template| !(template.route.nil? || template.route.empty?) }
10
10
  validates_format_of :route, :with => /^((\/)|(((\/|\.):?[a-z0-9\_]+)+))$/,
11
11
  :allow_blank => true, :allow_nil => true
12
12
  validate :liquid_syntax
data/lib/evil/plugin.rb CHANGED
@@ -2,12 +2,16 @@ module Evil
2
2
  module Plugin
3
3
  autoload :Base, 'evil/plugin/base'
4
4
  autoload :Tag, 'evil/plugin/tag'
5
+ autoload :BlockTag, 'evil/plugin/block_tag'
6
+ autoload :SingletonTag, 'evil/plugin/singleton_tag'
5
7
  autoload :Environment, 'evil/plugin/environment'
6
8
  autoload :Filesystem, 'evil/plugin/filesystem'
7
9
  autoload :Configuration, 'evil/plugin/configuration'
8
10
 
9
11
  def self.evaluate(plugin_source)
10
12
  Environment.module_eval plugin_source
13
+ rescue
14
+ nil
11
15
  end
12
16
 
13
17
  def self.from_file(file)
@@ -22,8 +22,8 @@ module Evil
22
22
  @setup_proc = block
23
23
  end
24
24
 
25
- def tag(name, &block)
26
- tag = Tag.from(&block)
25
+ def tag(name, options={}, &block)
26
+ tag = options[:block] ? BlockTag.from(&block) : SingletonTag.from(&block)
27
27
  Liquid::Template.register_tag(name, tag)
28
28
  end
29
29
 
@@ -0,0 +1,48 @@
1
+ module Evil
2
+ module Plugin
3
+
4
+ class TagExecution
5
+
6
+ def initialize(tag, options, context, &block)
7
+ @options = Tag.evaluate(options, context)
8
+ @context = context
9
+ @tag = tag
10
+ @proc = block
11
+ end
12
+
13
+ def body(locals={})
14
+ @context.stack do
15
+ locals.each { |k, v| @context[k.to_s] = v }
16
+ return @tag.render_body(@context).to_s
17
+ end
18
+ end
19
+
20
+ def execute
21
+ self.instance_exec(@options, &@proc)
22
+ end
23
+
24
+ def to_s
25
+ execute.to_s
26
+ end
27
+ end
28
+
29
+ class BlockTag < Liquid::Block
30
+ include Tag
31
+
32
+ def initialize(tag_name, markup, tokens)
33
+ super
34
+
35
+ set_options(markup)
36
+ end
37
+
38
+ def render(context)
39
+ TagExecution.new(self, @options, context, &self.class.tag_proc).to_s
40
+ end
41
+
42
+ def render_body(context)
43
+ render_all(@nodelist, context)
44
+ end
45
+ end
46
+
47
+ end
48
+ end
@@ -49,8 +49,8 @@ module Evil
49
49
 
50
50
  def set(values)
51
51
  values.each do |k, v|
52
- c = ConfigPair.find_or_create_by_plugin_and_key(@plugin.name, k)
53
- c.update_attribute :value, v
52
+ c = ConfigPair.find_or_create_by_plugin_and_key(@plugin.name, k.to_s)
53
+ c.update_attribute :value, v.to_s
54
54
  end if values
55
55
 
56
56
  load_config!
@@ -61,12 +61,8 @@ module Evil
61
61
  def load_config!
62
62
  pairs = Evil::Models::ConfigPair.find_all_by_plugin(@plugin.name)
63
63
 
64
- if pairs
65
- @values = pairs.inject(Hash.new('')) do |m, pair|
66
- m[pair.key.to_sym] = pair.value; m
67
- end
68
- else
69
- @values = Hash.new('')
64
+ @values = pairs.inject(Hash.new('')) do |m, pair|
65
+ m[pair.key.to_sym] = pair.value; m
70
66
  end
71
67
  end
72
68
 
@@ -7,7 +7,7 @@ module Evil
7
7
  if template = Evil::Models::Template.find_by_title(title)
8
8
  template.source
9
9
  else
10
- raise FileSystemError, "No such template '#{title}'"
10
+ raise Liquid::FileSystemError, "No such template '#{title}'"
11
11
  end
12
12
  end
13
13
 
@@ -0,0 +1,18 @@
1
+ module Evil
2
+ module Plugin
3
+ class SingletonTag < Liquid::Tag
4
+ include Tag
5
+
6
+ def initialize(tag_name, markup, tokens)
7
+ super
8
+
9
+ set_options(markup)
10
+ end
11
+
12
+ def render(context)
13
+ self.class.tag_proc.call(Tag.evaluate(@options, context))
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -1,56 +1,32 @@
1
1
  module Evil
2
2
  module Plugin
3
-
4
- class TagExecution
5
-
6
- def initialize(tag, options, context, &block)
7
- @options = evaluate(options, context)
8
- @context = context
9
- @tag = tag
10
- @proc = block
11
- end
3
+ module Tag
4
+ Syntax = /((#{Liquid::TagAttributes}\s?,?\s?)*)/
12
5
 
13
- def body(locals={})
14
- @context.stack do
15
- locals.each { |k, v| @context[k.to_s] = v }
16
- return @tag.render_body(@context).to_s
6
+ def self.included(base)
7
+ base.instance_eval do
8
+ def from(&block)
9
+ tag = Class.new(self)
10
+
11
+ class << tag
12
+ attr_accessor :tag_proc
13
+ end
14
+
15
+ tag.tag_proc = block; tag
16
+ end
17
17
  end
18
18
  end
19
19
 
20
- def execute
21
- self.instance_exec(@options, &@proc)
22
- end
23
-
24
- def to_s
25
- execute.to_s
26
- end
27
-
28
- private
29
-
30
- def evaluate(options, context)
20
+ def self.evaluate(options, context)
31
21
  options.inject({}) do |evaluated, pair|
32
22
  opt, value = pair
33
23
  evaluated[opt] = context[value]; evaluated
34
24
  end
35
25
  end
36
- end
37
-
38
- class Tag < Liquid::Block
39
- Syntax = /((#{Liquid::TagAttributes}\s?,?\s?)*)/
40
26
 
41
- class << self
42
- attr_accessor :tag_proc
43
- attr_accessor :plugin
44
-
45
- def from(&block)
46
- tag = Class.new(self)
47
- tag.tag_proc = block; tag
48
- end
49
- end
50
-
51
- def initialize(tag_name, markup, tokens)
52
- super
53
-
27
+ protected
28
+
29
+ def set_options(markup)
54
30
  if markup =~ Syntax
55
31
  @options = parse_options($1)
56
32
  else
@@ -58,16 +34,6 @@ module Evil
58
34
  end
59
35
  end
60
36
 
61
- def render(context)
62
- TagExecution.new(self, @options, context, &self.class.tag_proc).to_s
63
- end
64
-
65
- def render_body(context)
66
- render_all(@nodelist, context)
67
- end
68
-
69
- private
70
-
71
37
  def parse_options(opt_string)
72
38
  pairs = opt_string.split(',')
73
39
  pairs.inject({}) do |opts, pair|
@@ -75,7 +41,7 @@ module Evil
75
41
  opts[opt.strip.to_sym] = value.strip; opts
76
42
  end
77
43
  end
44
+
78
45
  end
79
-
80
46
  end
81
47
  end
@@ -0,0 +1,52 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper')
2
+ require 'evil/application'
3
+
4
+ class FrontendTest < Test::Unit::TestCase
5
+ include Sinatra::Test
6
+
7
+ context 'running the evil application' do
8
+ setup do
9
+ @app = Evil::Application
10
+ end
11
+
12
+
13
+ context 'GET a template page' do
14
+ setup do
15
+ @template = Factory.create(:template)
16
+ @app.reload!
17
+ get @template.route
18
+ end
19
+
20
+ should 'be successful' do
21
+ assert_equal 200, response.status
22
+ end
23
+
24
+ should 'render with text/html as default content_type' do
25
+ assert_match /text\/html/, response.headers['Content-Type']
26
+ assert_match /utf-8/, response.headers['Content-Type']
27
+ end
28
+
29
+ should 'set a Cache-Control header from the template\'s ttl' do
30
+ assert_match /max-age=#{@template.ttl}/, response.headers['Cache-Control']
31
+ end
32
+ end
33
+
34
+ context 'GET a template page with another content type set' do
35
+ setup do
36
+ @template = Factory.create(:template, :content_type => 'application/xml')
37
+ @app.reload!
38
+ get @template.route
39
+ end
40
+
41
+ should 'be successful' do
42
+ assert_equal 200, response.status
43
+ end
44
+
45
+ should 'render with text/html as default content_type' do
46
+ assert_match /application\/xml/, response.headers['Content-Type']
47
+ assert_match /utf-8/, response.headers['Content-Type']
48
+ end
49
+ end
50
+ end
51
+
52
+ end
@@ -1,7 +1,7 @@
1
1
  require File.join(File.dirname(__FILE__), '../test_helper')
2
2
  require 'evil/application'
3
3
 
4
- class EvilTest < Test::Unit::TestCase
4
+ class OpenidTest < Test::Unit::TestCase
5
5
  include Sinatra::Test
6
6
 
7
7
  context 'running the evil application' do
@@ -21,12 +21,14 @@ class EvilTest < Test::Unit::TestCase
21
21
  assert_match /openid_url/, response.body
22
22
  end
23
23
  end
24
-
24
+
25
25
  end
26
+
26
27
 
27
28
  context 'while logged in' do
28
29
  setup do
29
- @env = { 'rack.session' => { :identity_url => 'www.danwebb.net' } }
30
+ Factory.create(:whitelist)
31
+ @env = { 'rack.session' => { :identity_url => 'www.example.com' } }
30
32
  end
31
33
 
32
34
  context 'GET /admin' do
@@ -38,26 +40,6 @@ class EvilTest < Test::Unit::TestCase
38
40
  assert response.ok?
39
41
  end
40
42
  end
41
-
42
- context 'GET /admin/templates/1 with existing template' do
43
- setup do
44
- get '/admin/templates/1', {}, @env
45
- end
46
-
47
- should 'be successful' do
48
- assert response.ok?
49
- end
50
- end
51
-
52
- context 'GET /admin/templates/nothinghere with non-existing template' do
53
- setup do
54
- get '/admin/templates/nothinghere', {}, @env
55
- end
56
-
57
- should 'be not found' do
58
- assert_equal 404, response.status
59
- end
60
- end
61
43
  end
62
44
  end
63
45