yapra 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. data/History.txt +4 -0
  2. data/LICENCE +22 -0
  3. data/License.txt +22 -0
  4. data/Manifest.txt +103 -0
  5. data/PostInstall.txt +7 -0
  6. data/README.txt +66 -0
  7. data/Rakefile +13 -0
  8. data/bin/yapra +52 -0
  9. data/config/hoe.rb +75 -0
  10. data/config/requirements.rb +15 -0
  11. data/legacy_plugins/Download/nicovideo.rb +45 -0
  12. data/legacy_plugins/Feed/custom_feed.rb +87 -0
  13. data/legacy_plugins/Feed/google_calendar.rb +51 -0
  14. data/legacy_plugins/Feed/google_search_history.rb +45 -0
  15. data/legacy_plugins/Feed/hatena_graph.rb +37 -0
  16. data/legacy_plugins/Feed/lirs.rb +36 -0
  17. data/legacy_plugins/Filter/Translations/yahoo.rb +40 -0
  18. data/legacy_plugins/Filter/apply_text_html.rb +26 -0
  19. data/legacy_plugins/Filter/average.rb +6 -0
  20. data/legacy_plugins/Filter/deduped.rb +51 -0
  21. data/legacy_plugins/Filter/find_num.rb +8 -0
  22. data/legacy_plugins/Filter/find_regex.rb +9 -0
  23. data/legacy_plugins/Filter/fresh.rb +9 -0
  24. data/legacy_plugins/Filter/get_html.rb +11 -0
  25. data/legacy_plugins/Filter/grep.rb +16 -0
  26. data/legacy_plugins/Filter/invert.rb +14 -0
  27. data/legacy_plugins/Filter/sort.rb +10 -0
  28. data/legacy_plugins/Filter/subs.rb +6 -0
  29. data/legacy_plugins/Filter/to_integer.rb +4 -0
  30. data/legacy_plugins/Publish/delicious.rb +91 -0
  31. data/legacy_plugins/Publish/google_calendar.rb +58 -0
  32. data/legacy_plugins/Publish/hatena_bookmark.rb +47 -0
  33. data/legacy_plugins/Publish/hatena_diary_writer.rb +53 -0
  34. data/legacy_plugins/Publish/hatena_graph.rb +39 -0
  35. data/legacy_plugins/Publish/lingr.rb +110 -0
  36. data/legacy_plugins/Publish/mixi_diary_writer.rb +104 -0
  37. data/legacy_plugins/Publish/scuttle.rb +92 -0
  38. data/legacy_plugins/Publish/twitter.rb +35 -0
  39. data/legacy_plugins/RSS/load.rb +38 -0
  40. data/legacy_plugins/RSS/save.rb +41 -0
  41. data/legacy_plugins/Yaml/load.rb +5 -0
  42. data/legacy_plugins/Yaml/save.rb +9 -0
  43. data/legacy_plugins/argv.rb +5 -0
  44. data/legacy_plugins/concat.rb +18 -0
  45. data/legacy_plugins/const_list.rb +15 -0
  46. data/legacy_plugins/first.rb +11 -0
  47. data/legacy_plugins/head.rb +14 -0
  48. data/legacy_plugins/load_path.rb +21 -0
  49. data/legacy_plugins/plagger.rb +94 -0
  50. data/legacy_plugins/plugin_from_uri.rb +31 -0
  51. data/legacy_plugins/pluginbase.rb +4 -0
  52. data/legacy_plugins/print.rb +15 -0
  53. data/legacy_plugins/reverse.rb +10 -0
  54. data/legacy_plugins/send_msg.rb +18 -0
  55. data/legacy_plugins/stdin.rb +6 -0
  56. data/legacy_plugins/stdout.rb +6 -0
  57. data/lib/yapra/config.rb +103 -0
  58. data/lib/yapra/inflector.rb +55 -0
  59. data/lib/yapra/legacy_plugin/advance_mode_registry.rb +38 -0
  60. data/lib/yapra/legacy_plugin/base.rb +26 -0
  61. data/lib/yapra/legacy_plugin/compatible_mode_registry.rb +34 -0
  62. data/lib/yapra/legacy_plugin/registry_factory.rb +21 -0
  63. data/lib/yapra/legacy_plugin.rb +5 -0
  64. data/lib/yapra/pipeline.rb +74 -0
  65. data/lib/yapra/plugin/base.rb +14 -0
  66. data/lib/yapra/plugin/context_aware.rb +14 -0
  67. data/lib/yapra/plugin/erb_applier.rb +15 -0
  68. data/lib/yapra/plugin/feed_item_operator.rb +21 -0
  69. data/lib/yapra/plugin/mechanize_base.rb +26 -0
  70. data/lib/yapra/plugin.rb +5 -0
  71. data/lib/yapra/runtime.rb +36 -0
  72. data/lib/yapra/version.rb +9 -0
  73. data/lib/yapra.rb +44 -0
  74. data/lib-plugins/yapra/plugin/config/agent.rb +34 -0
  75. data/lib-plugins/yapra/plugin/config/basic_auth.rb +19 -0
  76. data/lib-plugins/yapra/plugin/config/web_post.rb +21 -0
  77. data/lib-plugins/yapra/plugin/feed/custom.rb +41 -0
  78. data/lib-plugins/yapra/plugin/feed/load.rb +29 -0
  79. data/lib-plugins/yapra/plugin/filter/entry_full_text.rb +59 -0
  80. data/lib-plugins/yapra/plugin/publish/file_download.rb +109 -0
  81. data/lib-plugins/yapra/plugin/publish/gmail.rb +27 -0
  82. data/lib-plugins/yapra/plugin/publish/imap.rb +82 -0
  83. data/lib-plugins/yapra/plugin/test/append_entry.rb +25 -0
  84. data/plugins/Filter/deduped.rb +57 -0
  85. data/plugins/Filter/sort.rb +28 -0
  86. data/plugins/Filter/subs.rb +16 -0
  87. data/script/console +10 -0
  88. data/script/destroy +14 -0
  89. data/script/generate +14 -0
  90. data/script/txt2html +82 -0
  91. data/setup.rb +1585 -0
  92. data/spec/spec.opts +1 -0
  93. data/spec/spec_helper.rb +11 -0
  94. data/spec/yapra_spec.rb +11 -0
  95. data/tasks/deployment.rake +34 -0
  96. data/tasks/environment.rake +7 -0
  97. data/tasks/rspec.rake +21 -0
  98. data/tasks/website.rake +17 -0
  99. data/website/index.html +115 -0
  100. data/website/index.txt +57 -0
  101. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  102. data/website/stylesheets/screen.css +138 -0
  103. data/website/template.html.erb +48 -0
  104. metadata +170 -0
@@ -0,0 +1,103 @@
1
+ # = Config Examples
2
+ #
3
+ # == Format 1: Pragger like.
4
+ # A simplest. You can run one pipeline without global config.
5
+ #
6
+ # - module: Module:name
7
+ # config:
8
+ # a: 3
9
+ # - module: Module:name2
10
+ # config:
11
+ # a: b
12
+ # - module: Module:name3
13
+ # config:
14
+ # a: 88
15
+ #
16
+ # == Format 2: Python habu like.
17
+ # You can run a lot of pipelines with global config.
18
+ #
19
+ # global:
20
+ # log:
21
+ # out: stderr
22
+ # level: warn
23
+ #
24
+ # pipeline:
25
+ # pipeline1:
26
+ # - module: Module:name
27
+ # config:
28
+ # a: 3
29
+ # - module: Module:name2
30
+ # config:
31
+ # a: b
32
+ #
33
+ # pipeline2:
34
+ # - module: Module:name
35
+ # config:
36
+ # a: 3
37
+ # - module: Module:name2
38
+ # config:
39
+ # a: b
40
+ #
41
+ # == Format 3: Mixed type.
42
+ # You can run sigle pipeline with global config.
43
+ #
44
+ # global:
45
+ # log:
46
+ # out: stderr
47
+ # level: warn
48
+ #
49
+ # pipeline:
50
+ # - module: Module:name
51
+ # config:
52
+ # a: 3
53
+ # - module: Module:name2
54
+ # config:
55
+ # a: b
56
+ #
57
+ require 'logger'
58
+ require 'yapra'
59
+
60
+ class Yapra::Config
61
+ attr_reader :env
62
+ attr_reader :pipeline_commands
63
+
64
+ def initialize config={}
65
+ if config.kind_of?(Hash)
66
+ @env = config['global'] || {}
67
+ if config['pipeline']
68
+ if config['pipeline'].kind_of?(Hash)
69
+ @pipeline_commands = config['pipeline']
70
+ elsif config['pipeline'].kind_of?(Array)
71
+ @pipeline_commands = { 'default' => config['pipeline'] }
72
+ end
73
+ end
74
+ raise 'config["global"]["pipeline"] is invalid!' unless @pipeline_commands
75
+ elsif config.kind_of?(Array)
76
+ @env = {}
77
+ @pipeline_commands = { 'default' => config }
78
+ else
79
+ raise 'config file is invalid!'
80
+ end
81
+ end
82
+
83
+ def create_logger
84
+ logger = nil
85
+ if env['log'] && env['log']['out']
86
+ if env['log']['out'].index('file://')
87
+ logger = Logger.new(URI.parse(env['log']['out']).path)
88
+ else
89
+ logger = Logger.new(Yapra::Inflector.constantize(env['log']['out'].upcase))
90
+ end
91
+ else
92
+ logger = Logger.new(STDOUT)
93
+ end
94
+
95
+ if env['log'] && env['log']['level']
96
+ logger.level = Yapra::Inflector.constantize("Logger::#{env['log']['level'].upcase}")
97
+ else
98
+ logger.level = Logger::WARN
99
+ end
100
+ logger
101
+ end
102
+
103
+ end
@@ -0,0 +1,55 @@
1
+ # original from ActiveSupport-2.0.2
2
+ # MIT Licence
3
+ require 'yapra'
4
+
5
+ module Yapra::Inflector
6
+ extend self
7
+
8
+ # By default, camelize converts strings to UpperCamelCase. If the argument to camelize
9
+ # is set to ":lower" then camelize produces lowerCamelCase.
10
+ #
11
+ # camelize will also convert '/' to '::' which is useful for converting paths to namespaces
12
+ #
13
+ # Examples
14
+ # "active_record".camelize #=> "ActiveRecord"
15
+ # "active_record".camelize(:lower) #=> "activeRecord"
16
+ # "active_record/errors".camelize #=> "ActiveRecord::Errors"
17
+ # "active_record/errors".camelize(:lower) #=> "activeRecord::Errors"
18
+ def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
19
+ if first_letter_in_uppercase
20
+ lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
21
+ else
22
+ lower_case_and_underscored_word.first + camelize(lower_case_and_underscored_word)[1..-1]
23
+ end
24
+ end
25
+
26
+ # The reverse of +camelize+. Makes an underscored form from the expression in the string.
27
+ #
28
+ # Changes '::' to '/' to convert namespaces to paths.
29
+ #
30
+ # Examples
31
+ # "ActiveRecord".underscore #=> "active_record"
32
+ # "ActiveRecord::Errors".underscore #=> active_record/errors
33
+ def underscore(camel_cased_word)
34
+ camel_cased_word.to_s.gsub(/::/, '/').
35
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
36
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
37
+ tr("-", "_").
38
+ downcase
39
+ end
40
+
41
+ # Constantize tries to find a declared constant with the name specified
42
+ # in the string. It raises a NameError when the name is not in CamelCase
43
+ # or is not initialized.
44
+ #
45
+ # Examples
46
+ # "Module".constantize #=> Module
47
+ # "Class".constantize #=> Class
48
+ def constantize(camel_cased_word)
49
+ unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ camel_cased_word
50
+ raise NameError, "#{camel_cased_word.inspect} is not a valid constant name!"
51
+ end
52
+
53
+ Object.module_eval("::#{$1}", __FILE__, __LINE__)
54
+ end
55
+ end
@@ -0,0 +1,38 @@
1
+ require 'yapra/legacy_plugin'
2
+ require 'yapra/inflector'
3
+
4
+ module Yapra::LegacyPlugin
5
+
6
+ class AdvanceModeRegistry
7
+ attr_accessor :legacy_plugins
8
+ attr_accessor :plugin_paths
9
+ attr_accessor :pipeline
10
+
11
+ def initialize paths, pipeline
12
+ self.legacy_plugins = {}
13
+ self.plugin_paths = paths.reverse
14
+ self.pipeline = pipeline
15
+ end
16
+
17
+ def logger
18
+ Yapra::Runtime.logger
19
+ end
20
+
21
+ def get module_name
22
+ plugin = legacy_plugins[module_name]
23
+ unless plugin
24
+ plugin_paths.each do |folder|
25
+ file = folder + (module_name.gsub('::', '/') + '.rb')
26
+ if file.file?()
27
+ plugin = Yapra::LegacyPlugin::Base.new(pipeline, file)
28
+ legacy_plugins[ module_name ] = plugin
29
+ logger.debug "#{module_name} is loaded from #{file}"
30
+ break
31
+ end
32
+ end
33
+ end
34
+ raise "#{module_name} is not registered." unless plugin
35
+ plugin
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,26 @@
1
+ # require 'pathname'
2
+ require 'yapra/legacy_plugin'
3
+
4
+ class Yapra::LegacyPlugin::Base
5
+ attr_reader :source
6
+ attr_reader :_yapra_run_method
7
+ attr_reader :_yapra_pipeline
8
+
9
+ def initialize(pipeline, plugin_path)
10
+ @_yapra_pipeline = pipeline
11
+ @_yapra_run_method = File.basename(plugin_path, '.*')
12
+ instance_eval( @source = File.read(plugin_path).toutf8, plugin_path, 1)
13
+ end
14
+
15
+ def logger
16
+ Yapra::Runtime.logger
17
+ end
18
+
19
+ def eval_pragger(command_array, data)
20
+ pipeline.execute_plugins(command_array, data)
21
+ end
22
+
23
+ def _yapra_run_as_legacy_plugin(config, data)
24
+ self.__send__(self._yapra_run_method, config, data)
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ require 'pathname'
2
+ require 'yapra/legacy_plugin'
3
+
4
+ module Yapra::LegacyPlugin
5
+ class CompatibleModeRegistry
6
+ attr_accessor :legacy_plugins
7
+
8
+ def initialize paths, pipeline
9
+ self.legacy_plugins = {}
10
+
11
+ paths.each do |folder|
12
+ Pathname.glob(folder + "**/*.rb").sort.each do |file|
13
+ module_name = file.relative_path_from(folder).to_s.gsub("/","::")[0..-4]
14
+ begin
15
+ legacy_plugins[ module_name ] = Yapra::LegacyPlugin::Base.new(pipeline, file)
16
+ logger.debug "#{module_name} is loaded from #{file}"
17
+ rescue LoadError => ex
18
+ logger.warn "#{module_name} can't load, because: #{ex.message}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ def logger
25
+ Yapra::Runtime.logger
26
+ end
27
+
28
+ def get module_name
29
+ plugin = legacy_plugins[module_name]
30
+ raise "#{module_name} is not registered." unless plugin
31
+ plugin
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ require 'yapra/legacy_plugin'
2
+ require 'yapra/inflector'
3
+
4
+ class Yapra::LegacyPlugin::RegistryFactory
5
+ attr_reader :plugin_paths
6
+ attr_reader :registry_class
7
+
8
+ def initialize plugin_paths, mode = 'compatible'
9
+ registry_name = "Yapra::LegacyPlugin::#{Yapra::Inflector.camelize(mode)}ModeRegistry"
10
+ @registry_class = Yapra.load_class_constant(registry_name)
11
+ raise "'#{mode}' mode is not supported." unless @registry_class
12
+
13
+ @plugin_paths = plugin_paths
14
+ end
15
+
16
+ def create pipeline
17
+ registry = registry_class.new(plugin_paths, pipeline)
18
+ pipeline.legacy_plugin_registry = registry
19
+ registry
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ # require 'pathname'
2
+ require 'yapra'
3
+
4
+ module Yapra::LegacyPlugin
5
+ end
@@ -0,0 +1,74 @@
1
+ require 'yapra'
2
+ require 'yapra/inflector'
3
+ require 'yapra/legacy_plugin/base'
4
+
5
+ class Yapra::Pipeline
6
+ attr_reader :yapra, :context
7
+ attr_accessor :legacy_plugin_registry
8
+
9
+ UPPER_CASE = /[A-Z]/
10
+
11
+ def initialize yapra, pipeline_name
12
+ @yapra = yapra
13
+ @context = { 'pipeline_name' => pipeline_name }
14
+
15
+ @module_name_prefix = construct_module_name_prefix yapra.env
16
+ end
17
+
18
+ def logger
19
+ Yapra::Runtime.logger
20
+ end
21
+
22
+ def run pipeline_command, data=[]
23
+ pipeline_command.inject(data) do |data, command|
24
+ execute_plugin(command, data.clone)
25
+ end
26
+ end
27
+
28
+ def execute_plugin command, data
29
+ self.logger.info("exec plugin #{command["module"]}")
30
+ if class_based_plugin?(command['module'])
31
+ run_class_based_plugin command, data
32
+ else
33
+ run_legacy_plugin command, data
34
+ end
35
+ end
36
+
37
+ protected
38
+ def class_based_plugin? command_name
39
+ UPPER_CASE =~ command_name.split('::').last[0, 1]
40
+ end
41
+
42
+ def run_legacy_plugin command, data
43
+ self.logger.debug("evaluate plugin as legacy")
44
+ legacy_plugin_registry.get(command['module'])._yapra_run_as_legacy_plugin(command['config'], data)
45
+ end
46
+
47
+ def run_class_based_plugin command, data
48
+ self.logger.debug("evaluate plugin as class based")
49
+ plugin_class = nil
50
+ @module_name_prefix.each do |prefix|
51
+ yapra_module_name = "#{prefix}#{command['module']}"
52
+ plugin_class = Yapra.load_class_constant(yapra_module_name)
53
+ break if plugin_class
54
+ end
55
+ raise LoadError unless plugin_class
56
+ plugin = plugin_class.new
57
+ plugin.yapra = yapra if plugin.respond_to?('yapra=')
58
+ plugin.pipeline = self if plugin.respond_to?('pipeline=')
59
+ plugin.plugin_config = command['config'] if plugin.respond_to?('plugin_config=')
60
+ plugin.run(data)
61
+ end
62
+
63
+ def construct_module_name_prefix env
64
+ module_name_prefix = [ 'Yapra::Plugin::', '' ]
65
+ if env['module_name_prefix']
66
+ if env['module_name_prefix'].kind_of?(Array)
67
+ module_name_prefix = env['module_name_prefix']
68
+ else
69
+ module_name_prefix = [ env['module_name_prefix'] ]
70
+ end
71
+ end
72
+ module_name_prefix
73
+ end
74
+ end
@@ -0,0 +1,14 @@
1
+ require 'yapra/plugin'
2
+ require 'yapra/plugin/context_aware'
3
+ require 'yapra/plugin/erb_applier'
4
+ require 'yapra/plugin/feed_item_operator'
5
+
6
+ class Yapra::Plugin::Base
7
+ include Yapra::Plugin::ContextAware
8
+ include Yapra::Plugin::FeedItemOperator
9
+ include Yapra::Plugin::ErbApplier
10
+
11
+ def logger
12
+ Yapra::Runtime.logger
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'yapra/plugin'
2
+
3
+ module Yapra::Plugin::ContextAware
4
+ attr_accessor :yapra, :pipeline, :plugin_config
5
+
6
+ def config
7
+ @config ||= nil
8
+ unless @config
9
+ @config = {}.update(yapra.env).update(pipeline.context)
10
+ @config.update(plugin_config) if plugin_config
11
+ end
12
+ @config
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require 'yapra/plugin'
2
+ require 'erb'
3
+ require 'uri'
4
+
5
+ module Yapra::Plugin::ErbApplier
6
+ def apply_template template, apply_binding=binding
7
+ if template.index('file://') == 0
8
+ path = URI.parse(template).path
9
+ open(path) do |io|
10
+ template = io.read
11
+ end
12
+ end
13
+ ERB.new(template).result(apply_binding)
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ require 'yapra/plugin'
2
+
3
+ module Yapra::Plugin::FeedItemOperator
4
+ LOCAL_VAL_RE = /[a-z_][0-9A-Za-z_]/
5
+
6
+ def set_attribute_to item, k, value
7
+ raise NameError unless LOCAL_VAL_RE =~ k
8
+ unless item.respond_to?("#{k}=")
9
+ item.instance_eval %Q{
10
+ def #{k}
11
+ @#{k}
12
+ end
13
+ def #{k}= v
14
+ @#{k} = v
15
+ end
16
+ }, __FILE__, __LINE__
17
+
18
+ end
19
+ item.__send__("#{k}=", value)
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ require 'mechanize'
2
+ require 'kconv'
3
+ require 'yapra/plugin/base'
4
+
5
+ class Yapra::Plugin::MechanizeBase < Yapra::Plugin::Base
6
+ def agent
7
+ pipeline.context['mechanize_agent'] ||= WWW::Mechanize.new
8
+ pipeline.context['mechanize_agent']
9
+ end
10
+
11
+ def extract_attribute_from element, item
12
+ if config['extract_xpath']
13
+ config['extract_xpath'].each do |k, v|
14
+ value = element.search(v).to_html.toutf8
15
+ set_attribute_to item, k, value
16
+ end
17
+ end
18
+
19
+ if config['apply_template_after_extracted']
20
+ config['apply_template_after_extracted'].each do |k, template|
21
+ value = apply_template template, binding
22
+ set_attribute_to item, k, value
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ require 'yapra'
2
+
3
+ module Yapra::Plugin
4
+
5
+ end
@@ -0,0 +1,36 @@
1
+ require 'yapra'
2
+ require 'yapra/pipeline'
3
+ require 'yapra/config'
4
+ require 'yapra/inflector'
5
+
6
+ class Yapra::Runtime
7
+ attr_reader :env
8
+ attr_reader :legacy_plugin_registry_factory
9
+
10
+ def initialize env={}, legacy_plugin_registry_factory=nil
11
+ @env = env
12
+
13
+ @legacy_plugin_registry_factory = legacy_plugin_registry_factory
14
+ end
15
+
16
+ def execute pipeline_commands
17
+ pipeline_commands.each do |k, v|
18
+ execute_pipeline k, v, []
19
+ end
20
+ end
21
+
22
+ def execute_pipeline pipeline_name, command_array, data=[]
23
+ self.class.logger.info("# pipeline '#{pipeline_name}' is started...")
24
+ pipeline = Yapra::Pipeline.new(self, pipeline_name)
25
+ legacy_plugin_registory = legacy_plugin_registry_factory.create(pipeline) if legacy_plugin_registry_factory
26
+ pipeline.run(command_array, data)
27
+ end
28
+
29
+ def self.logger
30
+ @@logger
31
+ end
32
+
33
+ def self.logger=logger
34
+ @@logger = logger
35
+ end
36
+ end
@@ -0,0 +1,9 @@
1
+ module Yapra
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ TINY = 0
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
data/lib/yapra.rb ADDED
@@ -0,0 +1,44 @@
1
+ #--
2
+ # Copyright (c) 2008 fraction.jp. Yuanying, Some rights reserved.
3
+ # Original from 2008-06-12 http://pragger.ikejisoft.com/
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ #++
24
+ $:.unshift(File.dirname(__FILE__)) unless
25
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
26
+
27
+ module Yapra
28
+ extend self
29
+
30
+ # TODO create util class, and move this method.
31
+ def load_class_constant module_name
32
+ require Yapra::Inflector.underscore(module_name)
33
+ Yapra::Inflector.constantize(module_name)
34
+ rescue LoadError
35
+ nil
36
+ rescue NameError
37
+ nil
38
+ end
39
+ end
40
+ require 'rss/1.0'
41
+ require 'rss/2.0'
42
+ require 'rss/dublincore'
43
+ require 'rss/maker'
44
+ require 'rubygems'
@@ -0,0 +1,34 @@
1
+ ## Yapra::Config::Agent -- Yuanying
2
+ ##
3
+ ## add WWW::Mechanize agent to context.
4
+ ##
5
+ ## - module: Config::Agent
6
+ ## config:
7
+ ## user_agent_alias: Windows IE 6
8
+ ## proxy:
9
+ ## addr: localhost
10
+ ## port: 8080
11
+ ## user: username
12
+ ## password: password
13
+ ##
14
+ require 'yapra/plugin/mechanize_base'
15
+
16
+ module Yapra::Plugin::Config
17
+ class Agent < Yapra::Plugin::MechanizeBase
18
+
19
+ def run(data)
20
+
21
+ agent.user_agent_alias = config['user_agent_alias'] || 'Windows IE 6'
22
+ if config['proxy']
23
+ agent.set_proxy(
24
+ config['proxy']['addr'],
25
+ config['proxy']['port'],
26
+ config['proxy']['user'],
27
+ config['proxy']['password']
28
+ )
29
+ end
30
+
31
+ return data
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ ## Config::BasicAuth -- Yuanying
2
+ ##
3
+ ## post to web page with WWW::Mechanize agent.
4
+ ##
5
+ ## - module: Config::BasicAuth
6
+ ## config:
7
+ ## user: yuanying
8
+ ## password: password-dayo
9
+ ##
10
+ require 'yapra/plugin/mechanize_base'
11
+
12
+ module Yapra::Plugin::Config
13
+ class BasicAuth < Yapra::Plugin::MechanizeBase
14
+ def run(data)
15
+ agent.basic_auth(config['user'], config['password'])
16
+ data
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ ## Config::WebPost -- Yuanying
2
+ ##
3
+ ## post to web page with WWW::Mechanize agent.
4
+ ##
5
+ ## - module: Config::WebPost
6
+ ## config:
7
+ ## url: http://www.pixiv.net/index.php
8
+ ## params:
9
+ ## pixiv_id: yuanying
10
+ ## pass: password-dayo
11
+ ##
12
+ require 'yapra/plugin/mechanize_base'
13
+
14
+ module Yapra::Plugin::Config
15
+ class WebPost < Yapra::Plugin::MechanizeBase
16
+ def run(data)
17
+ agent.post(config['url'], config['params'])
18
+ data
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,41 @@
1
+ ## - module: Feed::Custom
2
+ ## config:
3
+ ## url: 'http://www.fraction.jp/'
4
+ ## extract_xpath:
5
+ ## capture: '//div'
6
+ ## split: '//div[@class="test"]'
7
+ ## description: '//div'
8
+ ## link: '//li[2]'
9
+ ## title: '//p'
10
+ ## apply_template_after_extracted:
11
+ ## content_encoded: '<div><%= title %></div>'
12
+ ##
13
+ require 'yapra/plugin/mechanize_base'
14
+
15
+ module Yapra::Plugin::Feed
16
+ class Custom < Yapra::Plugin::MechanizeBase
17
+ def run(data)
18
+ page = agent.get(config['url'])
19
+ root = page.root
20
+
21
+ xconfig = config['extract_xpath']
22
+
23
+ if xconfig['capture']
24
+ root = root.at(xconfig['capture'])
25
+ end
26
+ split = xconfig['split']
27
+ xconfig.delete('capture')
28
+ xconfig.delete('split')
29
+
30
+ root.search(split).each do |element|
31
+ item = RSS::RDF::Item.new
32
+
33
+ extract_attribute_from element, item
34
+
35
+ data << item
36
+ end
37
+
38
+ data
39
+ end
40
+ end
41
+ end