gnip 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +144 -0
- data/Rakefile +53 -0
- data/TODO +72 -0
- data/bin/gnip +651 -0
- data/doc/api.html +1201 -0
- data/gemspec.rb +47 -0
- data/gnip-0.4.2.gem +0 -0
- data/lib/gnip.rb +71 -0
- data/lib/gnip/activity.rb +663 -0
- data/lib/gnip/api.rb +191 -0
- data/lib/gnip/arguments.rb +21 -0
- data/lib/gnip/blankslate.rb +5 -0
- data/lib/gnip/config.rb +144 -0
- data/lib/gnip/filter.rb +304 -0
- data/lib/gnip/list.rb +126 -0
- data/lib/gnip/options.rb +96 -0
- data/lib/gnip/orderedhash.rb +199 -0
- data/lib/gnip/publisher.rb +309 -0
- data/lib/gnip/resource.rb +301 -0
- data/lib/gnip/template.rb +44 -0
- data/lib/gnip/util.rb +120 -0
- data/sample/data/activity.yml +21 -0
- data/test/auth.rb +60 -0
- data/test/config.yml +2 -0
- data/test/data/activity.xml +14 -0
- data/test/data/activity_only_required.xml +4 -0
- data/test/data/activity_with_payload.xml +22 -0
- data/test/data/activity_with_place.xml +18 -0
- data/test/data/activity_with_place_wo_bounds.xml +36 -0
- data/test/data/activity_with_unbounded_media_urls.xml +44 -0
- data/test/data/activity_without_bounds.xml +24 -0
- data/test/helper.rb +115 -0
- data/test/helper.rb.bak +28 -0
- data/test/integration/auth.rb +12 -0
- data/test/integration/publisher.rb +86 -0
- data/test/lib/shoulda.rb +9 -0
- data/test/lib/shoulda/action_controller.rb +28 -0
- data/test/lib/shoulda/action_controller/helpers.rb +47 -0
- data/test/lib/shoulda/action_controller/macros.rb +277 -0
- data/test/lib/shoulda/action_controller/matchers.rb +37 -0
- data/test/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +109 -0
- data/test/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +57 -0
- data/test/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +81 -0
- data/test/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +70 -0
- data/test/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +77 -0
- data/test/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
- data/test/lib/shoulda/action_controller/matchers/set_session_matcher.rb +83 -0
- data/test/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
- data/test/lib/shoulda/action_mailer.rb +10 -0
- data/test/lib/shoulda/action_mailer/assertions.rb +38 -0
- data/test/lib/shoulda/action_view.rb +10 -0
- data/test/lib/shoulda/action_view/macros.rb +56 -0
- data/test/lib/shoulda/active_record.rb +16 -0
- data/test/lib/shoulda/active_record/assertions.rb +69 -0
- data/test/lib/shoulda/active_record/helpers.rb +40 -0
- data/test/lib/shoulda/active_record/macros.rb +586 -0
- data/test/lib/shoulda/active_record/matchers.rb +42 -0
- data/test/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
- data/test/lib/shoulda/active_record/matchers/allow_value_matcher.rb +102 -0
- data/test/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
- data/test/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
- data/test/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
- data/test/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
- data/test/lib/shoulda/active_record/matchers/have_index_matcher.rb +105 -0
- data/test/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +125 -0
- data/test/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
- data/test/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
- data/test/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
- data/test/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
- data/test/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
- data/test/lib/shoulda/active_record/matchers/validation_matcher.rb +56 -0
- data/test/lib/shoulda/assertions.rb +59 -0
- data/test/lib/shoulda/autoload_macros.rb +46 -0
- data/test/lib/shoulda/context.rb +304 -0
- data/test/lib/shoulda/helpers.rb +8 -0
- data/test/lib/shoulda/macros.rb +73 -0
- data/test/lib/shoulda/private_helpers.rb +20 -0
- data/test/lib/shoulda/proc_extensions.rb +14 -0
- data/test/lib/shoulda/rails.rb +13 -0
- data/test/lib/shoulda/rspec.rb +9 -0
- data/test/lib/shoulda/tasks.rb +3 -0
- data/test/lib/shoulda/tasks/list_tests.rake +29 -0
- data/test/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
- data/test/lib/shoulda/test_unit.rb +19 -0
- data/test/lib/xmlsimple.rb +1021 -0
- data/test/loader.rb +25 -0
- data/test/unit/activity.rb +26 -0
- data/test/unit/util.rb +39 -0
- metadata +198 -0
data/README
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
NAME
|
2
|
+
gnip
|
3
|
+
|
4
|
+
SYNOPSIS
|
5
|
+
gnip (config|ping|clock_drift|encode|decode|version|publisher|activity|notification|filter) [options]+
|
6
|
+
|
7
|
+
DESCRIPTION
|
8
|
+
gnip.rb is *the* clinically proven, most effective way, to keep your ruby
|
9
|
+
codez on the pulse of the freaking interwebs. gnip.rb slings rest-fu
|
10
|
+
around like mr.t slings suckas while rocking out to deep-house and pouring
|
11
|
+
wine for the ladeez. gnip.rb brings you power and speed with a silkly
|
12
|
+
smooth mixture of equal parts restclient, nokogiri, tagz, and threadify.
|
13
|
+
sit back and let gnip.rb bring the very tastiest portions of the tubes
|
14
|
+
down onto your very own hard drive for your dining pleasure.
|
15
|
+
|
16
|
+
we have what you are looking for.
|
17
|
+
|
18
|
+
PARAMETERS
|
19
|
+
--username=[username], -U (0 ~> username)
|
20
|
+
--password=[password], -P (0 ~> password)
|
21
|
+
--scope=[scope], -S (0 ~> scope=gnip)
|
22
|
+
--name=[name], -N (0 ~> name)
|
23
|
+
--ago=[ago], -a (0 ~> integer(ago))
|
24
|
+
--thru=[thru], -t (0 ~> thru)
|
25
|
+
--bucket=[bucket], -b (0 ~> bucket)
|
26
|
+
--filter=[filter], -f (0 ~> filter)
|
27
|
+
--style=[style], -s (0 ~> style)
|
28
|
+
--force=[force] (0 ~> boolean(force))
|
29
|
+
--log=[log], -l (0 ~> log)
|
30
|
+
--input=[input], -i (0 ~> input)
|
31
|
+
--help, -h
|
32
|
+
|
33
|
+
AUTHOR
|
34
|
+
ara.t.howard@gmail.com
|
35
|
+
|
36
|
+
EXAMPLES
|
37
|
+
@quick
|
38
|
+
. sup on digg recently?
|
39
|
+
gnip notification digg --ago=30 --thru=now
|
40
|
+
|
41
|
+
. and twitter right now?
|
42
|
+
gnip notification twitter
|
43
|
+
|
44
|
+
. stalk someone on tumblr
|
45
|
+
gnip filter rule create tumblr catch-him-in-the-act actor:boyfriend
|
46
|
+
gnip activity digg --filter=catch-him-in-the-act --bucket=all
|
47
|
+
|
48
|
+
@setup
|
49
|
+
. dump the current gnip config
|
50
|
+
gnip config
|
51
|
+
|
52
|
+
. create a ~/.gnip.yml config file
|
53
|
+
gnip config generate
|
54
|
+
|
55
|
+
. ping gnip to verify your config
|
56
|
+
gnip ping
|
57
|
+
|
58
|
+
. show gnip clock shift from your local time
|
59
|
+
gnip clock_drift
|
60
|
+
|
61
|
+
@publisher
|
62
|
+
. list gnip publishers
|
63
|
+
gnip publisher list
|
64
|
+
|
65
|
+
. list publishers in the /my scope
|
66
|
+
gnip publisher list --scope=my
|
67
|
+
|
68
|
+
. create a publisher name 'publisher-name' in the /my scope with actor and keyword rules
|
69
|
+
gnip publisher create my-publisher actor keyword --scope=my
|
70
|
+
|
71
|
+
. show a publisher by name
|
72
|
+
gnip publisher show my-publisher
|
73
|
+
|
74
|
+
. delete a publisher in the /my scope
|
75
|
+
gnip publisher delete my-publisher --scope=my
|
76
|
+
|
77
|
+
|
78
|
+
@activity | @notification
|
79
|
+
. list the activity stream of a publisher
|
80
|
+
gnip notification stream digg
|
81
|
+
|
82
|
+
. list the activity of a publisher
|
83
|
+
gnip notification list digg
|
84
|
+
|
85
|
+
. list the activity of a publisher 10 minutes ago
|
86
|
+
gnip notification list digg --ago=10
|
87
|
+
|
88
|
+
. list all activity of a publisher starting 60-10 minutes (parallel requests)
|
89
|
+
gnip notification list digg --ago=60 --thru=10
|
90
|
+
|
91
|
+
. list all possible activity of a publisher
|
92
|
+
gnip notification list digg --bucket=all
|
93
|
+
|
94
|
+
. list the filtered activity of a publisher
|
95
|
+
gnip activity list digg --filter=my-filter-name --ago=60 --thru=42
|
96
|
+
|
97
|
+
@filter
|
98
|
+
. create a publisher filter for two actors
|
99
|
+
gnip filter create digg my-filter-name --full_data=true actor:mohadata actor:livefree12
|
100
|
+
|
101
|
+
. create a publisher filter from a file full of many rules (same format as command-line, one per line)
|
102
|
+
gnip filter create digg my-filter-name --input=file-full-of-rules.txt
|
103
|
+
|
104
|
+
. append rules to an existing publisher filter
|
105
|
+
gnip filter rule create digg my-filter-name actor:foobar actor:barfoo
|
106
|
+
|
107
|
+
. append rules to an existing publisher filter in bulk
|
108
|
+
gnip filter rule create digg my-filter-name --input=input
|
109
|
+
|
110
|
+
. list a specific rule for a publisher's filter
|
111
|
+
gnip filter rule list digg my-filter-name actor:livefree12
|
112
|
+
|
113
|
+
. delete a specific rule from an existing publisher filter
|
114
|
+
gnip filter rule delete digg my-filter-name actor:barfoo
|
115
|
+
|
116
|
+
. list your filters on a publisher
|
117
|
+
gnip filter list digg
|
118
|
+
|
119
|
+
@publish
|
120
|
+
. push a yml activity to a publisher
|
121
|
+
gnip activity publish my-publisher ./sample/data/activity.yml --scope=my
|
122
|
+
|
123
|
+
. scan for what you just posted (roughly)
|
124
|
+
gnip activity list my-publisher --scope=my --ago=2 --thru=now
|
125
|
+
|
126
|
+
@utility
|
127
|
+
. encode data
|
128
|
+
gnip encode 'some content'
|
129
|
+
|
130
|
+
. decode data
|
131
|
+
gnip encode 'some content' | gnip decode -
|
132
|
+
|
133
|
+
. round trip data
|
134
|
+
echo 'some content' | gnip encode - | gnip decode -
|
135
|
+
|
136
|
+
LIBRARY
|
137
|
+
see this program, samples/*, and test/**/**, for usage
|
138
|
+
|
139
|
+
URI
|
140
|
+
http://gnip.com
|
141
|
+
|
142
|
+
INSTALL
|
143
|
+
$sudo gem install gnip
|
144
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
task 'default' => 'test:all'
|
2
|
+
|
3
|
+
namespace 'test' do
|
4
|
+
desc 'run all tests'
|
5
|
+
task 'all' => %w[ unit integration ] do
|
6
|
+
end
|
7
|
+
|
8
|
+
desc 'run unit tests'
|
9
|
+
task 'unit' do
|
10
|
+
%w[
|
11
|
+
activity
|
12
|
+
].each do |basename|
|
13
|
+
test_loader "test/unit/#{ basename }.rb"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
desc 'run integration tests'
|
18
|
+
task 'integration' do
|
19
|
+
%w[
|
20
|
+
auth
|
21
|
+
publisher
|
22
|
+
].each do |basename|
|
23
|
+
test_loader "test/integration/#{ basename }.rb", :require_auth => true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
task 'test' => 'test:all' do
|
29
|
+
end
|
30
|
+
|
31
|
+
namespace 'gem' do
|
32
|
+
task 'build' do
|
33
|
+
sh 'gemspec.rb'
|
34
|
+
end
|
35
|
+
task 'release' => 'build' do
|
36
|
+
gem = Dir['gnip*.gem'].sort.last or abort('no gem!')
|
37
|
+
version = gem[%r/[\d.]+/]
|
38
|
+
command = "rubyforge login && rubyforge add_release gnip 'gnip' '#{ version }' '#{ gem }'"
|
39
|
+
sh command
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
BEGIN {
|
44
|
+
Dir.chdir(File.dirname(__FILE__))
|
45
|
+
ENV['PATH'] = [ '.', './bin/', ENV['PATH'] ].join(File::PATH_SEPARATOR)
|
46
|
+
|
47
|
+
def test_loader basename, options = {}
|
48
|
+
auth = '-r test/auth.rb ' if options[:require_auth]
|
49
|
+
command = "ruby -r test/loader.rb #{ auth }#{ basename }"
|
50
|
+
STDERR.print "\n==== TEST ====\n\n #{ command }\n\n==============\n\n"
|
51
|
+
system command or abort("#{ command } # FAILED WITH #{ $?.inspect }")
|
52
|
+
end
|
53
|
+
}
|
data/TODO
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
---
|
2
|
+
|
3
|
+
. gem release
|
4
|
+
|
5
|
+
. more sample programs
|
6
|
+
|
7
|
+
. tests for bin/gnip using yaml output
|
8
|
+
|
9
|
+
. flesh out rather minimal tests
|
10
|
+
|
11
|
+
. yank out shoulda for testing?
|
12
|
+
|
13
|
+
. unify some of the (to/from)_(hash/yaml) stuff across the lib
|
14
|
+
|
15
|
+
. abstract builder! pattern out for all Attributes
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
---
|
20
|
+
.activity
|
21
|
+
. payload compress/decompress
|
22
|
+
. publishing to publisher
|
23
|
+
. curl --data-binary @activity.xml -H 'Content-Type:application/xml' --silent --user ara.t.howard@gmail.com:password https://api-v21.gnip.com/my/publishers/pub/activity.xml
|
24
|
+
. display of payload/raw from commandline
|
25
|
+
|
26
|
+
. version
|
27
|
+
|
28
|
+
. clean up pluralization in lib
|
29
|
+
|
30
|
+
. sample program
|
31
|
+
|
32
|
+
. server callbacks
|
33
|
+
|
34
|
+
. flush out bin/gnip
|
35
|
+
|
36
|
+
. decide between tagz vs erb for xml generation
|
37
|
+
|
38
|
+
. html escape
|
39
|
+
. CGI.escapeHTML(CGI.escapeHTML('world & business'))
|
40
|
+
|
41
|
+
. filter-rules
|
42
|
+
. get
|
43
|
+
. post
|
44
|
+
. delete
|
45
|
+
. post in bulk (stdin)
|
46
|
+
|
47
|
+
. filters
|
48
|
+
. create
|
49
|
+
. list
|
50
|
+
. delete
|
51
|
+
. update/replace/put
|
52
|
+
. rule post in bulk (stdin)
|
53
|
+
|
54
|
+
. publisher
|
55
|
+
. create
|
56
|
+
. delete
|
57
|
+
. notifications
|
58
|
+
. current
|
59
|
+
. by timestamp
|
60
|
+
. ago
|
61
|
+
. extract rule types from xml
|
62
|
+
|
63
|
+
. gnip
|
64
|
+
. clock delta
|
65
|
+
|
66
|
+
. samples
|
67
|
+
|
68
|
+
. http wrapper/resource
|
69
|
+
. my vs gnip
|
70
|
+
. safe login uri
|
71
|
+
. setup test environment for unit + integration w/shoulda
|
72
|
+
. get access to docs
|
data/bin/gnip
ADDED
@@ -0,0 +1,651 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'gnip'
|
4
|
+
require 'main'
|
5
|
+
require 'pp'
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
Main {
|
9
|
+
##
|
10
|
+
description <<-__
|
11
|
+
gnip.rb is *the* clinically proven, most effective way, to keep your ruby
|
12
|
+
codez on the pulse of the freaking interwebs. gnip.rb slings rest-fu
|
13
|
+
around like mr.t slings suckas while rocking out to deep-house and pouring
|
14
|
+
wine for the ladeez. gnip.rb brings you power and speed with a silkly
|
15
|
+
smooth mixture of equal parts restclient, nokogiri, tagz, and threadify.
|
16
|
+
sit back and let gnip.rb bring the very tastiest portions of the tubes
|
17
|
+
down onto your very own hard drive for your dining pleasure.
|
18
|
+
|
19
|
+
we have what you are looking for.
|
20
|
+
__
|
21
|
+
|
22
|
+
##
|
23
|
+
examples <<-__
|
24
|
+
@quick
|
25
|
+
. sup on digg recently?
|
26
|
+
gnip notification digg --ago=30 --thru=now
|
27
|
+
|
28
|
+
. and twitter right now?
|
29
|
+
gnip notification twitter
|
30
|
+
|
31
|
+
. stalk someone on tumblr
|
32
|
+
gnip filter rule create tumblr catch-him-in-the-act actor:boyfriend
|
33
|
+
gnip activity digg --filter=catch-him-in-the-act --bucket=all
|
34
|
+
|
35
|
+
@setup
|
36
|
+
. dump the current gnip config
|
37
|
+
gnip config
|
38
|
+
|
39
|
+
. create a ~/.gnip.yml config file
|
40
|
+
gnip config generate
|
41
|
+
|
42
|
+
. ping gnip to verify your config
|
43
|
+
gnip ping
|
44
|
+
|
45
|
+
. show gnip clock shift from your local time
|
46
|
+
gnip clock_drift
|
47
|
+
|
48
|
+
@publisher
|
49
|
+
. list gnip publishers
|
50
|
+
gnip publisher list
|
51
|
+
|
52
|
+
. list publishers in the /my scope
|
53
|
+
gnip publisher list --scope=my
|
54
|
+
|
55
|
+
. create a publisher name 'publisher-name' in the /my scope with actor and keyword rules
|
56
|
+
gnip publisher create my-publisher actor keyword --scope=my
|
57
|
+
|
58
|
+
. show a publisher by name
|
59
|
+
gnip publisher show my-publisher
|
60
|
+
|
61
|
+
. delete a publisher in the /my scope
|
62
|
+
gnip publisher delete my-publisher --scope=my
|
63
|
+
|
64
|
+
|
65
|
+
@activity | @notification
|
66
|
+
. list the activity stream of a publisher
|
67
|
+
gnip notification stream digg
|
68
|
+
|
69
|
+
. list the activity of a publisher
|
70
|
+
gnip notification list digg
|
71
|
+
|
72
|
+
. list the activity of a publisher 10 minutes ago
|
73
|
+
gnip notification list digg --ago=10
|
74
|
+
|
75
|
+
. list all activity of a publisher starting 60-10 minutes (parallel requests)
|
76
|
+
gnip notification list digg --ago=60 --thru=10
|
77
|
+
|
78
|
+
. list all possible activity of a publisher
|
79
|
+
gnip notification list digg --bucket=all
|
80
|
+
|
81
|
+
. list the filtered activity of a publisher
|
82
|
+
gnip activity list digg --filter=my-filter-name --ago=60 --thru=42
|
83
|
+
|
84
|
+
@filter
|
85
|
+
. create a publisher filter for two actors
|
86
|
+
gnip filter create digg my-filter-name --full_data=true actor:mohadata actor:livefree12
|
87
|
+
|
88
|
+
. create a publisher filter from a file full of many rules (same format as command-line, one per line)
|
89
|
+
gnip filter create digg my-filter-name --input=file-full-of-rules.txt
|
90
|
+
|
91
|
+
. append rules to an existing publisher filter
|
92
|
+
gnip filter rule create digg my-filter-name actor:foobar actor:barfoo
|
93
|
+
|
94
|
+
. append rules to an existing publisher filter in bulk
|
95
|
+
gnip filter rule create digg my-filter-name --input=input
|
96
|
+
|
97
|
+
. list a specific rule for a publisher's filter
|
98
|
+
gnip filter rule list digg my-filter-name actor:livefree12
|
99
|
+
|
100
|
+
. delete a specific rule from an existing publisher filter
|
101
|
+
gnip filter rule delete digg my-filter-name actor:barfoo
|
102
|
+
|
103
|
+
. list your filters on a publisher
|
104
|
+
gnip filter list digg
|
105
|
+
|
106
|
+
@publish
|
107
|
+
. push a yml activity to a publisher
|
108
|
+
gnip activity publish my-publisher ./sample/data/activity.yml --scope=my
|
109
|
+
|
110
|
+
. scan for what you just posted (roughly)
|
111
|
+
gnip activity list my-publisher --scope=my --ago=2 --thru=now
|
112
|
+
|
113
|
+
@utility
|
114
|
+
. encode data
|
115
|
+
gnip encode 'some content'
|
116
|
+
|
117
|
+
. decode data
|
118
|
+
gnip encode 'some content' | gnip decode -
|
119
|
+
|
120
|
+
. round trip data
|
121
|
+
echo 'some content' | gnip encode - | gnip decode -
|
122
|
+
__
|
123
|
+
|
124
|
+
##
|
125
|
+
author 'ara.t.howard@gmail.com'
|
126
|
+
|
127
|
+
##
|
128
|
+
usage :LIBRARY, <<-__
|
129
|
+
see this program, samples/*, and test/**/**, for usage
|
130
|
+
__
|
131
|
+
|
132
|
+
usage :URI, <<-__
|
133
|
+
http://gnip.com
|
134
|
+
__
|
135
|
+
|
136
|
+
usage :INSTALL, <<-__
|
137
|
+
$sudo gem install gnip
|
138
|
+
__
|
139
|
+
|
140
|
+
##
|
141
|
+
option('--username', '-U'){
|
142
|
+
argument 'required'
|
143
|
+
cast{|value| Gnip.username = value}
|
144
|
+
}
|
145
|
+
|
146
|
+
option('--password', '-P'){
|
147
|
+
argument 'required'
|
148
|
+
cast{|value| Gnip.password = value}
|
149
|
+
}
|
150
|
+
|
151
|
+
option('--scope', '-S'){
|
152
|
+
argument 'required'
|
153
|
+
default 'gnip'
|
154
|
+
}
|
155
|
+
|
156
|
+
option('--name', '-N'){
|
157
|
+
argument 'required'
|
158
|
+
}
|
159
|
+
|
160
|
+
option('--ago', '-a'){
|
161
|
+
argument 'required'
|
162
|
+
cast :integer
|
163
|
+
}
|
164
|
+
|
165
|
+
option('--thru', '-t'){
|
166
|
+
argument 'required'
|
167
|
+
cast{|value| Integer(value =~ /current|now/ ? 0 : value)}
|
168
|
+
}
|
169
|
+
|
170
|
+
option('--bucket', '-b'){
|
171
|
+
argument 'required'
|
172
|
+
}
|
173
|
+
|
174
|
+
option('--filter', '-f'){
|
175
|
+
argument 'required'
|
176
|
+
}
|
177
|
+
|
178
|
+
option('--style', '-s'){
|
179
|
+
argument 'required'
|
180
|
+
}
|
181
|
+
|
182
|
+
option('--force'){
|
183
|
+
argument 'optional'
|
184
|
+
cast :boolean
|
185
|
+
}
|
186
|
+
|
187
|
+
option('--log', '-l'){
|
188
|
+
argument :optional
|
189
|
+
}
|
190
|
+
|
191
|
+
option('--input', '-i'){
|
192
|
+
argument 'required'
|
193
|
+
cast{|value| (value =~ /-/ ? STDIN.readlines : IO.readlines(value)).map{|line| line.strip}}
|
194
|
+
}
|
195
|
+
|
196
|
+
def before_run
|
197
|
+
if log = params['log'].value
|
198
|
+
log = 'stderr' if log == true
|
199
|
+
ENV['GNIP_HTTP_LOG'] = log
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
##
|
205
|
+
mode(:config) do
|
206
|
+
description 'dump out the discovered gnip config'
|
207
|
+
def run
|
208
|
+
y Gnip.config.default.to_hash
|
209
|
+
end
|
210
|
+
|
211
|
+
mode(:generate) do
|
212
|
+
description 'generate a template config file'
|
213
|
+
def run
|
214
|
+
path = Gnip.config.default.class.default_path
|
215
|
+
abort "#{ path } exists!" if test(?s, path)
|
216
|
+
open(path, 'w') do |fd|
|
217
|
+
config = {'username' => 'YOU@ROCK.COM', 'password' => 'ANGINA'}
|
218
|
+
fd.puts config.to_yaml
|
219
|
+
end
|
220
|
+
system "#{ ENV['EDITOR']||:vim } #{ path }"
|
221
|
+
puts path
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
##
|
227
|
+
mode(:ping) do
|
228
|
+
def run
|
229
|
+
y Gnip.ping
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
##
|
234
|
+
mode(:clock_drift) do
|
235
|
+
def run
|
236
|
+
force = params[:force].value
|
237
|
+
y Gnip.clock_drift(:force => force)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
##
|
242
|
+
mode(:encode) do
|
243
|
+
def run
|
244
|
+
stdin = argv.delete('-')
|
245
|
+
data = argv.join
|
246
|
+
data += STDIN.read if stdin
|
247
|
+
STDOUT.write Gnip.encode(data)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
mode(:decode) do
|
252
|
+
def run
|
253
|
+
stdin = argv.delete('-')
|
254
|
+
data = argv.join
|
255
|
+
data += STDIN.read if stdin
|
256
|
+
STDOUT.write Gnip.decode(data)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
mode(:version) do
|
261
|
+
def run
|
262
|
+
puts Gnip.version
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
##
|
267
|
+
mode(:publisher){
|
268
|
+
##
|
269
|
+
mode(:create){
|
270
|
+
description 'create a publisher yo'
|
271
|
+
def run
|
272
|
+
scope = param[:scope].value
|
273
|
+
name = param[:name].value || argv.shift || abort('no name')
|
274
|
+
rules = argv
|
275
|
+
|
276
|
+
publisher = Gnip.publisher.create(name, :scope => scope, :rules => rules)
|
277
|
+
y publisher.name
|
278
|
+
end
|
279
|
+
}
|
280
|
+
##
|
281
|
+
mode(:list){
|
282
|
+
description "list publishers"
|
283
|
+
def run
|
284
|
+
scope = param[:scope].value
|
285
|
+
list = Gnip.publisher.list(:scope => scope)
|
286
|
+
y list.map{|publisher| publisher.name}
|
287
|
+
end
|
288
|
+
}
|
289
|
+
##
|
290
|
+
mode(:delete){
|
291
|
+
description 'nuke a publisher yo'
|
292
|
+
def run
|
293
|
+
scope = param[:scope].value
|
294
|
+
name = param[:name].value || argv.shift || abort('no name')
|
295
|
+
|
296
|
+
publisher = Gnip.publisher.for(name, :scope => scope)
|
297
|
+
if publisher
|
298
|
+
publisher.delete
|
299
|
+
y publisher.name
|
300
|
+
else
|
301
|
+
exit 42
|
302
|
+
end
|
303
|
+
end
|
304
|
+
}
|
305
|
+
##
|
306
|
+
mode(:inspect){
|
307
|
+
description 'inspect a publisher'
|
308
|
+
|
309
|
+
def run
|
310
|
+
scope = param[:scope].value
|
311
|
+
name = param[:name].value || argv.shift || abort('no name')
|
312
|
+
publisher = Gnip.publisher.for(name, :scope => scope)
|
313
|
+
publisher ? pp(publisher) : exit(42)
|
314
|
+
end
|
315
|
+
}
|
316
|
+
##
|
317
|
+
mode(:show){
|
318
|
+
description 'show a publisher'
|
319
|
+
|
320
|
+
def run
|
321
|
+
scope = param[:scope].value
|
322
|
+
name = param[:name].value || argv.shift || abort('no name')
|
323
|
+
publisher = Gnip.publisher.for(name, :scope => scope)
|
324
|
+
if publisher
|
325
|
+
y publisher.name => publisher.rules.map{|rule| rule.to_s}
|
326
|
+
else
|
327
|
+
exit(42)
|
328
|
+
end
|
329
|
+
end
|
330
|
+
}
|
331
|
+
}
|
332
|
+
|
333
|
+
##
|
334
|
+
mixin(:activities){
|
335
|
+
|
336
|
+
def limited_activity_view activity
|
337
|
+
oh =
|
338
|
+
Gnip.orderedhash[
|
339
|
+
'activity_id', activity.activity_id,
|
340
|
+
'at', activity.at,
|
341
|
+
'action', activity.action,
|
342
|
+
'url', activity.url,
|
343
|
+
'sources', activity.sources,
|
344
|
+
'keywords', activity.keywords,
|
345
|
+
'places', activity.places,
|
346
|
+
'actors', activity.actors,
|
347
|
+
'destination_url', activity.destination_urls,
|
348
|
+
'tags', activity.tags,
|
349
|
+
'tos', activity.tos,
|
350
|
+
'regarding_url', activity.regarding_urls
|
351
|
+
]
|
352
|
+
end
|
353
|
+
|
354
|
+
mode(:list){
|
355
|
+
description 'access publisher activity'
|
356
|
+
def run
|
357
|
+
scope = param[:scope].value
|
358
|
+
ago = param[:ago].value
|
359
|
+
thru = param[:thru].value
|
360
|
+
bucket = param[:bucket].value
|
361
|
+
style = param[:style].value || self.class.const_get(:Style)
|
362
|
+
filter = param[:filter].value
|
363
|
+
|
364
|
+
name = param[:name].value || argv.shift || abort('no name')
|
365
|
+
|
366
|
+
publisher = Gnip.publisher.for(name, :scope => scope)
|
367
|
+
activities = publisher.activity(:filter => filter, :style => style, :ago => ago, :bucket => bucket, :thru => thru)
|
368
|
+
|
369
|
+
list = []
|
370
|
+
|
371
|
+
activities.each do |activity|
|
372
|
+
list << limited_activity_view(activity)
|
373
|
+
end
|
374
|
+
|
375
|
+
y list
|
376
|
+
end
|
377
|
+
}
|
378
|
+
##
|
379
|
+
mode(:stream){
|
380
|
+
description 'dump the activity stream listing for a publisher'
|
381
|
+
def run
|
382
|
+
scope = param[:scope].value
|
383
|
+
name = param[:name].value || argv.shift || abort('no name')
|
384
|
+
style = param[:style].value || self.class.const_get(:Style)
|
385
|
+
|
386
|
+
publisher = Gnip.publisher.for(name, :scope => scope)
|
387
|
+
if publisher
|
388
|
+
activity_stream = publisher.activity_stream(:style => style)
|
389
|
+
y :updated_at => activity_stream.updated_at.to_s, :buckets => activity_stream.buckets.to_a
|
390
|
+
else
|
391
|
+
exit 42
|
392
|
+
end
|
393
|
+
end
|
394
|
+
}
|
395
|
+
}
|
396
|
+
|
397
|
+
##
|
398
|
+
mode(:activity){
|
399
|
+
const_set :Style, 'activity'
|
400
|
+
mixin :activities
|
401
|
+
##
|
402
|
+
mode(:publish){
|
403
|
+
description 'publish activities to a publisher'
|
404
|
+
argument('name')
|
405
|
+
argument('yaml_input_file_or_stdin'){ optional true }
|
406
|
+
|
407
|
+
def run
|
408
|
+
scope = param[:scope].value
|
409
|
+
name = param[:name].value
|
410
|
+
yaml_input_file_or_stdin = params[:yaml_input_file_or_stdin]||'-'
|
411
|
+
|
412
|
+
input = yaml_input_file_or_stdin.value
|
413
|
+
|
414
|
+
obj =
|
415
|
+
if input == '-'
|
416
|
+
YAML.load(STDIN.read)
|
417
|
+
else
|
418
|
+
YAML.load(open(input){|f| f.read})
|
419
|
+
end
|
420
|
+
|
421
|
+
hashes = [obj] unless obj.is_a?(Array)
|
422
|
+
|
423
|
+
publisher = Gnip.publisher.for(name, :scope => scope)
|
424
|
+
|
425
|
+
if publisher
|
426
|
+
activities = []
|
427
|
+
|
428
|
+
hashes.each do |hash|
|
429
|
+
payload = hash['payload']
|
430
|
+
raw = (payload && payload.is_a?(Hash) && payload['raw'])
|
431
|
+
if raw =~ %r/^\s*@(.*)\s*$/
|
432
|
+
raw = $1.strip
|
433
|
+
raw = raw == '-' ? STDIN.read : IO.read(raw)
|
434
|
+
payload['raw'] = raw
|
435
|
+
end
|
436
|
+
|
437
|
+
activity = Gnip.activity.from_hash(hash)
|
438
|
+
activities << activity
|
439
|
+
end
|
440
|
+
publisher.publish(activities)
|
441
|
+
|
442
|
+
list = activities.map{|activity| limited_activity_view(activity)}
|
443
|
+
y list
|
444
|
+
else
|
445
|
+
exit 42
|
446
|
+
end
|
447
|
+
end
|
448
|
+
}
|
449
|
+
}
|
450
|
+
|
451
|
+
##
|
452
|
+
mode(:notification){
|
453
|
+
const_set :Style, 'notification'
|
454
|
+
mixin :activities
|
455
|
+
}
|
456
|
+
|
457
|
+
##
|
458
|
+
mode(:filter){
|
459
|
+
##
|
460
|
+
mode(:create){
|
461
|
+
description 'create a filter'
|
462
|
+
|
463
|
+
argument('publisher_name')
|
464
|
+
argument('filter_name')
|
465
|
+
argument('rules'){ arity -1 }
|
466
|
+
|
467
|
+
option('--full_data'){
|
468
|
+
argument 'required'
|
469
|
+
default false
|
470
|
+
cast :boolean
|
471
|
+
}
|
472
|
+
option('--post_url'){
|
473
|
+
argument 'required'
|
474
|
+
}
|
475
|
+
|
476
|
+
def run
|
477
|
+
scope = param[:scope].value
|
478
|
+
publisher_name = param[:publisher_name].value
|
479
|
+
filter_name = param[:filter_name].value
|
480
|
+
rules = param[:rules].values
|
481
|
+
post_url = param[:post_url].value
|
482
|
+
full_data = param[:full_data].value
|
483
|
+
input = param[:input].value
|
484
|
+
|
485
|
+
rules.push(*input) if input
|
486
|
+
rules.map! do |rule|
|
487
|
+
type, value = rule.strip.split(/:/, 2)
|
488
|
+
{:type => type, :value => value} if type and value
|
489
|
+
end.compact
|
490
|
+
|
491
|
+
publisher = Gnip.publisher.for(publisher_name, :scope => scope)
|
492
|
+
if publisher
|
493
|
+
filter = publisher.filter.create(filter_name, rules, :full_data => full_data, :post_url => post_url)
|
494
|
+
y filter.name
|
495
|
+
else
|
496
|
+
exit 42
|
497
|
+
end
|
498
|
+
end
|
499
|
+
}
|
500
|
+
##
|
501
|
+
mode(:list){
|
502
|
+
description 'list filters'
|
503
|
+
|
504
|
+
def run
|
505
|
+
scope = param[:scope].value
|
506
|
+
name = param[:name].value || argv.shift || abort('no name')
|
507
|
+
|
508
|
+
publisher = Gnip.publisher.for(name, :scope => scope)
|
509
|
+
if publisher
|
510
|
+
filters = publisher.filter.list
|
511
|
+
y filters.map{|filter| filter.name}
|
512
|
+
else
|
513
|
+
exit 42
|
514
|
+
end
|
515
|
+
end
|
516
|
+
}
|
517
|
+
##
|
518
|
+
mode(:inspect){
|
519
|
+
description 'inspect a filter'
|
520
|
+
|
521
|
+
argument('publisher_name')
|
522
|
+
argument('filter_name')
|
523
|
+
|
524
|
+
def run
|
525
|
+
scope = param[:scope].value
|
526
|
+
publisher_name = param[:publisher_name].value
|
527
|
+
filter_name = param[:filter_name].value
|
528
|
+
|
529
|
+
publisher = Gnip.publisher.for(publisher_name, :scope => scope)
|
530
|
+
if publisher
|
531
|
+
filter = publisher.filter.for(filter_name)
|
532
|
+
filter.publisher = nil rescue nil # just prettier output
|
533
|
+
pp filter
|
534
|
+
else
|
535
|
+
exit 42
|
536
|
+
end
|
537
|
+
end
|
538
|
+
}
|
539
|
+
##
|
540
|
+
mode(:delete){
|
541
|
+
description 'delete a filter'
|
542
|
+
|
543
|
+
argument('publisher_name')
|
544
|
+
argument('filter_name')
|
545
|
+
|
546
|
+
def run
|
547
|
+
scope = param[:scope].value
|
548
|
+
publisher_name = param[:publisher_name].value
|
549
|
+
filter_name = param[:filter_name].value
|
550
|
+
|
551
|
+
publisher = Gnip.publisher.for(publisher_name, :scope => scope)
|
552
|
+
if publisher
|
553
|
+
filter = publisher.filter.for(filter_name)
|
554
|
+
filter.delete
|
555
|
+
y filter.name
|
556
|
+
else
|
557
|
+
exit 42
|
558
|
+
end
|
559
|
+
end
|
560
|
+
}
|
561
|
+
|
562
|
+
##
|
563
|
+
mode(:rule){
|
564
|
+
mode(:list){
|
565
|
+
description 'list the rules for a filter'
|
566
|
+
|
567
|
+
argument('publisher_name')
|
568
|
+
argument('filter_name')
|
569
|
+
argument('rule')
|
570
|
+
|
571
|
+
|
572
|
+
def run
|
573
|
+
scope = param[:scope].value
|
574
|
+
publisher_name = param[:publisher_name].value
|
575
|
+
filter_name = param[:filter_name].value
|
576
|
+
rule = param[:rule].value
|
577
|
+
|
578
|
+
type, value = rule.split(/:/, 2)
|
579
|
+
|
580
|
+
publisher = Gnip.publisher.for(publisher_name, :scope => scope)
|
581
|
+
if publisher
|
582
|
+
filter = publisher.filter.for(filter_name)
|
583
|
+
y filter.rule.list(:type => type, :value => value).inspect
|
584
|
+
else
|
585
|
+
exit 42
|
586
|
+
end
|
587
|
+
end
|
588
|
+
}
|
589
|
+
|
590
|
+
mode(:create){
|
591
|
+
description 'append rules to a filter'
|
592
|
+
|
593
|
+
argument('publisher_name')
|
594
|
+
argument('filter_name')
|
595
|
+
argument('rules'){ arity -1 }
|
596
|
+
|
597
|
+
def run
|
598
|
+
scope = param[:scope].value
|
599
|
+
publisher_name = param[:publisher_name].value
|
600
|
+
filter_name = param[:filter_name].value
|
601
|
+
rules = param[:rules].values
|
602
|
+
input = param[:input].value
|
603
|
+
|
604
|
+
rules.push(*input) if input
|
605
|
+
|
606
|
+
publisher = Gnip.publisher.for(publisher_name, :scope => scope)
|
607
|
+
if publisher
|
608
|
+
filter = publisher.filter.for(filter_name)
|
609
|
+
rules = filter.rule.create(*rules)
|
610
|
+
y rules.map{|rule| rule.to_s}
|
611
|
+
else
|
612
|
+
exit 42
|
613
|
+
end
|
614
|
+
end
|
615
|
+
}
|
616
|
+
|
617
|
+
mode(:delete){
|
618
|
+
description 'delete a filter rule'
|
619
|
+
|
620
|
+
argument('publisher_name')
|
621
|
+
argument('filter_name')
|
622
|
+
argument('rule')
|
623
|
+
|
624
|
+
|
625
|
+
def run
|
626
|
+
scope = param[:scope].value
|
627
|
+
publisher_name = param[:publisher_name].value
|
628
|
+
filter_name = param[:filter_name].value
|
629
|
+
rule = param[:rule].value
|
630
|
+
|
631
|
+
type, value = rule.split(/:/, 2)
|
632
|
+
|
633
|
+
publisher = Gnip.publisher.for(publisher_name, :scope => scope)
|
634
|
+
if publisher
|
635
|
+
filter = publisher.filter.for(filter_name)
|
636
|
+
rule = filter.rule.list(:type => type, :value => value)
|
637
|
+
rule.delete
|
638
|
+
y rule
|
639
|
+
else
|
640
|
+
exit 42
|
641
|
+
end
|
642
|
+
end
|
643
|
+
}
|
644
|
+
}
|
645
|
+
}
|
646
|
+
|
647
|
+
|
648
|
+
def run
|
649
|
+
abort usage.to_s
|
650
|
+
end
|
651
|
+
}
|