flog 2.2.0 → 2.3.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.
@@ -1,70 +0,0 @@
1
- class BotFilter
2
- attr_reader :options
3
-
4
- def initialize(options = {})
5
- @options = options
6
- end
7
-
8
- @@kinds = []
9
- @@filters_registered = false
10
-
11
- class << self
12
- def new(options = {})
13
- locate_filters(options) unless @@filters_registered
14
- obj = allocate
15
- obj.send :initialize, options
16
- obj
17
- end
18
-
19
- def kinds
20
- @@kinds
21
- end
22
-
23
- def register(name)
24
- @@kinds << name
25
- end
26
-
27
- def clear_kinds
28
- @@kinds = []
29
- @@filters_registered = false
30
- end
31
-
32
- def get(ident)
33
- name = ident.to_s.gsub(/(?:^|_)([a-z])/) { $1.upcase }.to_sym
34
- const_get(name)
35
- end
36
-
37
- def locate_filters(options)
38
- if options and options[:active_filters]
39
- options[:active_filters].each do |filter|
40
- register_filter(filter)
41
- end
42
- end
43
- @@filters_registered = true
44
- end
45
-
46
- def filter_path(name)
47
- File.expand_path(File.dirname(__FILE__)+"/../lib/filters/#{name}.rb")
48
- end
49
-
50
- def register_filter(name)
51
- path = filter_path(name)
52
- raise ArgumentError, "Could not find source code for filter [#{name}] in [#{path}]" unless File.exists? path
53
- load(path)
54
- register(name)
55
- end
56
- end
57
-
58
- def process(data)
59
- result = data
60
- self.class.kinds.each do |k|
61
- if result
62
- result = BotFilter.get(k).new(options).process(result)
63
- else
64
- result = nil
65
- break
66
- end
67
- end
68
- result
69
- end
70
- end
@@ -1,79 +0,0 @@
1
- require 'bot_parser_format'
2
-
3
- class BotParser
4
- @formats = []
5
-
6
- class << self
7
- attr_reader :formats
8
-
9
- def register_format(*args, &block)
10
- formats << BotParserFormat.new(*args, &block)
11
- end
12
-
13
- def clear_formats
14
- @formats = []
15
- end
16
- end
17
-
18
- def formats() self.class.formats; end
19
-
20
- register_format :image, /^\s*(?:(.*?)\s+)?(http:\S+\.(?:jpe?g|png|gif))(?:\s+(\S.*))?$/i,
21
- %q['http://www.citizenx.cx/img/best_picture_ever.jpg'],
22
- %q['http://www.citizenx.cx/img/best_picture_never.jpg this poster hangs over my bed'],
23
- %q['Best. Picture. Ever. http://www.citizenx.cx/img/best_picture_ever.jpg'] do |md, _|
24
- { :title => md[1], :source => md[2], :caption => md[3] }
25
- end
26
-
27
- register_format :video, %r{^\s*(?:(.*?)\s+)?(http://(?:www\.)?youtube\.com/\S+\?\S+)(?:\s+(.*))?$}i,
28
- %q['http://www.youtube.com/watch?v=E2Fjilze0eI'],
29
- %q['http://www.youtube.com/watch?v=E2Fjilze0eI the bunny gets it'],
30
- %q['A waste of chocolate http://www.youtube.com/watch?v=E2Fjilze0eI'] do |md, _|
31
- { :title => md[1], :embed => md[2], :caption => md[3] }
32
- end
33
-
34
- register_format :quote, /^\s*"([^"]+)"\s+--\s*(.*?)(?:\s+\((https?:.*)\))?$/i,
35
- %q['"adios, turd nuggets" --J.P.'],
36
- %q['"adios, turd nuggets" --J.P. (http://imdb.com/title/tt0456554/)'] do |md, _|
37
- { :quote => md[1], :source => md[2], :url => md[3] }
38
- end
39
-
40
- register_format :link, %r{^\s*(?:(.*?)\s+)?(https?://\S+)\s*(?:\s+(\S.*))?$}i,
41
- %q['http://news.yahoo.com/s/ap/20071203/ap_on_sc/dinosaur_mummy'],
42
- %q['http://news.yahoo.com/s/ap/20071203/ap_on_sc/dinosaur_mummy shows just how fast a mummified dinosaur can be'],
43
- %q['Fossilized Hadrosaur http://news.yahoo.com/s/ap/20071203/ap_on_sc/dinosaur_mummy'] do |md, _|
44
- { :name => md[1], :url => md[2], :description => md[3] }
45
- end
46
-
47
- register_format :fact, %r{^\s*fact:\s+(.*)}i,
48
- %q['FACT: Zed Shaw doesn't do pushups, he pushes the earth down'] do |md, _|
49
- { :title => "FACT: #{md[1]}" }
50
- end
51
-
52
- register_format :true_or_false, %r{^\s*(?:(?:true\s+or\s+false)|(?:t\s+or\s+f))\s*[:\?]\s+(.*)}i,
53
- %q['T or F: the human body has more than one sphincter'],
54
- %q['true or false: the human body has more than one sphincter'],
55
- %q['true or false? the human body has more than one sphincter'] do |md, _|
56
- { :title => "True or False? #{md[1]}" }
57
- end
58
-
59
- register_format :definition, %r{^\s*defin(?:e|ition):?\s+(.*?)\s*(?:[:=]|as)\s*(.*)}i,
60
- %q['Definition: tardulism: the ideology of the tard culture'],
61
- %q['Definition: tardulism = the ideology of the tard culture'],
62
- %q["define tardulism as the ideology of the tard culture"] do |md, _|
63
- { :title => "DEFINITION: #{md[1]}: #{md[2]}" }
64
- end
65
-
66
- def parse(sender, channel, mesg)
67
- return nil if mesg.empty?
68
-
69
- common = { :poster => sender, :channel => channel }
70
-
71
- result = nil
72
- formats.detect { |f| result = f.process(mesg) }
73
-
74
- return nil unless result
75
-
76
- result = common.merge(result)
77
- result
78
- end
79
- end
@@ -1,23 +0,0 @@
1
- class BotParserFormat
2
- attr_reader :name, :format, :block
3
-
4
- def initialize(name, format, *description, &block)
5
- raise ArgumentError, 'Block needed' if block.nil?
6
-
7
- @name = name
8
- @format = format
9
- @block = block
10
- @description = description
11
- end
12
-
13
- def description
14
- @description.empty? ? nil : @description.join("\n")
15
- end
16
-
17
- def process(text)
18
- md = format.match(text)
19
- return nil unless md
20
-
21
- block.call(md, text).merge(:type => name)
22
- end
23
- end
@@ -1,46 +0,0 @@
1
- class BotSender
2
- attr_reader :kind
3
-
4
- @@kinds = { }
5
-
6
- def self.kinds
7
- @@kinds.keys.sort_by {|k| k.to_s }
8
- end
9
-
10
- def self.register(args = {})
11
- args.each_pair {|k,v| @@kinds[k] = v }
12
- end
13
-
14
- def self.new(args = {})
15
- raise ArgumentError unless self.kinds.include?(args[:destination])
16
- obj = @@kinds[args[:destination]].allocate
17
- obj.send :initialize, args
18
- obj
19
- end
20
-
21
- def initialize(args = {})
22
- validate(args)
23
- @kind = args[:destination]
24
- end
25
-
26
- def deliver(message)
27
- return nil unless message and message[:type]
28
- meth = "do_#{message[:type]}".to_sym
29
- raise ArgumentError, "unknown message type [#{message[:type]}]" unless self.respond_to?(meth)
30
- begin
31
- self.send(meth, message)
32
- rescue Exception => e
33
- return e.to_s
34
- end
35
- end
36
-
37
- # validate arguments when creating a specific BotSender type instance
38
- def validate(args = {})
39
- end
40
- end
41
-
42
- require 'senders/tumblr'
43
-
44
- class BotSender
45
- @@kinds[:tumblr] = BotSender::Tumblr
46
- end
File without changes
@@ -1,191 +0,0 @@
1
- module ObjectDaddy
2
-
3
- def self.included(klass)
4
- klass.extend ClassMethods
5
- if defined? ActiveRecord and klass < ActiveRecord::Base
6
- klass.extend RailsClassMethods
7
-
8
- class << klass
9
- alias_method :validates_presence_of_without_object_daddy, :validates_presence_of
10
- alias_method :validates_presence_of, :validates_presence_of_with_object_daddy
11
- end
12
- end
13
- end
14
-
15
- module ClassMethods
16
- attr_accessor :exemplars_generated, :exemplar_path, :generators
17
- attr_reader :presence_validated_attributes
18
- protected :exemplars_generated=
19
-
20
- # create a valid instance of this class, using any known generators
21
- def spawn(args = {})
22
- gather_exemplars
23
- (generators || {}).each_pair do |handle, gen_data|
24
- next if args[handle]
25
- generator = gen_data[:generator]
26
- if generator[:block]
27
- if generator[:start]
28
- generator[:prev] = args[handle] = generator[:start]
29
- generator.delete(:start)
30
- else
31
- generator[:prev] = args[handle] = generator[:block].call(generator[:prev])
32
- end
33
- elsif generator[:method]
34
- args[handle] = send(generator[:method])
35
- elsif generator[:class]
36
- args[handle] = generator[:class].next
37
- end
38
- end
39
- if presence_validated_attributes and !presence_validated_attributes.empty?
40
- req = {}
41
- (presence_validated_attributes.keys - args.keys).each {|a| req[a.to_s] = true } # find attributes required by validates_presence_of not already set
42
-
43
- belongs_to_associations = reflect_on_all_associations(:belongs_to).to_a
44
- missing = belongs_to_associations.select { |a| req[a.name.to_s] or req[a.primary_key_name.to_s] }
45
- if create_scope = scope(:create)
46
- missing.reject! { |a| create_scope.include?(a.primary_key_name) }
47
- end
48
- missing.each {|a| args[a.name] = a.class_name.constantize.generate }
49
- end
50
- new(args)
51
- end
52
-
53
- # register a generator for an attribute of this class
54
- # generator_for :foo do |prev| ... end
55
- # generator_for :foo do ... end
56
- # generator_for :foo, value
57
- # generator_for :foo => value
58
- # generator_for :foo, :class => GeneratorClass
59
- # generator_for :foo, :method => :method_name
60
- def generator_for(handle, args = {}, &block)
61
- if handle.is_a?(Hash)
62
- raise ArgumentError, "only specify one attr => value pair at a time" unless handle.keys.length == 1
63
- gen_data = handle
64
- handle = gen_data.keys.first
65
- args = gen_data[handle]
66
- end
67
-
68
- raise ArgumentError, "an attribute name must be specified" unless handle = handle.to_sym
69
-
70
- unless args.is_a?(Hash)
71
- unless block
72
- retval = args
73
- block = lambda { retval } # lambda { args } results in returning the empty hash that args gets changed to
74
- end
75
- args = {} # args is assumed to be a hash for the rest of the method
76
- end
77
-
78
- if args[:method]
79
- record_generator_for(handle, :method => args[:method].to_sym)
80
- elsif args[:class]
81
- raise ArgumentError, "generator class [#{args[:class].name}] does not have a :next method" unless args[:class].respond_to?(:next)
82
- record_generator_for(handle, :class => args[:class])
83
- elsif block
84
- raise ArgumentError, "generator block must take an optional single argument" unless (-1..1).include?(block.arity) # NOTE: lambda {} has an arity of -1, while lambda {||} has an arity of 0
85
- h = { :block => block }
86
- h[:start] = args[:start] if args[:start]
87
- record_generator_for(handle, h)
88
- else
89
- raise ArgumentError, "a block, :class generator, :method generator, or value must be specified to generator_for"
90
- end
91
- end
92
-
93
- def gather_exemplars
94
- return if exemplars_generated
95
- if superclass.respond_to?(:gather_exemplars)
96
- superclass.gather_exemplars
97
- self.generators = (superclass.generators || {}).dup
98
- end
99
-
100
- path = File.join(exemplar_path, "#{underscore(name)}_exemplar.rb")
101
- load(path) if File.exists?(path)
102
- self.exemplars_generated = true
103
- end
104
-
105
- def presence_validated_attributes
106
- @presence_validated_attributes ||= {}
107
- attrs = @presence_validated_attributes
108
- if superclass.respond_to?(:presence_validated_attributes)
109
- attrs = superclass.presence_validated_attributes.merge(attrs)
110
- end
111
- attrs
112
- end
113
-
114
- protected
115
-
116
- # we define an underscore helper ourselves since the ActiveSupport isn't available if we're not using Rails
117
- def underscore(string)
118
- string.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
119
- end
120
-
121
- def record_generator_for(handle, generator)
122
- self.generators ||= {}
123
- raise ArgumentError, "a generator for attribute [:#{handle}] has already been specified" if (generators[handle] || {})[:source] == self
124
- generators[handle] = { :generator => generator, :source => self }
125
- end
126
- end
127
-
128
- module RailsClassMethods
129
- def exemplar_path
130
- File.join(RAILS_ROOT, 'test', 'exemplars')
131
- end
132
-
133
- def validates_presence_of_with_object_daddy(*attr_names)
134
- @presence_validated_attributes ||= {}
135
- new_attr = attr_names.dup
136
- new_attr.pop if new_attr.last.is_a?(Hash)
137
- new_attr.each {|a| @presence_validated_attributes[a] = true }
138
- validates_presence_of_without_object_daddy(*attr_names)
139
- end
140
-
141
- def generate(args = {})
142
- obj = spawn(args)
143
- obj.save
144
- obj
145
- end
146
-
147
- def generate!(args = {})
148
- obj = spawn(args)
149
- obj.save!
150
- obj
151
- end
152
- end
153
- end
154
-
155
-
156
- # these additional routines are just to give us coverage for flog opcodes that we hadn't yet covered in an integration test
157
- alias puts print
158
- attr_writer :foo
159
-
160
- foo = 2
161
-
162
- case 'foo'
163
- when :foo
164
- true
165
- else
166
- false
167
- end
168
-
169
- class Foo
170
- def initialize
171
- super(:foo)
172
- end
173
- end
174
-
175
- until true
176
- true
177
- end
178
-
179
- while false
180
- true
181
- end
182
-
183
- begin
184
- true
185
- rescue Exception
186
- false
187
- else
188
- true
189
- end
190
-
191
- puts(/foo/)
@@ -1,343 +0,0 @@
1
- require 'test/test_helper'
2
- require 'flog'
3
-
4
- # describe 'flog command' do
5
- # before :each do
6
- # @flog = stub('Flog',
7
- # :flog_files => true,
8
- # :report => true,
9
- # :exit => nil,
10
- # :puts => nil)
11
- # # Flog.stubs(:new).returns(@flog)
12
- # end
13
- #
14
- # def run_command
15
- # # HACK eval File.read(File.join(File.dirname(__FILE__), *%w[.. bin flog]))
16
- # end
17
- #
18
- # describe 'when no command-line arguments are specified' do
19
- # before :each do
20
- # ARGV.clear
21
- # end
22
- #
23
- # it 'should run' do
24
- # lambda { run_command }.wont_raise_error(Errno::ENOENT)
25
- # end
26
- #
27
- # it 'should not alter the include path' do
28
- # @paths = $:.dup
29
- # run_command
30
- # $:.must_equal @paths
31
- # end
32
- #
33
- # # it 'should create a Flog instance' do
34
- # # Flog.expects(:new).returns(@flog)
35
- # # run_command
36
- # # end
37
- # #
38
- # # it 'should not have any options flags set' do
39
- # # Flog.expects(:new).with({}).returns(@flog)
40
- # # run_command
41
- # # end
42
- #
43
- # it 'should call flog_files on the Flog instance' do
44
- # @flog.expects(:flog_files)
45
- # run_command
46
- # end
47
- #
48
- # it "should pass '-' (for the file path) to flog_files on the instance" do
49
- # @flog.expects(:flog_files).with(['-'])
50
- # run_command
51
- # end
52
- #
53
- # it 'should call report on the Flog instance' do
54
- # @flog.expects(:report)
55
- # run_command
56
- # end
57
- #
58
- # it 'should exit with status 0' do
59
- # self.expects(:exit).with(0)
60
- # run_command
61
- # end
62
- # end
63
- #
64
- # describe "when -a is specified on the command-line" do
65
- # before :each do
66
- # ARGV.replace ['-a']
67
- # end
68
- #
69
- # # it 'should create a Flog instance' do
70
- # # Flog.expects(:new).returns(@flog)
71
- # # run_command
72
- # # end
73
- # #
74
- # # it "should set the option to show all methods" do
75
- # # Flog.expects(:new).with(:all => true).returns(@flog)
76
- # # run_command
77
- # # end
78
- #
79
- # it 'should exit with status 0' do
80
- # self.expects(:exit).with(0)
81
- # run_command
82
- # end
83
- # end
84
- #
85
- # describe "when --all is specified on the command-line" do
86
- # before :each do
87
- # ARGV.replace ['--all']
88
- # end
89
- #
90
- # # it 'should create a Flog instance' do
91
- # # Flog.expects(:new).returns(@flog)
92
- # # run_command
93
- # # end
94
- # #
95
- # # it "should set the option to show all methods" do
96
- # # Flog.expects(:new).with(:all => true).returns(@flog)
97
- # # run_command
98
- # # end
99
- #
100
- # it 'should exit with status 0' do
101
- # self.expects(:exit).with(0)
102
- # run_command
103
- # end
104
- # end
105
- #
106
- # describe "when -s is specified on the command-line" do
107
- # before :each do
108
- # ARGV.replace ['-s']
109
- # end
110
- #
111
- # # it 'should create a Flog instance' do
112
- # # Flog.expects(:new).returns(@flog)
113
- # # run_command
114
- # # end
115
- # #
116
- # # it "should set the option to show only the score" do
117
- # # Flog.expects(:new).with(:score => true).returns(@flog)
118
- # # run_command
119
- # # end
120
- #
121
- # it 'should exit with status 0' do
122
- # self.expects(:exit).with(0)
123
- # run_command
124
- # end
125
- # end
126
- #
127
- # describe "when --score is specified on the command-line" do
128
- # before :each do
129
- # ARGV.replace ['--score']
130
- # end
131
- #
132
- # # it 'should create a Flog instance' do
133
- # # Flog.expects(:new).returns(@flog)
134
- # # run_command
135
- # # end
136
- # #
137
- # # it "should set the option to show only the score" do
138
- # # Flog.expects(:new).with(:score => true).returns(@flog)
139
- # # run_command
140
- # # end
141
- #
142
- # it 'should exit with status 0' do
143
- # self.expects(:exit).with(0)
144
- # run_command
145
- # end
146
- # end
147
- #
148
- # describe "when -m is specified on the command-line" do
149
- # before :each do
150
- # ARGV.replace ['-m']
151
- # end
152
- #
153
- # # it 'should create a Flog instance' do
154
- # # Flog.expects(:new).returns(@flog)
155
- # # run_command
156
- # # end
157
- # #
158
- # # it "should set the option to report on methods only" do
159
- # # Flog.expects(:new).with(:methods => true).returns(@flog)
160
- # # run_command
161
- # # end
162
- #
163
- # it 'should exit with status 0' do
164
- # self.expects(:exit).with(0)
165
- # run_command
166
- # end
167
- # end
168
- #
169
- # describe "when --methods-only is specified on the command-line" do
170
- # before :each do
171
- # ARGV.replace ['--methods-only']
172
- # end
173
- #
174
- # # it 'should create a Flog instance' do
175
- # # Flog.expects(:new).returns(@flog)
176
- # # run_command
177
- # # end
178
- # #
179
- # # it "should set the option to report on methods only" do
180
- # # Flog.expects(:new).with(:methods => true).returns(@flog)
181
- # # run_command
182
- # # end
183
- #
184
- # it 'should exit with status 0' do
185
- # self.expects(:exit).with(0)
186
- # run_command
187
- # end
188
- # end
189
- #
190
- # describe "when -v is specified on the command-line" do
191
- # before :each do
192
- # ARGV.replace ['-v']
193
- # end
194
- #
195
- # # it 'should create a Flog instance' do
196
- # # Flog.expects(:new).returns(@flog)
197
- # # run_command
198
- # # end
199
- # #
200
- # # it "should set the option to be verbose" do
201
- # # Flog.expects(:new).with(:verbose => true).returns(@flog)
202
- # # run_command
203
- # # end
204
- #
205
- # it 'should exit with status 0' do
206
- # self.expects(:exit).with(0)
207
- # run_command
208
- # end
209
- # end
210
- #
211
- # describe "when --verbose is specified on the command-line" do
212
- # before :each do
213
- # ARGV.replace ['--verbose']
214
- # end
215
- #
216
- # # HACK
217
- # # it 'should create a Flog instance' do
218
- # # Flog.expects(:new).returns(@flog)
219
- # # run_command
220
- # # end
221
- #
222
- # # HACK
223
- # # it "should set the option to be verbose" do
224
- # # Flog.expects(:new).with(:verbose => true).returns(@flog)
225
- # # run_command
226
- # # end
227
- #
228
- # # HACK
229
- # # it 'should exit with status 0' do
230
- # # self.expects(:exit).with(0)
231
- # # run_command
232
- # # end
233
- # end
234
- #
235
- # describe "when -h is specified on the command-line" do
236
- # before :each do
237
- # ARGV.replace ['-h']
238
- # end
239
- #
240
- # it "should display help information" do
241
- # self.expects(:puts)
242
- # run_command
243
- # end
244
- #
245
- # # HACK: useless anyhow
246
- # # it 'should not create a Flog instance' do
247
- # # Flog.expects(:new).never
248
- # # run_command
249
- # # end
250
- #
251
- # it 'should exit with status 0' do
252
- # self.expects(:exit).with(0)
253
- # run_command
254
- # end
255
- # end
256
- #
257
- # describe "when --help is specified on the command-line" do
258
- # before :each do
259
- # ARGV.replace ['--help']
260
- # end
261
- #
262
- # it "should display help information" do
263
- # self.expects(:puts)
264
- # run_command
265
- # end
266
- #
267
- # # HACK: useless anyhow
268
- # # it 'should not create a Flog instance' do
269
- # # Flog.expects(:new).never
270
- # # run_command
271
- # # end
272
- #
273
- # it 'should exit with status 0' do
274
- # self.expects(:exit).with(0)
275
- # run_command
276
- # end
277
- # end
278
- #
279
- # describe 'when -I is specified on the command-line' do
280
- # before :each do
281
- # ARGV.replace ['-I /tmp,/etc']
282
- # @paths = $:.dup
283
- # end
284
- #
285
- # # HACK - very little value to begin with
286
- # # it "should append each ':' separated path to $:" do
287
- # # run_command
288
- # # $:.wont_equal @paths
289
- # # end
290
- #
291
- # # it 'should create a Flog instance' do
292
- # # Flog.expects(:new).returns(@flog)
293
- # # run_command
294
- # # end
295
- #
296
- # it 'should exit with status 0' do
297
- # self.expects(:exit).with(0)
298
- # run_command
299
- # end
300
- # end
301
- #
302
- # describe 'when -b is specified on the command-line' do
303
- # before :each do
304
- # ARGV.replace ['-b']
305
- # end
306
- #
307
- # # it 'should create a Flog instance' do
308
- # # Flog.expects(:new).returns(@flog)
309
- # # run_command
310
- # # end
311
- # #
312
- # # it "should set the option to provide 'blame' information" do
313
- # # Flog.expects(:new).with(:blame => true).returns(@flog)
314
- # # run_command
315
- # # end
316
- #
317
- # it 'should exit with status 0' do
318
- # self.expects(:exit).with(0)
319
- # run_command
320
- # end
321
- # end
322
- #
323
- # describe 'when --blame is specified on the command-line' do
324
- # before :each do
325
- # ARGV.replace ['--blame']
326
- # end
327
- #
328
- # # it 'should create a Flog instance' do
329
- # # Flog.expects(:new).returns(@flog)
330
- # # run_command
331
- # # end
332
- # #
333
- # # it "should set the option to provide 'blame' information" do
334
- # # Flog.expects(:new).with(:blame => true).returns(@flog)
335
- # # run_command
336
- # # end
337
- #
338
- # it 'should exit with status 0' do
339
- # self.expects(:exit).with(0)
340
- # run_command
341
- # end
342
- # end
343
- # end