rest-graph 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.gitignore +6 -0
  2. data/CHANGES +44 -0
  3. data/CONTRIBUTORS +1 -0
  4. data/README +221 -191
  5. data/README.md +367 -0
  6. data/Rakefile +28 -43
  7. data/TODO +1 -0
  8. data/doc/ToC.md +10 -0
  9. data/doc/dependency.md +78 -0
  10. data/doc/design.md +206 -0
  11. data/doc/rails.md +12 -0
  12. data/doc/test.md +46 -0
  13. data/doc/tutorial.md +142 -0
  14. data/example/rails2/Gemfile +13 -0
  15. data/example/rails2/app/controllers/application_controller.rb +10 -8
  16. data/example/rails2/app/views/application/helper.html.erb +1 -0
  17. data/example/rails2/config/boot.rb +16 -0
  18. data/example/rails2/config/environment.rb +3 -30
  19. data/example/rails2/config/preinitializer.rb +23 -0
  20. data/example/rails2/test/functional/application_controller_test.rb +72 -32
  21. data/example/rails2/test/test_helper.rb +10 -6
  22. data/example/rails3/Gemfile +13 -0
  23. data/example/rails3/Rakefile +7 -0
  24. data/example/rails3/app/controllers/application_controller.rb +118 -0
  25. data/example/rails3/app/views/application/helper.html.erb +1 -0
  26. data/example/rails3/config.ru +4 -0
  27. data/example/rails3/config/application.rb +23 -0
  28. data/example/rails3/config/environment.rb +5 -0
  29. data/example/rails3/config/environments/development.rb +26 -0
  30. data/example/rails3/config/environments/production.rb +49 -0
  31. data/example/rails3/config/environments/test.rb +30 -0
  32. data/example/rails3/config/initializers/secret_token.rb +7 -0
  33. data/example/rails3/config/initializers/session_store.rb +8 -0
  34. data/example/rails3/config/rest-graph.yaml +11 -0
  35. data/example/rails3/config/routes.rb +5 -0
  36. data/example/rails3/test/functional/application_controller_test.rb +183 -0
  37. data/example/rails3/test/test_helper.rb +18 -0
  38. data/example/rails3/test/unit/rails_util_test.rb +44 -0
  39. data/init.rb +1 -1
  40. data/lib/rest-graph.rb +5 -571
  41. data/lib/rest-graph/auto_load.rb +3 -3
  42. data/lib/rest-graph/autoload.rb +3 -3
  43. data/lib/rest-graph/config_util.rb +43 -0
  44. data/lib/rest-graph/core.rb +608 -0
  45. data/lib/rest-graph/facebook_util.rb +74 -0
  46. data/lib/rest-graph/rails_util.rb +85 -37
  47. data/lib/rest-graph/test_util.rb +18 -2
  48. data/lib/rest-graph/version.rb +2 -2
  49. data/rest-graph.gemspec +42 -47
  50. data/task/gemgem.rb +155 -0
  51. data/test/test_api.rb +16 -0
  52. data/test/test_cache.rb +28 -8
  53. data/test/test_error.rb +9 -0
  54. data/test/test_facebook.rb +36 -0
  55. data/test/test_load_config.rb +16 -14
  56. data/test/test_misc.rb +4 -4
  57. data/test/test_parse.rb +10 -4
  58. metadata +146 -186
  59. data/Gemfile.lock +0 -45
  60. data/README.rdoc +0 -337
  61. data/example/rails2/script/console +0 -3
  62. data/example/rails2/script/server +0 -3
  63. data/lib/rest-graph/load_config.rb +0 -41
@@ -0,0 +1,74 @@
1
+
2
+ require 'rest-graph/core'
3
+
4
+ module RestGraph::FacebookUtil
5
+ PERMISSIONS = %w[
6
+ publish_stream
7
+ create_event
8
+ rsvp_event
9
+ sms
10
+ offline_access
11
+ publish_checkins
12
+
13
+ user_about_me friends_about_me
14
+ user_activities friends_activities
15
+ user_birthday friends_birthday
16
+ user_education_history friends_education_history
17
+ user_events friends_events
18
+ user_groups friends_groups
19
+ user_hometown friends_hometown
20
+ user_interests friends_interests
21
+ user_likes friends_likes
22
+ user_location friends_location
23
+ user_notes friends_notes
24
+ user_online_presence friends_online_presence
25
+ user_photo_video_tags friends_photo_video_tags
26
+ user_photos friends_photos
27
+ user_relationships friends_relationships
28
+ user_relationship_details friends_relationship_details
29
+ user_religion_politics friends_religion_politics
30
+ user_status friends_status
31
+ user_videos friends_videos
32
+ user_website friends_website
33
+ user_work_history friends_work_history
34
+ email
35
+ read_friendlists manage_friendlists
36
+ read_insights
37
+ read_mailbox
38
+ read_requests
39
+ read_stream
40
+ xmpp_login
41
+ ads_management
42
+ user_checkins friends_checkins
43
+
44
+ manage_pages
45
+ ]
46
+
47
+ USER_PERMISSIONS = PERMISSIONS.reject{|perm| perm.start_with?('friends_')}
48
+
49
+ def fix_fql_multi result
50
+ result.inject({}){ |r, i| r[i['name']] = i['fql_result_set']; r }
51
+ end
52
+
53
+ def fix_permissions result
54
+ # Hash[] is for ruby 1.8.7
55
+ result.first && Hash[result.first.select{ |k, v| v == 1 }].keys
56
+ end
57
+
58
+ def permissions uid, selected_permissions=PERMISSIONS
59
+ fix_permissions(
60
+ fql(permissions_fql(uid, selected_permissions), {}, :secret => true))
61
+ end
62
+
63
+ def user_permissions uid
64
+ permissions(uid, USER_PERMISSIONS)
65
+ end
66
+
67
+ def permissions_fql uid, selected_permissions=PERMISSIONS
68
+ sanitized_uid = uid.to_s.tr("'", '')
69
+ selected = selected_permissions.join(',')
70
+ "SELECT #{selected} FROM permissions where uid = '#{sanitized_uid}'"
71
+ end
72
+ end
73
+
74
+ RestGraph.send(:include, RestGraph::FacebookUtil)
@@ -1,5 +1,24 @@
1
1
 
2
- require 'rest-graph'
2
+ require 'cgi'
3
+ require 'uri'
4
+
5
+ require 'rest-graph/core'
6
+
7
+ if Rails::VERSION::MAJOR >= 3
8
+ class RestGraph
9
+ class Railtie < Rails::Railtie
10
+ initializer 'rest-graph' do |app|
11
+ RestGraph::RailsUtil.init(app)
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ # this cannot be put here because of load order,
18
+ # so put in the bottom of this file to load up for rails2.
19
+ # if Rails::VERSION::MAJOR == 2
20
+ # ::RestGraph::RailsUtil.init(Rails)
21
+ # end
3
22
 
4
23
  class RestGraph
5
24
  module DefaultAttributes
@@ -16,30 +35,47 @@ class RestGraph
16
35
  end
17
36
 
18
37
  module RailsCache
19
- def [] key ; read(key) ; end
20
- def []= key, value; write(key, value); end
38
+ def [] key ; read(key) ; end
39
+ def []= key, value; write(key, value) ; end
40
+ def store key, value,
41
+ options={}; write(key, value, options); end
21
42
  end
22
43
  end
23
44
 
24
- ::ActiveSupport::Cache::Store.send(:include, ::RestGraph::RailsCache)
25
-
26
45
  module RestGraph::RailsUtil
46
+ def self.init app=Rails
47
+ ActiveSupport::Cache::Store.send(:include, RestGraph::RailsCache)
48
+ RestGraph::ConfigUtil.load_config_for_rails(app)
49
+ end
50
+
27
51
  module Helper
28
52
  def rest_graph
29
- controller.rest_graph
53
+ controller.send(:rest_graph)
30
54
  end
31
55
  end
32
56
 
33
57
  def self.included controller
34
- controller.rescue_from(::RestGraph::Error::AccessToken,
58
+ # skip if included already, any better way to detect this?
59
+ return if controller.respond_to?(:rest_graph, true)
60
+
61
+ controller.rescue_from(RestGraph::Error::AccessToken,
35
62
  :with => :rest_graph_on_error)
36
- controller.helper(::RestGraph::RailsUtil::Helper)
63
+ controller.helper(RestGraph::RailsUtil::Helper)
64
+ controller.instance_methods.select{ |method|
65
+ method.to_s =~ /^rest_graph/
66
+ }.each{ |method| controller.send(:protected, method) }
37
67
  end
38
68
 
39
69
  def rest_graph_setup options={}
40
70
  rest_graph_options_ctl.merge!(rest_graph_extract_options(options, :reject))
41
71
  rest_graph_options_new.merge!(rest_graph_extract_options(options, :select))
42
72
 
73
+ # we'll need to reinitialize rest_graph with the new options,
74
+ # otherwise if you're calling rest_graph before rest_graph_setup,
75
+ # you'll end up with default options without the ones you've passed
76
+ # into rest_graph_setup.
77
+ rest_graph.send(:initialize, rest_graph_options_new)
78
+
43
79
  rest_graph_check_params_signed_request # canvas
44
80
  rest_graph_check_params_session # i think it would be deprecated
45
81
  rest_graph_check_cookie # for js sdk (canvas or not)
@@ -89,37 +125,46 @@ module RestGraph::RailsUtil
89
125
 
90
126
  # override this if you want the simple redirect_to
91
127
  def rest_graph_authorize_redirect
92
- if !rest_graph_oget(:iframe)
128
+ unless rest_graph_in_canvas?
93
129
  redirect_to @rest_graph_authorize_url
94
130
  else
95
- # for rails 3
96
- @rest_graph_safe_url = if ''.respond_to?(:html_safe)
97
- @rest_graph_authorize_url.html_safe
98
- else
99
- @rest_graph_authorize_url
100
- end
101
-
102
- render :inline => <<-HTML
103
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
104
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
105
- <html>
106
- <head>
107
- <script type="text/javascript">
108
- window.top.location.href = '<%= @rest_graph_safe_url %>'
109
- </script>
110
- <noscript>
111
- <meta http-equiv="refresh" content="0;url=<%= h @rest_graph_authorize_url %>" />
112
- <meta http-equiv="window-target" content="_top" />
113
- </noscript>
114
- </head>
115
- <body>
116
- <div>Please <a href="<%= h @rest_graph_authorize_url %>" target="_top">authorize</a> if this page is not automatically redirected.</div>
117
- </body>
118
- </html>
119
- HTML
131
+ rest_graph_js_redirect(@rest_graph_authorize_url,
132
+ rest_graph_authorize_body)
120
133
  end
121
134
  end
122
135
 
136
+ def rest_graph_js_redirect redirect_url, body=''
137
+ render :inline => <<-HTML
138
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
139
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
140
+ <html>
141
+ <head>
142
+ <script type="text/javascript">
143
+ window.top.location.href = '#{redirect_url}'
144
+ </script>
145
+ <noscript>
146
+ <meta http-equiv="refresh" content="0;url=#{
147
+ CGI.escapeHTML(redirect_url)}"/>
148
+ <meta http-equiv="window-target" content="_top"/>
149
+ </noscript>
150
+ </head>
151
+ <body>
152
+ #{body}
153
+ </bodt>
154
+ </html>
155
+ HTML
156
+ end
157
+
158
+ def rest_graph_authorize_body redirect_url=@rest_graph_authorize_url
159
+ <<-HTML
160
+ <div>
161
+ Please
162
+ <a href="#{CGI.escapeHTML(redirect_url)}" target="_top">authorize</a>
163
+ if this page is not automatically redirected.
164
+ </div>
165
+ HTML
166
+ end
167
+
123
168
  module_function
124
169
 
125
170
  # ==================== begin options utility =======================
@@ -301,9 +346,12 @@ module RestGraph::RailsUtil
301
346
  end
302
347
 
303
348
  def rest_graph_extract_options options, method
304
- result = options.send(method){ |(k, v)| RestGraph::Attributes.member?(k) }
305
- return result if result.kind_of?(Hash) # RUBY_VERSION >= 1.9.2
306
- result.inject({}){ |r, (k, v)| r[k] = v; r }
349
+ # Hash[] is for ruby 1.8.7
350
+ Hash[options.send(method){ |(k, v)| RestGraph::Attributes.member?(k) }]
307
351
  end
308
352
  # ==================== end misc ================================
309
353
  end
354
+
355
+ if Rails::VERSION::MAJOR == 2
356
+ RestGraph::RailsUtil.init(Rails)
357
+ end
@@ -1,7 +1,9 @@
1
1
 
2
- require 'rest-graph'
2
+ require 'rest-graph/core'
3
3
  require 'rr'
4
4
 
5
+ require 'uri'
6
+
5
7
  module RestGraph::TestUtil
6
8
  extend RR::Adapters::RRMethods
7
9
 
@@ -14,7 +16,21 @@ module RestGraph::TestUtil
14
16
 
15
17
  stub(rg).fetch{ |meth, uri, payload|
16
18
  history << [meth, uri, payload]
17
- RestGraph.json_encode(default_response)
19
+ http = 'https?://[\w\d]+(\.[\w\d]+)+/'
20
+ response = case uri
21
+ when %r{#{http}method/fql.multiquery}
22
+ RestGraph.json_decode(
23
+ Rack::Utils.parse_query(
24
+ URI.parse(uri).query)['queries']).keys.map{ |q|
25
+ {'name' => q,
26
+ 'fql_result_set' => [default_response]}
27
+ }
28
+ when %r{#{http}method/\w+\.\w+}
29
+ [default_response]
30
+ else
31
+ default_response
32
+ end
33
+ RestGraph.json_encode(response)
18
34
  }
19
35
  }
20
36
  self
@@ -1,4 +1,4 @@
1
1
 
2
- require 'rest-graph'
2
+ require 'rest-graph/core'
3
3
 
4
- RestGraph::VERSION = '1.7.0'
4
+ RestGraph::VERSION = '1.8.0'
data/rest-graph.gemspec CHANGED
@@ -2,63 +2,58 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{rest-graph}
5
- s.version = "1.7.0"
5
+ s.version = "1.8.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Cardinal Blue", "Lin Jen-Shin (aka godfat 真常)"]
9
- s.date = %q{2010-12-30}
10
- s.description = %q{A super simple Facebook Open Graph API client}
11
- s.email = %q{dev (XD) cardinalblue.com}
12
- s.extra_rdoc_files = ["CHANGES", "CONTRIBUTORS", "Gemfile", "Gemfile.lock", "LICENSE", "README", "TODO", "rest-graph.gemspec"]
13
- s.files = ["CHANGES", "CONTRIBUTORS", "Gemfile", "Gemfile.lock", "LICENSE", "README", "README.rdoc", "Rakefile", "TODO", "example/multi/config.ru", "example/multi/rainbows.rb", "example/rails2/README", "example/rails2/Rakefile", "example/rails2/app/controllers/application_controller.rb", "example/rails2/config/boot.rb", "example/rails2/config/environment.rb", "example/rails2/config/environments/development.rb", "example/rails2/config/environments/production.rb", "example/rails2/config/environments/test.rb", "example/rails2/config/initializers/cookie_verification_secret.rb", "example/rails2/config/initializers/new_rails_defaults.rb", "example/rails2/config/initializers/session_store.rb", "example/rails2/config/rest-graph.yaml", "example/rails2/config/routes.rb", "example/rails2/log", "example/rails2/script/console", "example/rails2/script/server", "example/rails2/test/functional/application_controller_test.rb", "example/rails2/test/test_helper.rb", "example/rails2/test/unit/rails_util_test.rb", "init.rb", "lib/rest-graph.rb", "lib/rest-graph/auto_load.rb", "lib/rest-graph/autoload.rb", "lib/rest-graph/load_config.rb", "lib/rest-graph/rails_util.rb", "lib/rest-graph/test_util.rb", "lib/rest-graph/version.rb", "rest-graph.gemspec", "test/common.rb", "test/config/rest-graph.yaml", "test/test_api.rb", "test/test_cache.rb", "test/test_default.rb", "test/test_error.rb", "test/test_handler.rb", "test/test_load_config.rb", "test/test_misc.rb", "test/test_multi.rb", "test/test_oauth.rb", "test/test_old.rb", "test/test_page.rb", "test/test_parse.rb", "test/test_rest-graph.rb", "test/test_serialize.rb", "test/test_test_util.rb", "test/test_timeout.rb"]
14
- s.homepage = %q{http://github.com/cardinalblue/rest-graph}
15
- s.rdoc_options = ["--main", "README.rdoc"]
8
+ s.authors = ["Cardinal Blue", "Lin Jen-Shin (godfat)"]
9
+ s.date = %q{2011-03-08}
10
+ s.description = %q{A lightweight Facebook Graph API client}
11
+ s.email = ["dev (XD) cardinalblue.com"]
12
+ s.extra_rdoc_files = ["CHANGES", "CONTRIBUTORS", "LICENSE", "TODO"]
13
+ s.files = [".gitignore", "CHANGES", "CONTRIBUTORS", "Gemfile", "LICENSE", "README", "README.md", "Rakefile", "TODO", "doc/ToC.md", "doc/dependency.md", "doc/design.md", "doc/rails.md", "doc/test.md", "doc/tutorial.md", "example/multi/config.ru", "example/multi/rainbows.rb", "example/rails2/Gemfile", "example/rails2/Gemfile.lock", "example/rails2/README", "example/rails2/Rakefile", "example/rails2/app/controllers/application_controller.rb", "example/rails2/app/views/application/helper.html.erb", "example/rails2/config/boot.rb", "example/rails2/config/environment.rb", "example/rails2/config/environments/development.rb", "example/rails2/config/environments/production.rb", "example/rails2/config/environments/test.rb", "example/rails2/config/initializers/cookie_verification_secret.rb", "example/rails2/config/initializers/new_rails_defaults.rb", "example/rails2/config/initializers/session_store.rb", "example/rails2/config/preinitializer.rb", "example/rails2/config/rest-graph.yaml", "example/rails2/config/routes.rb", "example/rails2/log", "example/rails2/test/functional/application_controller_test.rb", "example/rails2/test/test_helper.rb", "example/rails2/test/unit/rails_util_test.rb", "example/rails3/Gemfile", "example/rails3/Gemfile.lock", "example/rails3/Rakefile", "example/rails3/app/controllers/application_controller.rb", "example/rails3/app/views/application/helper.html.erb", "example/rails3/config.ru", "example/rails3/config/application.rb", "example/rails3/config/environment.rb", "example/rails3/config/environments/development.rb", "example/rails3/config/environments/production.rb", "example/rails3/config/environments/test.rb", "example/rails3/config/initializers/secret_token.rb", "example/rails3/config/initializers/session_store.rb", "example/rails3/config/rest-graph.yaml", "example/rails3/config/routes.rb", "example/rails3/test/functional/application_controller_test.rb", "example/rails3/test/test_helper.rb", "example/rails3/test/unit/rails_util_test.rb", "init.rb", "lib/rest-graph.rb", "lib/rest-graph/auto_load.rb", "lib/rest-graph/autoload.rb", "lib/rest-graph/config_util.rb", "lib/rest-graph/core.rb", "lib/rest-graph/facebook_util.rb", "lib/rest-graph/rails_util.rb", "lib/rest-graph/test_util.rb", "lib/rest-graph/version.rb", "rest-graph.gemspec", "task/gemgem.rb", "test/common.rb", "test/config/rest-graph.yaml", "test/test_api.rb", "test/test_cache.rb", "test/test_default.rb", "test/test_error.rb", "test/test_facebook.rb", "test/test_handler.rb", "test/test_load_config.rb", "test/test_misc.rb", "test/test_multi.rb", "test/test_oauth.rb", "test/test_old.rb", "test/test_page.rb", "test/test_parse.rb", "test/test_rest-graph.rb", "test/test_serialize.rb", "test/test_test_util.rb", "test/test_timeout.rb"]
14
+ s.homepage = %q{http://github.com/godfat/}
15
+ s.rdoc_options = ["--main", "README"]
16
16
  s.require_paths = ["lib"]
17
- s.rubyforge_project = %q{rest-graph}
18
- s.rubygems_version = %q{1.3.7}
19
- s.summary = %q{A super simple Facebook Open Graph API client}
20
- s.test_files = ["test/test_api.rb", "test/test_cache.rb", "test/test_default.rb", "test/test_error.rb", "test/test_handler.rb", "test/test_load_config.rb", "test/test_misc.rb", "test/test_multi.rb", "test/test_oauth.rb", "test/test_old.rb", "test/test_page.rb", "test/test_parse.rb", "test/test_rest-graph.rb", "test/test_serialize.rb", "test/test_test_util.rb", "test/test_timeout.rb"]
17
+ s.rubygems_version = %q{1.6.1}
18
+ s.summary = %q{A lightweight Facebook Graph API client}
19
+ s.test_files = ["test/test_api.rb", "test/test_cache.rb", "test/test_default.rb", "test/test_error.rb", "test/test_facebook.rb", "test/test_handler.rb", "test/test_load_config.rb", "test/test_misc.rb", "test/test_multi.rb", "test/test_oauth.rb", "test/test_old.rb", "test/test_page.rb", "test/test_parse.rb", "test/test_rest-graph.rb", "test/test_serialize.rb", "test/test_test_util.rb", "test/test_timeout.rb"]
21
20
 
22
21
  if s.respond_to? :specification_version then
23
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
22
  s.specification_version = 3
25
23
 
26
24
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
27
- s.add_development_dependency(%q<rest-client>, [">= 1.6.1"])
28
- s.add_development_dependency(%q<em-http-request>, [">= 0.2.15"])
29
- s.add_development_dependency(%q<rack>, [">= 1.2.1"])
30
- s.add_development_dependency(%q<yajl-ruby>, [">= 0.7.8"])
31
- s.add_development_dependency(%q<json>, [">= 1.4.6"])
32
- s.add_development_dependency(%q<json_pure>, [">= 1.4.6"])
33
- s.add_development_dependency(%q<ruby-hmac>, [">= 0.4.0"])
34
- s.add_development_dependency(%q<rr>, [">= 1.0.2"])
35
- s.add_development_dependency(%q<webmock>, [">= 1.6.1"])
36
- s.add_development_dependency(%q<bacon>, [">= 1.1.0"])
37
- s.add_development_dependency(%q<bones>, [">= 3.5.4"])
25
+ s.add_development_dependency(%q<rest-client>, [">= 0"])
26
+ s.add_development_dependency(%q<em-http-request>, [">= 0"])
27
+ s.add_development_dependency(%q<rack>, [">= 0"])
28
+ s.add_development_dependency(%q<yajl-ruby>, [">= 0"])
29
+ s.add_development_dependency(%q<json>, [">= 0"])
30
+ s.add_development_dependency(%q<json_pure>, [">= 0"])
31
+ s.add_development_dependency(%q<ruby-hmac>, [">= 0"])
32
+ s.add_development_dependency(%q<webmock>, [">= 0"])
33
+ s.add_development_dependency(%q<bacon>, [">= 0"])
34
+ s.add_development_dependency(%q<rr>, [">= 0"])
38
35
  else
39
- s.add_dependency(%q<rest-client>, [">= 1.6.1"])
40
- s.add_dependency(%q<em-http-request>, [">= 0.2.15"])
41
- s.add_dependency(%q<rack>, [">= 1.2.1"])
42
- s.add_dependency(%q<yajl-ruby>, [">= 0.7.8"])
43
- s.add_dependency(%q<json>, [">= 1.4.6"])
44
- s.add_dependency(%q<json_pure>, [">= 1.4.6"])
45
- s.add_dependency(%q<ruby-hmac>, [">= 0.4.0"])
46
- s.add_dependency(%q<rr>, [">= 1.0.2"])
47
- s.add_dependency(%q<webmock>, [">= 1.6.1"])
48
- s.add_dependency(%q<bacon>, [">= 1.1.0"])
49
- s.add_dependency(%q<bones>, [">= 3.5.4"])
36
+ s.add_dependency(%q<rest-client>, [">= 0"])
37
+ s.add_dependency(%q<em-http-request>, [">= 0"])
38
+ s.add_dependency(%q<rack>, [">= 0"])
39
+ s.add_dependency(%q<yajl-ruby>, [">= 0"])
40
+ s.add_dependency(%q<json>, [">= 0"])
41
+ s.add_dependency(%q<json_pure>, [">= 0"])
42
+ s.add_dependency(%q<ruby-hmac>, [">= 0"])
43
+ s.add_dependency(%q<webmock>, [">= 0"])
44
+ s.add_dependency(%q<bacon>, [">= 0"])
45
+ s.add_dependency(%q<rr>, [">= 0"])
50
46
  end
51
47
  else
52
- s.add_dependency(%q<rest-client>, [">= 1.6.1"])
53
- s.add_dependency(%q<em-http-request>, [">= 0.2.15"])
54
- s.add_dependency(%q<rack>, [">= 1.2.1"])
55
- s.add_dependency(%q<yajl-ruby>, [">= 0.7.8"])
56
- s.add_dependency(%q<json>, [">= 1.4.6"])
57
- s.add_dependency(%q<json_pure>, [">= 1.4.6"])
58
- s.add_dependency(%q<ruby-hmac>, [">= 0.4.0"])
59
- s.add_dependency(%q<rr>, [">= 1.0.2"])
60
- s.add_dependency(%q<webmock>, [">= 1.6.1"])
61
- s.add_dependency(%q<bacon>, [">= 1.1.0"])
62
- s.add_dependency(%q<bones>, [">= 3.5.4"])
48
+ s.add_dependency(%q<rest-client>, [">= 0"])
49
+ s.add_dependency(%q<em-http-request>, [">= 0"])
50
+ s.add_dependency(%q<rack>, [">= 0"])
51
+ s.add_dependency(%q<yajl-ruby>, [">= 0"])
52
+ s.add_dependency(%q<json>, [">= 0"])
53
+ s.add_dependency(%q<json_pure>, [">= 0"])
54
+ s.add_dependency(%q<ruby-hmac>, [">= 0"])
55
+ s.add_dependency(%q<webmock>, [">= 0"])
56
+ s.add_dependency(%q<bacon>, [">= 0"])
57
+ s.add_dependency(%q<rr>, [">= 0"])
63
58
  end
64
59
  end
data/task/gemgem.rb ADDED
@@ -0,0 +1,155 @@
1
+
2
+ require 'pathname'
3
+
4
+ module Gemgem
5
+ class << self
6
+ attr_accessor :dir, :spec
7
+ end
8
+
9
+ module_function
10
+ def create
11
+ yield(spec = Gem::Specification.new{ |s|
12
+ s.authors = ['Lin Jen-Shin (godfat)']
13
+ s.email = ['godfat (XD) godfat.org']
14
+ s.homepage = "http://github.com/godfat/#{s.name}"
15
+
16
+ s.summary = File.read("#{Gemgem.dir}/README").
17
+ match(/DESCRIPTION:\n\n(.+?)\n\n/m)[1]
18
+ s.description = s.summary
19
+
20
+ s.extra_rdoc_files = %w[CHANGES CONTRIBUTORS LICENSE TODO]
21
+ s.rdoc_options = %w[--main README]
22
+ s.rubygems_version = Gem::VERSION
23
+ s.date = Time.now.strftime('%Y-%m-%d')
24
+ s.files = gem_files
25
+ s.test_files = gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
26
+ s.require_paths = %w[lib]
27
+ })
28
+ spec
29
+ end
30
+
31
+ def gem_tag
32
+ "#{spec.name}-#{spec.version}"
33
+ end
34
+
35
+ def write
36
+ File.open("#{dir}/#{spec.name}.gemspec", 'w'){ |f| f << spec.to_ruby }
37
+ end
38
+
39
+ def all_files
40
+ @all_files ||= find_files(Pathname.new(dir)).map{ |file|
41
+ if file.to_s =~ %r{\.git/}
42
+ nil
43
+ else
44
+ file.to_s
45
+ end
46
+ }.compact.sort
47
+ end
48
+
49
+ def gem_files
50
+ @gem_files ||= all_files - ignored_files
51
+ end
52
+
53
+ def ignored_files
54
+ @ignored_file ||= all_files.select{ |path| ignore_patterns.find{ |ignore|
55
+ path =~ ignore && !git_files.include?(path)}}
56
+ end
57
+
58
+ def git_files
59
+ @git_files ||= if File.exist?("#{dir}/.git")
60
+ `git ls-files`.split("\n")
61
+ else
62
+ []
63
+ end
64
+ end
65
+
66
+ # protected
67
+ def find_files path
68
+ path.children.select(&:file?).map{|file| file.to_s[(dir.size+1)..-1]} +
69
+ path.children.select(&:directory?).map{|dir| find_files(dir)}.flatten
70
+ end
71
+
72
+ def ignore_patterns
73
+ @ignore_files ||= expand_patterns(
74
+ File.read("#{dir}/.gitignore").split("\n").reject{ |pattern|
75
+ pattern.strip == ''
76
+ }).map{ |pattern| %r{^([^/]+/)*?#{Regexp.escape(pattern)}(/[^/]+)*?$} }
77
+ end
78
+
79
+ def expand_patterns pathes
80
+ pathes.map{ |path|
81
+ if path !~ /\*/
82
+ path
83
+ else
84
+ expand_patterns(
85
+ Dir[path] +
86
+ Pathname.new(File.dirname(path)).children.select(&:directory?).
87
+ map{ |prefix| "#{prefix}/#{File.basename(path)}" })
88
+ end
89
+ }.flatten
90
+ end
91
+ end
92
+
93
+ namespace :gem do
94
+
95
+ desc 'Install gem'
96
+ task :install => [:build] do
97
+ sh("#{Gem.ruby} -S gem install pkg/#{Gemgem.gem_tag}")
98
+ end
99
+
100
+ desc 'Build gem'
101
+ task :build => [:spec] do
102
+ sh("#{Gem.ruby} -S gem build #{Gemgem.spec.name}.gemspec")
103
+ sh("mkdir -p pkg")
104
+ sh("mv #{Gemgem.gem_tag}.gem pkg/")
105
+ end
106
+
107
+ desc 'Release gem'
108
+ task :release => [:spec, :check, :build] do
109
+ sh("git tag #{Gemgem.gem_tag}")
110
+ sh("git push")
111
+ sh("git push --tags")
112
+ sh("#{Gem.ruby} -S gem push pkg/#{Gemgem.gem_tag}.gem")
113
+ end
114
+
115
+ task :check do
116
+ ver = Gemgem.spec.version.to_s
117
+
118
+ if ENV['VERSION'].nil?
119
+ puts("\x1b[35mExpected " \
120
+ "\x1b[33mVERSION\x1b[35m=\x1b[33m#{ver}\x1b[m")
121
+ exit(1)
122
+
123
+ elsif ENV['VERSION'] != ver
124
+ puts("\x1b[35mExpected \x1b[33mVERSION\x1b[35m=\x1b[33m#{ver} " \
125
+ "\x1b[35mbut got\n " \
126
+ "\x1b[33mVERSION\x1b[35m=\x1b[33m#{ENV['VERSION']}\x1b[m")
127
+ exit(2)
128
+ end
129
+ end
130
+
131
+ end # of gem namespace
132
+
133
+ desc 'Run tests'
134
+ task :test do
135
+ sh("#{Gem.ruby} -I lib -S bacon test/test_*.rb")
136
+ end
137
+
138
+ desc 'Generate rdoc'
139
+ task :doc => ['gem:spec'] do
140
+ sh("yardoc -o rdoc --main README.md" \
141
+ " --files #{Gemgem.spec.extra_rdoc_files.join(',')}")
142
+ end
143
+
144
+ desc 'Removed ignored files'
145
+ task :clean => ['gem:spec'] do
146
+ trash = "~/.Trash/#{Gemgem.spec.name}/"
147
+ sh "mkdir -p #{trash}" unless File.exist?(File.expand_path(trash))
148
+ Gemgem.ignored_files.each{ |file| sh "mv #{file} #{trash}" }
149
+ end
150
+
151
+
152
+ task :default do
153
+ Rake.application.options.show_task_pattern = /./
154
+ Rake.application.display_tasks_and_comments
155
+ end