automatic 12.3.0 → 12.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/Gemfile +1 -0
  2. data/README.md +54 -36
  3. data/Rakefile +14 -0
  4. data/VERSION +1 -1
  5. data/automatic.gemspec +17 -5
  6. data/bin/automatic +37 -3
  7. data/bin/automatic-config +77 -0
  8. data/config/default.yml +9 -12
  9. data/doc/ChangeLog +32 -8
  10. data/doc/PLUGINS +205 -0
  11. data/doc/PLUGINS.ja +2 -3
  12. data/doc/README +488 -0
  13. data/doc/README.ja +195 -131
  14. data/lib/automatic/feed_parser.rb +1 -9
  15. data/lib/automatic/log.rb +1 -9
  16. data/lib/automatic/opml.rb +239 -0
  17. data/lib/automatic/pipeline.rb +16 -10
  18. data/lib/automatic/recipe.rb +3 -4
  19. data/lib/automatic.rb +32 -38
  20. data/lib/config/validator.rb +83 -0
  21. data/plugins/custom_feed/svn_log.rb +1 -1
  22. data/plugins/filter/ignore.rb +9 -1
  23. data/plugins/notify/ikachan.rb +7 -6
  24. data/plugins/publish/hatena_bookmark.rb +6 -9
  25. data/script/build +63 -0
  26. data/spec/lib/automatic/pipeline_spec.rb +55 -0
  27. data/spec/lib/automatic_spec.rb +77 -0
  28. data/spec/lib/pipeline_spec.rb +67 -0
  29. data/spec/plugins/filter/ignore_spec.rb +16 -0
  30. data/spec/plugins/filter/image_spec.rb +4 -4
  31. data/spec/plugins/filter/tumblr_resize_spec.rb +4 -4
  32. data/spec/plugins/notify/ikachan_spec.rb +30 -0
  33. data/spec/plugins/publish/console_spec.rb +1 -2
  34. data/spec/plugins/publish/hatena_bookmark_spec.rb +36 -1
  35. data/spec/plugins/store/full_text_spec.rb +0 -2
  36. data/spec/plugins/store/permalink_spec.rb +0 -1
  37. data/spec/plugins/store/target_link_spec.rb +0 -1
  38. data/spec/plugins/subscription/feed_spec.rb +0 -1
  39. data/spec/spec_helper.rb +6 -4
  40. data/spec/user_dir/plugins/store/mock.rb +12 -0
  41. data/test/fixtures/sampleOPML.xml +11 -0
  42. data/test/integration/test_activerecord.yml +2 -2
  43. data/test/integration/test_fulltext.yml +3 -3
  44. data/test/integration/test_hatenabookmark.yml +6 -2
  45. data/test/integration/test_ignore.yml +4 -1
  46. data/test/integration/test_ignore2.yml +1 -4
  47. data/test/integration/test_image2local.yml +3 -5
  48. data/test/integration/test_svnlog.yml +2 -1
  49. data/test/integration/test_tumblr2local.yml +3 -3
  50. metadata +43 -22
  51. data/utils/auto_discovery.rb +0 -18
  52. data/utils/opml_parser.rb +0 -247
@@ -3,7 +3,7 @@
3
3
  # Name:: Automatic::Pipeline
4
4
  # Author:: 774 <http://id774.net>
5
5
  # Created:: Feb 22, 2012
6
- # Updated:: Mar 3, 2012
6
+ # Updated:: Mar 10, 2012
7
7
  # Copyright:: 774 Copyright (c) 2012
8
8
  # License:: Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.0.
9
9
 
@@ -11,23 +11,29 @@ require 'active_support/core_ext'
11
11
 
12
12
  module Automatic
13
13
  module Plugin end
14
+ class NoPluginError < StandardError; end
15
+ class NoRecipeError < StandardError; end
14
16
 
15
17
  module Pipeline
16
18
  def self.load_plugin(module_name)
17
- Dir.foreach(Automatic.plugins_dir) do |subdir|
18
- if /^#{subdir}_(.*)$/ =~ module_name.underscore
19
- path = Automatic.plugins_dir + subdir + "/#{$1}.rb"
20
- Automatic::Plugin.autoload module_name.to_sym, path.to_s
19
+ Dir[Automatic.user_plugins_dir + "/*",
20
+ Automatic.plugins_dir + "/*"].each{ |dir|
21
+ subdir = File.basename dir
22
+ if /#{subdir}_(.*)$/ =~ module_name.underscore
23
+ path = dir + "/#{$1}.rb"
24
+ return Automatic::Plugin.autoload module_name.to_sym, path.to_s if File.exists? path
21
25
  end
22
- end
26
+ }
27
+ raise NoPluginError, "unknown plugin named #{module_name}"
23
28
  end
24
-
29
+
25
30
  def self.run(recipe)
26
- raise "NoRecipeError" if recipe.nil?
31
+ raise NoRecipeError if recipe.nil?
27
32
  pipeline = []
28
33
  recipe.each_plugin { |plugin|
29
- load_plugin(plugin.module)
30
- klass = Automatic::Plugin.const_get(plugin.module)
34
+ mod = plugin.module
35
+ load_plugin(mod)
36
+ klass = Automatic::Plugin.const_get(mod)
31
37
  pipeline = klass.new(plugin.config, pipeline).run
32
38
  }
33
39
  end
@@ -1,8 +1,8 @@
1
1
  # Name:: Automatic::Recipe
2
- # Author:: 774 <http://id774.net>
2
+ # Author:: ainame
3
3
  # Version:: 12.02-devel
4
4
  # Created:: Feb 18, 2012
5
- # Updated:: Feb 24, 2012
5
+ # Updated:: Mar 12, 2012
6
6
  # Copyright:: 774 Copyright (c) 2012
7
7
  # License:: Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.0.
8
8
 
@@ -13,8 +13,7 @@ module Automatic
13
13
  class Recipe
14
14
  attr_reader :procedure
15
15
 
16
- def initialize(path)
17
- path = Automatic.config_dir + 'default.yml' if path.to_s.empty?
16
+ def initialize(path = "")
18
17
  load_recipe(path)
19
18
  end
20
19
 
data/lib/automatic.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
  # Name:: Automatic::Ruby
3
3
  # Author:: 774 <http://id774.net>
4
- # Version:: 12.03
4
+ # Version:: 12.3.1
5
5
  # Created:: Feb 18, 2012
6
- # Updated:: Mar 7, 2012
6
+ # Updated:: Mar 15, 2012
7
7
  # Copyright:: 774 Copyright (c) 2012
8
8
  # License:: Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.0.
9
9
 
@@ -14,47 +14,41 @@ module Automatic
14
14
  require 'automatic/log'
15
15
  require 'automatic/feed_parser'
16
16
 
17
- VERSION = "12.03"
17
+ VERSION = "12.3.1"
18
+ USER_DIR = "/.automatic"
18
19
 
19
- def self.root_dir
20
- @root_dir
21
- end
20
+ class << self
21
+ attr_accessor :root_dir
22
22
 
23
- def self.plugins_dir
24
- @root_dir + "/plugins/"
25
- end
23
+ def run(args = { })
24
+ self.root_dir = args[:root_dir]
25
+ self.user_dir = args[:user_dir]
26
+ Automatic::Pipeline.run(args[:recipe])
27
+ end
28
+
29
+ def plugins_dir
30
+ File.join(@root_dir, "plugins")
31
+ end
26
32
 
27
- def self.config_dir
28
- @root_dir + "/config/"
29
- end
33
+ def config_dir
34
+ File.join(@root_dir, "config")
35
+ end
36
+
37
+ def user_dir
38
+ @user_dir
39
+ end
30
40
 
31
- def self.run(root_dir)
32
- @root_dir = root_dir
33
- recipe_path = ""
34
- require 'optparse'
35
- parser = OptionParser.new { |parser|
36
- parser.banner = "Usage: automatic [options] arg"
37
- parser.version = VERSION
38
- parser.separator "options:"
39
- parser.on('-c', '--config FILE', String,
40
- "recipe YAML file"){|c| recipe_path = c}
41
- parser.on('-h', '--help', "show this message") {
42
- puts parser
43
- exit
44
- }
45
- }
46
-
47
- begin
48
- parser.parse!
49
- print "Loading #{recipe_path}\n" unless recipe_path == ""
50
- rescue OptionParser::ParseError => err
51
- $stderr.puts err.message
52
- $stderr.puts parser.help
53
- exit 1
41
+ def user_dir=(_user_dir)
42
+ if ENV["AUTOMATIC_RUBY_ENV"] == "test" && !(_user_dir.nil?)
43
+ @user_dir = _user_dir
44
+ else
45
+ @user_dir = File.expand_path("~/") + USER_DIR
46
+ end
54
47
  end
55
48
 
56
- # recipe treat as an object.
57
- recipe = Automatic::Recipe.new(recipe_path)
58
- Automatic::Pipeline.run(recipe)
49
+ def user_plugins_dir
50
+ File.join(@user_dir, "plugins")
51
+ end
59
52
  end
53
+
60
54
  end
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ # Name:: Automatic::Config::Validator
4
+ # Author:: aerith <http://aerith.sc/>
5
+ # Created:: Feb 23, 2012
6
+ # Updated:: Feb 23, 2012
7
+ # Copyright:: Copyright (c) 2012
8
+ # License:: Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.0.
9
+
10
+ class Automatic
11
+ module Config
12
+ class Validator
13
+ attr_accessor :config, :result
14
+
15
+ class InvalidException < Exception; end;
16
+
17
+ def initialize(config = nil)
18
+ @config = config || {}
19
+ @result = ValidateResult.new
20
+ end
21
+
22
+ def validate(klass, config = nil)
23
+ return true if config.nil?
24
+ return true if not config.is_a?(Hash)
25
+ return true if not klass.respond_to?(:rules)
26
+
27
+ rules = klass.rules
28
+ return true if not rules.is_a?(Hash)
29
+
30
+ process(rules, config).result.valid?
31
+ end
32
+
33
+ private
34
+ def process(rules, config)
35
+ errors = {}
36
+
37
+ rules.each do |key, rule|
38
+ name = key.to_sym
39
+
40
+ rule.each do |method, args|
41
+ unless ValidateRule.send(method, *[config, name, args])
42
+ errors[name] = {} if errors[name].nil? or errors.size < 1
43
+ errors[name][method] = true
44
+ if @config["stop_on_invalid"] and errors[name][method]
45
+ raise InvalidException
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ @result.errors = errors
52
+
53
+ self
54
+ end
55
+
56
+ class ValidateResult
57
+ attr_accessor :errors
58
+
59
+ def error(name)
60
+ errors.exists?(name)
61
+ end
62
+
63
+ def valid?
64
+ errors.empty?
65
+ end
66
+ end
67
+
68
+ module ValidateRule
69
+ def self.required(config, name, *args)
70
+ return true unless args.size < 1 or args.first
71
+ return true if not config[name.to_s].nil? and not config[name.to_s].empty?
72
+ false
73
+ end
74
+
75
+ def self.default(config, name, *args)
76
+ config[name.to_s] ||= args.first
77
+ true
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+
@@ -39,7 +39,7 @@ module Automatic::Plugin
39
39
  def base_url
40
40
  return @config['target'].gsub(/\/$/, "")
41
41
  end
42
-
42
+
43
43
  def svn_log_argument
44
44
  return [
45
45
  base_url,
@@ -3,7 +3,7 @@
3
3
  # Name:: Automatic::Plugin::Filter::Ignore
4
4
  # Author:: 774 <http://id774.net>
5
5
  # Created:: Feb 22, 2012
6
- # Updated:: Mar 4, 2012
6
+ # Updated:: Mar 8, 2012
7
7
  # Copyright:: 774 Copyright (c) 2012
8
8
  # License:: Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.0.
9
9
 
@@ -32,6 +32,14 @@ module Automatic::Plugin
32
32
  end
33
33
  }
34
34
  end
35
+ unless @config['exclude'].nil?
36
+ @config['exclude'].each {|e|
37
+ if items.link.include?(e.chomp)
38
+ detection = true
39
+ Automatic::Log.puts("info", "Excluded by link: #{items.link}")
40
+ end
41
+ }
42
+ end
35
43
  unless @config['description'].nil?
36
44
  @config['description'].each {|e|
37
45
  if items.description.include?(e.chomp)
@@ -31,20 +31,21 @@ module Automatic::Plugin
31
31
  proxy_class = Net::HTTP::Proxy(ENV["PROXY"], 8080)
32
32
  http = proxy_class.new(uri.host, uri.port)
33
33
  http.start do |http|
34
- @params['channels'].each do|channel|
35
- http.post("/join", "channel=#{channel}") # send join command to make sure when if ikachan is not in the channel
34
+ @params['channels'].split(",").each do|channel|
35
+ # send join command to make sure when if ikachan is not in the channel
36
+ http.post("/join", "channel=#{channel}")
36
37
  res = http.post(uri.path, %Q(channel=#{channel}&message=#{message}))
37
- t = Time.now.strftime("%Y/%m/%d %X")
38
- if res.code == "200" then
39
- puts "#{t} [info] Success: #{message}"
38
+ if res.code == "200"
39
+ Automatic::Log.puts(:info, "Success: #{message}")
40
40
  else
41
- puts "#{t} [error] #{res.code} Error: #{message}"
41
+ Automatic::Log.puts(:error, "#{res.code} Error: #{message}")
42
42
  end
43
43
  end
44
44
  end
45
45
  end
46
46
 
47
47
  private
48
+
48
49
  def build_message(link, title)
49
50
  message = ""
50
51
  message += "#{title.to_s} - " unless title.blank?
@@ -3,7 +3,7 @@
3
3
  # Name:: Automatic::Plugin::Publish::HatenaBookmark
4
4
  # Author:: 774 <http://id774.net>
5
5
  # Created:: Feb 22, 2012
6
- # Updated:: Feb 24, 2012
6
+ # Updated:: Mar 12, 2012
7
7
  # Copyright:: 774 Copyright (c) 2012
8
8
  # License:: Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.0.
9
9
 
@@ -55,19 +55,16 @@ module Automatic::Plugin
55
55
  uri = URI.parse(url)
56
56
  proxy_class = Net::HTTP::Proxy(ENV["PROXY"], 8080)
57
57
  http = proxy_class.new(uri.host)
58
- http.start {|http|
58
+ http.start { |http|
59
59
  # b_url = NKF.nkf('-w', b_url)
60
60
  # b_comment = NKF.nkf('-w', b_comment)
61
61
  res = http.post(uri.path, toXml(b_url, b_comment), header)
62
- t = Time.now.strftime("%Y/%m/%d %X")
63
62
  if res.code == "201" then
64
- unless b_comment.nil?
65
- print "#{t} [info] Success: #{b_url} Comment: #{b_comment}\n"
66
- else
67
- print "#{t} [info] Success: #{b_url}\n"
68
- end
63
+ message = "Success: #{b_url}"
64
+ message += " Comment: #{b_comment}" unless b_comment.nil?
65
+ Automatic::Log.puts(:info, message)
69
66
  else
70
- print "#{t} [error] #{res.code} Error: #{b_url}\n"
67
+ Automatic::Log.puts(:error, "#{res.code} Error: #{b_url}")
71
68
  end
72
69
  }
73
70
  end
data/script/build ADDED
@@ -0,0 +1,63 @@
1
+ #!/bin/sh
2
+ #
3
+ ########################################################################
4
+ # Integration Build Script
5
+ #
6
+ # Maintainer: id774 <idnanashi@gmail.com>
7
+ #
8
+ # v1.0 3/16,2012
9
+ # First.
10
+ ########################################################################
11
+
12
+ kickstart() {
13
+ export RACK_ROOT="."
14
+ export RACK_ENV="test"
15
+ export DATABASE_URL="$RACK_ROOT/db"
16
+ ruby -v
17
+ test_config log info started.
18
+ }
19
+
20
+ exec_rspec() {
21
+ $RACK_ROOT/bin/automatic -v
22
+ $RACK_ROOT/script/bootstrap
23
+ bundle exec $RACK_ROOT/bin/rake simplecov
24
+ }
25
+
26
+ run_test() {
27
+ while [ $# -gt 0 ]
28
+ do
29
+ $RACK_ROOT/bin/automatic -c $1
30
+ test_config log info $?
31
+ shift
32
+ done
33
+ }
34
+
35
+ load_tests() {
36
+ for YAML_FILE in "$RACK_ROOT/test/integration/*.yml"
37
+ do
38
+ run_test $YAML_FILE
39
+ done
40
+ unset YAML_FILE
41
+ }
42
+
43
+ test_config() {
44
+ $RACK_ROOT/bin/automatic-config $*
45
+ }
46
+
47
+ added_tests() {
48
+ test_config scaffold
49
+ test_config autodiscovery http://id774.net/blog/
50
+ test_config opmlparser "$RACK_ROOT/test/fixtures/sampleOPML.xml"
51
+ test_config feedparser http://id774.net/blog/feed/ > /dev/null
52
+ test_config log info finished.
53
+ }
54
+
55
+ main() {
56
+ kickstart
57
+ exec_rspec
58
+ load_tests
59
+ added_tests
60
+ }
61
+
62
+ set -ex
63
+ main
@@ -0,0 +1,55 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Name:: pipeline_sepc.rb
3
+ # Author:: ainame
4
+ # Created:: Mar 10, 2012
5
+ # Updated:: Mar 10, 2012
6
+ # Copyright:: ainame Copyright (c) 2012
7
+ # License:: Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.0.
8
+
9
+ require File.expand_path(File.join(File.dirname(__FILE__) ,'../../spec_helper'))
10
+ require 'automatic'
11
+ require 'automatic/pipeline'
12
+
13
+ TEST_MODULES = ["SubscriptionFeed", "FilterIgnore"]
14
+
15
+ describe Automatic::Pipeline do
16
+ describe "in default dir" do
17
+ before do
18
+ Automatic.root_dir = APP_ROOT
19
+ Automatic.user_dir = nil
20
+ end
21
+
22
+ describe "#load_plugin" do
23
+ it "raise no plugin error" do
24
+ lambda{
25
+ Automatic::Plugin.load_plugin "FooBar"
26
+ }.should raise_exception
27
+ end
28
+
29
+ it "correctly load module" do
30
+ TEST_MODULES.each do |mod|
31
+ Automatic::Pipeline.load_plugin mod.to_s
32
+ Automatic::Plugin.const_get(mod).class.should == Class
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "in user dir" do
39
+ before do
40
+ Automatic.root_dir = APP_ROOT
41
+ Automatic.user_dir = File.join(APP_ROOT, "spec/user_dir")
42
+ end
43
+
44
+ describe "#load_plugin" do
45
+ it "correctly load module" do
46
+ # StoreMock is the mock class that it return pipeline.
47
+ mock = "StoreMock"
48
+ Automatic::Pipeline.load_plugin mock
49
+ klass = Automatic::Plugin.const_get(mock)
50
+ klass.class.should == Class
51
+ klass.new(nil, ["mock"]).run.should == "mock"
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,77 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Name:: Automatic
3
+ # Author:: kzgs
4
+ # Created:: Mar 9, 2012
5
+ # Updated:: Mar 10, 2012
6
+ # Copyright:: kzgs Copyright (c) 2012
7
+ # License:: Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.0.
8
+
9
+ require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
10
+ require 'automatic'
11
+
12
+ describe Automatic do
13
+ describe "#run" do
14
+ describe "with a root dir which has default recipe" do
15
+ specify {
16
+ lambda{
17
+ Automatic.run(:recipe => "",
18
+ :root_dir => APP_ROOT,
19
+ :user_dir => APP_ROOT + "/spec/user_dir")
20
+ }.should_not raise_exception(Errno::ENOENT)
21
+ }
22
+ end
23
+ end
24
+
25
+ describe "#(root|config)_dir" do
26
+ specify {
27
+ Automatic.root_dir.should == APP_ROOT
28
+ Automatic.config_dir.should == APP_ROOT+"/config"
29
+ }
30
+ end
31
+
32
+ describe "#user_dir= in test env" do
33
+ before(:all) do
34
+ Automatic.user_dir = File.join(APP_ROOT, "spec/user_dir")
35
+ end
36
+
37
+ describe "#user_dir" do
38
+ it "return valid value" do
39
+ Automatic.user_dir.should == File.join(APP_ROOT, "spec/user_dir")
40
+ end
41
+ end
42
+
43
+ describe "#user_plugins_dir" do
44
+ it "return valid value" do
45
+ Automatic.user_plugins_dir.should == File.join(APP_ROOT, "spec/user_dir/plugins")
46
+ end
47
+ end
48
+
49
+ after(:all) do
50
+ Automatic.user_dir = nil
51
+ end
52
+ end
53
+
54
+ describe "#set_user_dir in other env" do
55
+ before(:all) do
56
+ ENV["AUTOMATIC_RUBY_ENV"] = "other"
57
+ Automatic.user_dir = nil
58
+ end
59
+
60
+ describe "#user_dir" do
61
+ it "return valid value" do
62
+ Automatic.user_dir.should == File.expand_path("~/") + "/.automatic"
63
+ end
64
+ end
65
+
66
+ describe "#user_plugins_dir" do
67
+ it "return valid value" do
68
+ Automatic.user_plugins_dir.should == File.expand_path("~/") + "/.automatic/plugins"
69
+ end
70
+ end
71
+
72
+ after(:all) do
73
+ ENV["AUTOMATIC_RUBY_ENV"] = "test"
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,67 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Name:: pipeline_sepc.rb
3
+ # Author:: ainame
4
+ # Created:: Mar 10, 2012
5
+ # Updated:: Mar 10, 2012
6
+ # Copyright:: ainame Copyright (c) 2012
7
+ # License:: Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.0.
8
+
9
+ require File.expand_path(File.join(File.dirname(__FILE__) ,'../spec_helper'))
10
+ require 'automatic'
11
+ require 'automatic/pipeline'
12
+
13
+ TEST_MODULES = ["SubscriptionFeed", "FilterIgnore"] if TEST_MODULES.nil?
14
+
15
+ describe Automatic::Pipeline do
16
+ describe "in default dir" do
17
+ before do
18
+ Automatic.root_dir = File.expand_path(File.join(File.dirname(__FILE__), "../../"))
19
+ Automatic.user_dir = nil
20
+ end
21
+
22
+ describe "#load_plugin" do
23
+ it "raise no plugin error" do
24
+ lambda{
25
+ Automatic::Pipeline.load_plugin "FooBar"
26
+ }.should raise_exception(Automatic::NoPluginError,
27
+ /unknown plugin named FooBar/)
28
+ end
29
+
30
+ it "correctly load module" do
31
+ TEST_MODULES.each do |mod|
32
+ Automatic::Pipeline.load_plugin mod.to_s
33
+ Automatic::Plugin.const_get(mod).class.should == Class
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "#run" do
39
+ it "run a recipe with FilterIgnore module" do
40
+ plugin = mock("plugin")
41
+ plugin.should_receive(:module).and_return("FilterIgnore")
42
+ plugin.should_receive(:config)
43
+ recipe = mock("recipe")
44
+ recipe.should_receive(:each_plugin).and_yield(plugin)
45
+ Automatic::Pipeline.run(recipe).should == []
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "in user dir" do
51
+ before do
52
+ Automatic.root_dir = File.expand_path(File.join(File.dirname(__FILE__), "../../"))
53
+ Automatic.user_dir = File.expand_path(File.join(File.dirname(__FILE__), "../user_dir/"))
54
+ end
55
+
56
+ describe "#load_plugin" do
57
+ it "correctly load module" do
58
+ # StoreMock is the mock class that it return pipeline.
59
+ mock = "StoreMock"
60
+ Automatic::Pipeline.load_plugin mock
61
+ klass = Automatic::Plugin.const_get(mock)
62
+ klass.class.should == Class
63
+ klass.new(nil, ["mock"]).run.should == "mock"
64
+ end
65
+ end
66
+ end
67
+ end
@@ -3,6 +3,22 @@ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
3
3
  require 'filter/ignore'
4
4
 
5
5
  describe Automatic::Plugin::FilterIgnore do
6
+ context "with exclusion by description" do
7
+ subject {
8
+ Automatic::Plugin::FilterIgnore.new({
9
+ 'exclude' => ["comment"],
10
+ },
11
+ AutomaticSpec.generate_pipeline {
12
+ feed { item "http://github.com" }
13
+ feed { item "http://google.com" }
14
+ })
15
+ }
16
+
17
+ describe "#run" do
18
+ its(:run) { should have(2).feeds }
19
+ end
20
+ end
21
+
6
22
  context "with exclusion by description" do
7
23
  subject {
8
24
  Automatic::Plugin::FilterIgnore.new({
@@ -10,7 +10,7 @@ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
10
10
 
11
11
  require 'filter/image'
12
12
 
13
- describe Automatic::Plugin::FilterImage do
13
+ describe Automatic::Plugin::FilterImage do
14
14
  context "with description with image tag" do
15
15
  subject {
16
16
  Automatic::Plugin::FilterImage.new({},
@@ -29,10 +29,10 @@ describe Automatic::Plugin::FilterImage do
29
29
  should == "http://27.media.tumblr.com/tumblr_lzrubkfPlt1qb8vzto1_500.png"
30
30
  }
31
31
  end
32
- end
32
+ end
33
33
  end
34
34
 
35
- describe Automatic::Plugin::FilterImage do
35
+ describe Automatic::Plugin::FilterImage do
36
36
  context "with description with image tag" do
37
37
  subject {
38
38
  Automatic::Plugin::FilterImage.new({},
@@ -51,5 +51,5 @@ describe Automatic::Plugin::FilterImage do
51
51
  should == "http://24.media.tumblr.com/tumblr_m07wttnIdy1qzoj1jo1_400.jpg"
52
52
  }
53
53
  end
54
- end
54
+ end
55
55
  end