Skip to content
Browse files

This repo is defunct, head to http://github.com/github/github-services

  • Loading branch information...
1 parent 9a58a30 commit d1301d97c36a8794766821367ab63e8c4fb921aa @pjhyett committed
Showing with 4 additions and 9,802 deletions.
  1. +0 −32 CONTRIBUTORS
  2. +0 −22 LICENSE
  3. +4 −0 README
  4. +0 −61 README.mkdn
  5. +0 −8 Rakefile
  6. +0 −4 config/email.yml
  7. +0 −25 docs/basecamp
  8. +0 −27 docs/campfire
  9. +0 −17 docs/cia
  10. +0 −17 docs/email
  11. +0 −74 docs/fog_bugz
  12. +0 −27 docs/freckle
  13. +0 −18 docs/friend_feed
  14. +0 −54 docs/github_payload
  15. +0 −29 docs/irc
  16. +0 −16 docs/jabber
  17. +0 −29 docs/lighthouse
  18. +0 −21 docs/presently
  19. +0 −15 docs/rdocinfo
  20. +0 −30 docs/rubyforge
  21. +0 −16 docs/run_code_run
  22. +0 −20 docs/statusnet
  23. +0 −22 docs/talker
  24. +0 −20 docs/trac
  25. +0 −19 docs/twitter
  26. +0 −12 docs/web_translate_it
  27. +0 −117 github-services.rb
  28. +0 −16 script/deliver_payload
  29. +0 −52 services/basecamp.rb
  30. +0 −45 services/campfire.rb
  31. +0 −56 services/cia.rb
  32. +0 −75 services/email.rb
  33. +0 −46 services/fog_bugz.rb
  34. +0 −3 services/forwarding.rb
  35. +0 −23 services/freckle.rb
  36. +0 −15 services/friend_feed.rb
  37. +0 −84 services/irc.rb
  38. +0 −39 services/jabber.rb
  39. +0 −34 services/lighthouse.rb
  40. +0 −34 services/presently.rb
  41. +0 −4 services/rdocinfo.rb
  42. +0 −12 services/rubyforge.rb
  43. +0 −5 services/run_code_run.rb
  44. +0 −24 services/statusnet.rb
  45. +0 −32 services/talker.rb
  46. +0 −7 services/trac.rb
  47. +0 −24 services/twitter.rb
  48. +0 −4 services/web_translate_it.rb
  49. +0 −123 spec/freckle_spec.rb
  50. +0 −2 spec/spec.opts
  51. +0 −3 vendor/.require_paths
  52. +0 −1,257 vendor/activesupport-2.2.2/CHANGELOG
  53. +0 −43 vendor/activesupport-2.2.2/README
  54. +0 −61 vendor/activesupport-2.2.2/lib/active_support.rb
  55. +0 −33 vendor/activesupport-2.2.2/lib/active_support/base64.rb
  56. +0 −24 vendor/activesupport-2.2.2/lib/active_support/basic_object.rb
  57. +0 −122 vendor/activesupport-2.2.2/lib/active_support/buffered_logger.rb
  58. +0 −223 vendor/activesupport-2.2.2/lib/active_support/cache.rb
  59. +0 −20 vendor/activesupport-2.2.2/lib/active_support/cache/compressed_mem_cache_store.rb
  60. +0 −15 vendor/activesupport-2.2.2/lib/active_support/cache/drb_store.rb
  61. +0 −72 vendor/activesupport-2.2.2/lib/active_support/cache/file_store.rb
  62. +0 −127 vendor/activesupport-2.2.2/lib/active_support/cache/mem_cache_store.rb
  63. +0 −52 vendor/activesupport-2.2.2/lib/active_support/cache/memory_store.rb
  64. +0 −47 vendor/activesupport-2.2.2/lib/active_support/cache/synchronized_memory_store.rb
  65. +0 −280 vendor/activesupport-2.2.2/lib/active_support/callbacks.rb
  66. +0 −4 vendor/activesupport-2.2.2/lib/active_support/core_ext.rb
  67. +0 −13 vendor/activesupport-2.2.2/lib/active_support/core_ext/array.rb
  68. +0 −53 vendor/activesupport-2.2.2/lib/active_support/core_ext/array/access.rb
  69. +0 −183 vendor/activesupport-2.2.2/lib/active_support/core_ext/array/conversions.rb
  70. +0 −20 vendor/activesupport-2.2.2/lib/active_support/core_ext/array/extract_options.rb
  71. +0 −106 vendor/activesupport-2.2.2/lib/active_support/core_ext/array/grouping.rb
  72. +0 −12 vendor/activesupport-2.2.2/lib/active_support/core_ext/array/random_access.rb
  73. +0 −4 vendor/activesupport-2.2.2/lib/active_support/core_ext/base64.rb
  74. +0 −16 vendor/activesupport-2.2.2/lib/active_support/core_ext/base64/encoding.rb
  75. +0 −12 vendor/activesupport-2.2.2/lib/active_support/core_ext/benchmark.rb
  76. +0 −6 vendor/activesupport-2.2.2/lib/active_support/core_ext/bigdecimal.rb
  77. +0 −37 vendor/activesupport-2.2.2/lib/active_support/core_ext/bigdecimal/conversions.rb
  78. +0 −58 vendor/activesupport-2.2.2/lib/active_support/core_ext/blank.rb
  79. +0 −5 vendor/activesupport-2.2.2/lib/active_support/core_ext/cgi.rb
  80. +0 −14 vendor/activesupport-2.2.2/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb
  81. +0 −4 vendor/activesupport-2.2.2/lib/active_support/core_ext/class.rb
  82. +0 −54 vendor/activesupport-2.2.2/lib/active_support/core_ext/class/attribute_accessors.rb
  83. +0 −46 vendor/activesupport-2.2.2/lib/active_support/core_ext/class/delegating_attributes.rb
  84. +0 −140 vendor/activesupport-2.2.2/lib/active_support/core_ext/class/inheritable_attributes.rb
  85. +0 −50 vendor/activesupport-2.2.2/lib/active_support/core_ext/class/removal.rb
  86. +0 −10 vendor/activesupport-2.2.2/lib/active_support/core_ext/date.rb
  87. +0 −42 vendor/activesupport-2.2.2/lib/active_support/core_ext/date/behavior.rb
  88. +0 −230 vendor/activesupport-2.2.2/lib/active_support/core_ext/date/calculations.rb
  89. +0 −107 vendor/activesupport-2.2.2/lib/active_support/core_ext/date/conversions.rb
  90. +0 −12 vendor/activesupport-2.2.2/lib/active_support/core_ext/date_time.rb
  91. +0 −126 vendor/activesupport-2.2.2/lib/active_support/core_ext/date_time/calculations.rb
  92. +0 −96 vendor/activesupport-2.2.2/lib/active_support/core_ext/date_time/conversions.rb
  93. +0 −43 vendor/activesupport-2.2.2/lib/active_support/core_ext/duplicable.rb
  94. +0 −107 vendor/activesupport-2.2.2/lib/active_support/core_ext/enumerable.rb
  95. +0 −41 vendor/activesupport-2.2.2/lib/active_support/core_ext/exception.rb
  96. +0 −5 vendor/activesupport-2.2.2/lib/active_support/core_ext/file.rb
  97. +0 −46 vendor/activesupport-2.2.2/lib/active_support/core_ext/file/atomic.rb
  98. +0 −7 vendor/activesupport-2.2.2/lib/active_support/core_ext/float.rb
  99. +0 −24 vendor/activesupport-2.2.2/lib/active_support/core_ext/float/rounding.rb
  100. +0 −27 vendor/activesupport-2.2.2/lib/active_support/core_ext/float/time.rb
  101. +0 −14 vendor/activesupport-2.2.2/lib/active_support/core_ext/hash.rb
  102. +0 −259 vendor/activesupport-2.2.2/lib/active_support/core_ext/hash/conversions.rb
  103. +0 −23 vendor/activesupport-2.2.2/lib/active_support/core_ext/hash/deep_merge.rb
  104. +0 −19 vendor/activesupport-2.2.2/lib/active_support/core_ext/hash/diff.rb
  105. +0 −25 vendor/activesupport-2.2.2/lib/active_support/core_ext/hash/except.rb
  106. +0 −137 vendor/activesupport-2.2.2/lib/active_support/core_ext/hash/indifferent_access.rb
  107. +0 −52 vendor/activesupport-2.2.2/lib/active_support/core_ext/hash/keys.rb
  108. +0 −35 vendor/activesupport-2.2.2/lib/active_support/core_ext/hash/reverse_merge.rb
  109. +0 −33 vendor/activesupport-2.2.2/lib/active_support/core_ext/hash/slice.rb
  110. +0 −9 vendor/activesupport-2.2.2/lib/active_support/core_ext/integer.rb
  111. +0 −29 vendor/activesupport-2.2.2/lib/active_support/core_ext/integer/even_odd.rb
  112. +0 −20 vendor/activesupport-2.2.2/lib/active_support/core_ext/integer/inflections.rb
  113. +0 −45 vendor/activesupport-2.2.2/lib/active_support/core_ext/integer/time.rb
  114. +0 −5 vendor/activesupport-2.2.2/lib/active_support/core_ext/kernel.rb
  115. +0 −11 vendor/activesupport-2.2.2/lib/active_support/core_ext/kernel/agnostics.rb
  116. +0 −7 vendor/activesupport-2.2.2/lib/active_support/core_ext/kernel/daemonizing.rb
  117. +0 −13 vendor/activesupport-2.2.2/lib/active_support/core_ext/kernel/debugger.rb
  118. +0 −59 vendor/activesupport-2.2.2/lib/active_support/core_ext/kernel/reporting.rb
  119. +0 −24 vendor/activesupport-2.2.2/lib/active_support/core_ext/kernel/requires.rb
  120. +0 −38 vendor/activesupport-2.2.2/lib/active_support/core_ext/load_error.rb
  121. +0 −143 vendor/activesupport-2.2.2/lib/active_support/core_ext/logger.rb
  122. +0 −23 vendor/activesupport-2.2.2/lib/active_support/core_ext/module.rb
  123. +0 −74 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/aliasing.rb
  124. +0 −31 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/attr_accessor_with_default.rb
  125. +0 −32 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/attr_internal.rb
  126. +0 −58 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/attribute_accessors.rb
  127. +0 −95 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/delegation.rb
  128. +0 −30 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/inclusion.rb
  129. +0 −90 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/introspection.rb
  130. +0 −23 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/loading.rb
  131. +0 −23 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/model_naming.rb
  132. +0 −39 vendor/activesupport-2.2.2/lib/active_support/core_ext/module/synchronization.rb
  133. +0 −17 vendor/activesupport-2.2.2/lib/active_support/core_ext/name_error.rb
  134. +0 −9 vendor/activesupport-2.2.2/lib/active_support/core_ext/numeric.rb
  135. +0 −44 vendor/activesupport-2.2.2/lib/active_support/core_ext/numeric/bytes.rb
  136. +0 −19 vendor/activesupport-2.2.2/lib/active_support/core_ext/numeric/conversions.rb
  137. +0 −81 vendor/activesupport-2.2.2/lib/active_support/core_ext/numeric/time.rb
  138. +0 −5 vendor/activesupport-2.2.2/lib/active_support/core_ext/object.rb
  139. +0 −14 vendor/activesupport-2.2.2/lib/active_support/core_ext/object/conversions.rb
  140. +0 −80 vendor/activesupport-2.2.2/lib/active_support/core_ext/object/extending.rb
  141. +0 −74 vendor/activesupport-2.2.2/lib/active_support/core_ext/object/instance_variables.rb
  142. +0 −13 vendor/activesupport-2.2.2/lib/active_support/core_ext/object/metaclass.rb
  143. +0 −74 vendor/activesupport-2.2.2/lib/active_support/core_ext/object/misc.rb
  144. +0 −7 vendor/activesupport-2.2.2/lib/active_support/core_ext/pathname.rb
  145. +0 −14 vendor/activesupport-2.2.2/lib/active_support/core_ext/pathname/clean_within.rb
  146. +0 −12 vendor/activesupport-2.2.2/lib/active_support/core_ext/proc.rb
  147. +0 −1 vendor/activesupport-2.2.2/lib/active_support/core_ext/process.rb
  148. +0 −25 vendor/activesupport-2.2.2/lib/active_support/core_ext/process/daemon.rb
  149. +0 −11 vendor/activesupport-2.2.2/lib/active_support/core_ext/range.rb
  150. +0 −32 vendor/activesupport-2.2.2/lib/active_support/core_ext/range/blockless_step.rb
  151. +0 −27 vendor/activesupport-2.2.2/lib/active_support/core_ext/range/conversions.rb
  152. +0 −30 vendor/activesupport-2.2.2/lib/active_support/core_ext/range/include_range.rb
  153. +0 −15 vendor/activesupport-2.2.2/lib/active_support/core_ext/range/overlaps.rb
  154. +0 −36 vendor/activesupport-2.2.2/lib/active_support/core_ext/rexml.rb
  155. +0 −22 vendor/activesupport-2.2.2/lib/active_support/core_ext/string.rb
  156. +0 −82 vendor/activesupport-2.2.2/lib/active_support/core_ext/string/access.rb
  157. +0 −13 vendor/activesupport-2.2.2/lib/active_support/core_ext/string/behavior.rb
  158. +0 −28 vendor/activesupport-2.2.2/lib/active_support/core_ext/string/conversions.rb
  159. +0 −26 vendor/activesupport-2.2.2/lib/active_support/core_ext/string/filters.rb
  160. +0 −167 vendor/activesupport-2.2.2/lib/active_support/core_ext/string/inflections.rb
  161. +0 −21 vendor/activesupport-2.2.2/lib/active_support/core_ext/string/iterators.rb
  162. +0 −81 vendor/activesupport-2.2.2/lib/active_support/core_ext/string/multibyte.rb
  163. +0 −35 vendor/activesupport-2.2.2/lib/active_support/core_ext/string/starts_ends_with.rb
  164. +0 −11 vendor/activesupport-2.2.2/lib/active_support/core_ext/string/xchar.rb
  165. +0 −14 vendor/activesupport-2.2.2/lib/active_support/core_ext/symbol.rb
  166. +0 −42 vendor/activesupport-2.2.2/lib/active_support/core_ext/time.rb
  167. +0 −13 vendor/activesupport-2.2.2/lib/active_support/core_ext/time/behavior.rb
  168. +0 −303 vendor/activesupport-2.2.2/lib/active_support/core_ext/time/calculations.rb
  169. +0 −90 vendor/activesupport-2.2.2/lib/active_support/core_ext/time/conversions.rb
  170. +0 −86 vendor/activesupport-2.2.2/lib/active_support/core_ext/time/zones.rb
  171. +0 −621 vendor/activesupport-2.2.2/lib/active_support/dependencies.rb
  172. +0 −243 vendor/activesupport-2.2.2/lib/active_support/deprecation.rb
  173. +0 −96 vendor/activesupport-2.2.2/lib/active_support/duration.rb
Sorry, we could not display the entire diff because too many files (1,087) changed.
View
32 CONTRIBUTORS
@@ -1,32 +0,0 @@
-Thanks to the following people for making this possible
--------------------------------------------------------
-
-- Arun Thampi
-- Blake Mizerany
-- Brandon Keepers
-- Bryan Drewery
-- Chris Shoemaker
-- Christian Neukirchen
-- Dav Glass
-- El Draper
-- Eric Lindvall
-- Florian Frank
-- Hans Engel
-- Harry Vangberg
-- John Nunemaker
-- John Reilly
-- Jorge Bernal
-- Luke Redpath
-- Matt Polito
-- Michael Bleigh
-- Nick Gerakines
-- Noah (ngage)
-- Sanko Robinson
-- Sean O'Brien
-- Tekkub Stoutwrithe
-- W. Andrew Loe III
-- Grant Limberg
-- Jess Martin
-- Édouard Brière
-- Teng Siong Ong
-- Nick Plante
View
22 LICENSE
@@ -1,22 +0,0 @@
-Copyright (c) 2008 Logical Awesome, LLC
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
View
4 README
@@ -0,0 +1,4 @@
+This was the original location of the github-services repo, but http://github.com/github/github-services is now the official location.
+
+Cheers,
+PJ
View
61 README.mkdn
@@ -1,61 +0,0 @@
-GitHub Services
-===============
-
-How the services work
----------------------
-
-1. A post-receive background job is submitted when someone pushes their
- commits to GitHub
-2. If the repository the commits belong to has any "Service Hooks" setup, the
- job makes a request to `http://services-server/service_name/` with the
- following data:
- - `params[:payload]` containing all of the commit data (the same data you get using the API)
- - `params[:data]` containing the service data (username, password, room, etc)
-3. Sinatra (github-services.rb) processes the request (twitters your data, says
- something in campfire, posts it to lighthouse, etc)
-4. Rinse and repeat
-
-Steps to contributing
----------------------
-
-1. Fork the project
-2. Create a new file in /services/ called `service_name.rb`, using the following
- template:
-
- service :service_name do |data, payload|
- end
-
-3. Vendor any external gems your code relies on, and make sure to include it in
- the requires at the top of github-services.rb
-4. Add documentation to `docs/service_name` (refer to the others for guidance)
-5. Add your name to the `CONTRIBUTORS` file
-6. Create an Issue at http://github.com/pjhyett/github-services/issues with
- links to each commit you want included.
-7. Once it's accepted we'll add any new necessary data fields to the GitHub
- front-end so people can start using your addition.
-
-*Patches including tests are encouraged*
-
-Running the server locally
---------------------------
-
-1. [sudo] gem install hpricot
-2. git clone git://github.com/pjhyett/github-services.git
-3. cd github-services
-4. ruby github-services.rb
-
-* Bugs in the code should be filed under the Issues tab
-* Problems with the service hooks can be filed here: [http://support.github.com/discussions/post-receive-issues](http://support.github.com/discussions/post-receive-issues)
-
-How to test your service
-------------------------
-
-1. Start the github-services Sinatra server with `ruby github-services.rb`. By
- default, it runs on port 8080.
-2. Edit the doc/github_payload file as necessary to test your service. (Usually
- just editing the "data" values but leaving the "payload" alone.)
-3. Send the doc/github_payload file to your service by calling:
- `./script/deliver_payload [service-name]`
-
-NOTE: The name of the service and your docs/ file matters. If your service is RunCodeRun, your service
-and docs MUST be `run_code_run`. Good luck!
View
8 Rakefile
@@ -1,8 +0,0 @@
-require 'spec/rake/spectask'
-
-Spec::Rake::SpecTask.new('spec') do |t|
- t.spec_opts = ['--options', "spec/spec.opts"]
- t.spec_files = FileList['spec/**/*_spec.rb']
-end
-
-task :default => :spec
View
4 config/email.yml
@@ -1,4 +0,0 @@
----
-address: smtp1.rs.github.com
-port: 25
-domain: github.com
View
25 docs/basecamp
@@ -1,25 +0,0 @@
-Basecamp
-========
-
-Install Notes
--------------
-
- 1. url should be your Basecamp url
- 2. username should be the username of the user that you want to use to post messages into your Basecamp - you can setup a user just for this purpose
- 3. password should be the password of the user that you want to use to post the messages
- 4. project should be the name of the project that you want to post the message into (not the id)
- 5. category should be the name of the category that you want to post the message using (not the id)
-
-
-Developer Notes
----------------
-
-data
- - url
- - username
- - password
- - project
- - category
-
-payload
- - refer to docs/github_payload
View
27 docs/campfire
@@ -1,27 +0,0 @@
-Campfire
-========
-
-Install Notes
--------------
-
- 1. subdomain is your campfire subdomain
- (ie 'your-subdomain' if you visit 'http://your-subdomain.campfirenow.com')
-
- 2. room is the actual room name, not the id
-
- 3. token is your API token. get it from campfire's "Edit my Campfire
- account" screen
-
-
-Developer Notes
----------------
-
-data
- - subdomain
- - token
- - room
- - ssl
- - play_sound
-
-payload
- - refer to docs/github_payload
View
17 docs/cia
@@ -1,17 +0,0 @@
-CIA.vc
-========
-
-Install Notes
--------------
-
- 1. Disable multiple messages if more than 5 commits are pushed. Instead announce the last commit with "(+## more commits...)" appended to the note.
-
-
-Developer Notes
----------------
-
-data
- - no_spam
-
-payload
- - refer to docs/github_payload
View
17 docs/email
@@ -1,17 +0,0 @@
-Email
-========
-
-Install Notes
--------------
-
- 1. address (only one is allowed)
-
-
-Developer Notes
----------------
-
-data
- - address
-
-payload
- - refer to docs/github_payload
View
74 docs/fog_bugz
@@ -1,74 +0,0 @@
-FogBugz
-=======
-
-Install Notes
--------------
-
- 1. Requires FogBugz version 6.1 or above, and your FogBugz installation
- must be accessible from the internet
-
- 2. "cvssubmit_url" is the url to the cvsSubmit.[php|asp] file on your
- FogBugz server.
- Example: https://server.com/fogbugz/cvsSubmit.php
-
- 3. The "sRepo" field (in FogBugz 6.1) will be automatically set to the name of
- this GitHub repository.
-
- 4. The ixRepository field (in FogBugz 7.0) will be set to the fb_repoid set in the
- hooks configuration page
-
-FogBugz 6.1 Configuration
----------------------
-
-If you want to use GitHub as your sole source control system, configuration
-within FogBugz is relatively easy.
-
-In your site configuration:
-
- 1. Set "the Source Control URL for logs" field to be:
- https://github.com/[github_username]/^REPO/commits/^FILE
-
- 2. Set "the Source Control URL for diffs" field to be:
- https://github.com/[github_username]/^REPO/commit/^R2
-
-If you have commits in FogBugz from a previous source control system, or if
-you want to use multiple GitHub accounts, please read:
-
-http://www.fogcreek.com/FogBugz/KB/howto/MultipleRepositories-Mult.html
-
-
-FogBugz 7.0 Configuration
----------------
-
-FogBugz 7 has a configuration page for multiple repositories. Each repository
-is given and ID that will be used by the cvsSubmit.asp page.
-
- 1. From the admin menu, select Source Control.
-
- 2. Click 'Create New Repository'.
-
- 3. An option pane will pop up. Select 'Other (custom)'. Enter a name for
- the repository. The name does not have to be the same as the github repo
- name. Click Next.
-
- 4. Set the 'Diff URL' field to be:
- https://github.com/[github_username]/[github_reponame]/commit/^R2
-
- 5. Set the 'Log URL' field to be:
- https://github.com/[github_username]/[github_reponame]/commits/^FILE
-
- 6. There's a URL printed at the top of the configuration screen. Make
- note of the number following ixRepository= That is the ID that needs
- to be filled in for the fb_repoid field.
-
-
-Developer Notes
----------------
-
-data
- - cvssubmit_url
- - fb_version (Valid options are 6.1 and 7.0)
- - fb_repoid
-
-payload
- - refer to docs/github_payload
View
27 docs/freckle
@@ -1,27 +0,0 @@
-freckle
-========
-
-Install Notes
--------------
-
-Using the following URL as an example:
-https://nutsnbolts.letsfreckle.com
-
- 1. Account name: subdomain of the freckle account (nutsnbolts)
- 2. Token: the API token for an individual freckle user who is associated with the target freckle account (see instructions below)
- 3. Project name: the exact name of the target freckle project to log time for this repo
-
-To get your API token: log into your freckle account, click Settings at the top right, then click the Integration (API) tab.
-
-Note about email addresses: the email address on a committer's Github account should match his/her email address on his/her freckle account. Otherwise, we can't identify the person who is logging time.
-
-Developer Notes
----------------
-
-data
- - subdomain
- - token
- - project name
-
-payload
- - refer to docs/github_payload
View
18 docs/friend_feed
@@ -1,18 +0,0 @@
-FriendFeed
-==========
-
-This service lets your broadcast your commits on FriendFeed. A simple post is made to http://www.friendfeed.com/api/share with your commits.
-
-Example: 'Arun Thampi just pushed 56436bcdef2342ddfca234234 to github-services on GitHub'
-with the comment set as 'Integrated FriendFeed in github-services'
-
-
-Developer Notes
----------------
-
-data
- - nickname
- - remotekey [As specified by http://www.friendfeed.com/remotekey]
-
-payload
- - refer to docs/github_payload
View
54 docs/github_payload
@@ -1,54 +0,0 @@
-# example params hash sinatra receives
-
-{
- "data" => {
- "token" => "token",
- "url" => "https://youraccount.talkerapp.com/rooms/ROOM_ID",
- "digest" => 1
- },
-
- "payload" => {
- "after" => "a47fd41f3aa4610ea527dcc1669dfdb9c15c5425",
- "ref" => "refs/heads/master",
- "before" => "4c8124ffcf4039d292442eeccabdeca5af5c5017",
-
- "repository" => {
- "name" => "grit",
- "url" => "http://github.com/mojombo/grit",
- "owner" => { "name" => "mojombo", "email" => "tom@mojombo.com" }
- },
-
- "commits" => [
- {
- "removed" => [],
- "message" => "stub git call for Grit#heads test",
- "added" => [],
- "timestamp" => "2007-10-10T00:11:02-07:00",
- "modified" => ["lib/grit/grit.rb", "test/helper.rb", "test/test_grit.rb"],
- "url" => "http://github.com/mojombo/grit/commit/06f63b43050935962f84fe54473a7c5de7977325",
- "author" => { "name" => "Tom Preston-Werner", "email" => "tom@mojombo.com" },
- "id" => "06f63b43050935962f84fe54473a7c5de7977325"
- },
- {
- "removed" => [],
- "message" => "clean up heads test",
- "added" => [],
- "timestamp" => "2007-10-10T00:18:20-07:00",
- "modified" => ["test/test_grit.rb"],
- "url" => "http://github.com/mojombo/grit/commit/5057e76a11abd02e83b7d3d3171c4b68d9c88480",
- "author" => { "name" => "Tom Preston-Werner", "email" => "tom@mojombo.com" },
- "id" => "5057e76a11abd02e83b7d3d3171c4b68d9c88480"
- },
- {
- "removed" => [],
- "message" => "add more comments throughout",
- "added" => [],
- "timestamp" => "2007-10-10T00:50:39-07:00",
- "modified" => ["lib/grit.rb", "lib/grit/commit.rb", "lib/grit/grit.rb"],
- "url" => "http://github.com/mojombo/grit/commit/a47fd41f3aa4610ea527dcc1669dfdb9c15c5425",
- "author" => { "name" => "Tom Preston-Werner", "email" => "tom@mojombo.com" },
- "id" => "a47fd41f3aa4610ea527dcc1669dfdb9c15c5425"
- }
- ]
- }
-}
View
29 docs/irc
@@ -1,29 +0,0 @@
-IRC
-========
-
-Install Notes
--------------
-
- 1. server (ie. irc.freenode.net)
- 2. port is normally 6667 / 9999 for ssl
- 3. the room field can support multiple rooms (comma separated)
- 4. the password field is for the server password
- 5. room passwords can be specified for each room like this:
- room_name::password
- 6. prefixing '#' to the room field is optional
- 7. nick is not required, if provided the IRCBot will use that nick
-
-
-Developer Notes
----------------
-
-data
- - server
- - port
- - room
- - password
- - ssl
- - nick
-
-payload
- - refer to docs/github_payload
View
16 docs/jabber
@@ -1,16 +0,0 @@
-Jabber
-======
-
-Install Notes
--------------
-
- 1. user is the Jabber ID (e.g.: myusername@jabber.org). Multiple users can be added by separating them with commas. Currently, there is a maximum of 25 users.
-
-Developer Notes
----------------
-
-data
- - user
-
-payload
- - refer to docs/github_payload
View
29 docs/lighthouse
@@ -1,29 +0,0 @@
-Lighthouse
-========
-
-Install Notes
--------------
-
-Using the following url as an example:
-http://logicalawesome.lighthouseapp.com/projects/8570-github/overview
-
- 1. subdomain is logicalawesome
- 2. project_id is 8570
- 3. this service only supports project tokens
- (accepting patches for user-based tokens)
- 4. 'private' determines whether changed files
- should be displayed (useful for public LH
- accounts and private GH repos)
-
-
-Developer Notes
----------------
-
-data
- - subdomain
- - project_id
- - token
- - private
-
-payload
- - refer to docs/github_payload
View
21 docs/presently
@@ -1,21 +0,0 @@
-Present.ly
-==========
-
-Install Notes
--------------
-
- 1. subdomain (for a Present.ly account)
- 2. group_name (OPTIONAL; will broadcast as a group or as the system if group is 'system')
- 3. username (user must be a manager of the specified group or admin for 'system')
-
-Developer Notes
----------------
-
-data
- - subdomain
- - group_name (optional)
- - username
- - password
-
-payload
- - refer to docs/github_payload
View
15 docs/rdocinfo
@@ -1,15 +0,0 @@
-rdoc.info
-=========
-
-This service allows you to auto-publish documentation for your Ruby gem or library.
-The resulting documentation will be hosted for you at http://rdoc.info/projects/your-name/your-project
-
-
-Developer Notes
----------------
-
-data
- - (no data is required, payload is simply posted to http://rdoc.info/projects/update)
-
-payload
- - refer to docs/github_payload
View
30 docs/rubyforge
@@ -1,30 +0,0 @@
-RubyForge
-=========
-
-Special Thanks
--------------
-
-Would like to notice Ara Howard and his RubyForge gem, from which I copied most of the code
-used in this service. Would also like to notice the author of the Basecamp service, since
-I used that service as a template for the RubyForge service.
-
-This service simply posts a new NewsByte to the RubyForge project (as specified by the groupid).
-
-Install Notes
--------------
-
- 1. username should be the username of a user that has access to the RubyForge project
- 2. password should be the password of the given user
- 3. groupid should be the group id of the RubyForge project
-
-
-Developer Notes
----------------
-
-data
- - username
- - password
- - groupid
-
-payload
- - refer to docs/github_payload
View
16 docs/run_code_run
@@ -1,16 +0,0 @@
-RunCodeRun
-==========
-
-RunCodeRun is a hosted continuous integration service. It is free for public
-projects. For private project plans, see http://runcoderun.com/plans.
-
-Install Notes
--------------
-
- 1. Check the "Active" checkbox and click "Update Settings".
- 2. Click on the "RunCodeRun" service name and then click the "Test Hook" link.
- 3. You should receive an email from RunCodeRun letting you know your
- project was setup.
- 4. If this is a private project, add the rcr-private user as a collaborator.
-
-For more details, go to http://runcoderun.com/github
View
20 docs/statusnet
@@ -1,20 +0,0 @@
-Statusnet (laconica)
-====================
-
-Install Notes
--------------
-
- 1. the server field should be the server base URI.(eg. http://identi.ca or http://identi.ca/index.php)
-
-
-Developer Notes
----------------
-
-data
- - username
- - password
- - digest (boolean)
- - server
-
-payload
- - refer to docs/github_payload
View
22 docs/talker
@@ -1,22 +0,0 @@
-Talker
-========
-
-Install Notes
--------------
-
- 1. url should be your room url, for example https://youraccount.talkerapp.com/rooms/ROOM_ID
- 2. token should be on your settings page
- 3. if digest is checked, all commits will be compressed in one message
-
-Note: replace https with http on the url if you're on the Free plan as it doesn't include enhanced security (SSL).
-
-Developer Notes
----------------
-
-data
- - url
- - token
- - digest (boolean)
-
-payload
- - refer to docs/github_payload
View
20 docs/trac
@@ -1,20 +0,0 @@
-Trac
-====
-
-Install the following plugin on your Trac server before proceeding: http://github.com/davglass/github-trac/
-
- 1. url field is your Trac install's url
- 2. token (this needs to be the same token you put in your trac.ini installed via the plugin)
-
-
-The plugin searches commit messages for text in the form of:
- command #1
- command #1, #2
- command #1 & #2
- command #1 and #2
-
-Instead of the short-hand syntax "#1", "ticket:1" can be used as well, e.g.:
- command ticket:1
- command ticket:1, ticket:2
- command ticket:1 & ticket:2
- command ticket:1 and ticket:2
View
19 docs/twitter
@@ -1,19 +0,0 @@
-Twitter
-========
-
-Install Notes
--------------
-
- 1. email or username will work in username field
-
-
-Developer Notes
----------------
-
-data
- - username
- - password
- - digest (boolean)
-
-payload
- - refer to docs/github_payload
View
12 docs/web_translate_it
@@ -1,12 +0,0 @@
-Web Translate It
-================
-
-This service notify Web Translate It of pushes to your public repository. Web Translate It will then refresh the language file(s) if they have been updated.
-
-More info: https://webtranslateit.com/documentation/wikis/github-integration
-
-Install Notes
--------------
-
- API Key is your project API key
- (you can find it in the project settings)
View
117 github-services.rb
@@ -1,117 +0,0 @@
-$LOAD_PATH.unshift *Dir["#{File.dirname(__FILE__)}/vendor/**/lib"]
-
-# stdlib
-require 'net/http'
-require 'net/https'
-require 'net/smtp'
-require 'socket'
-require 'timeout'
-require 'xmlrpc/client'
-require 'openssl'
-require 'cgi'
-#~ require 'date' # This is needed by the CIA service in ruby 1.8.7 or later
-
-# vendor
-require 'mime/types'
-require 'xmlsimple'
-require 'activesupport'
-require 'rack'
-require 'sinatra'
-require 'tinder'
-require 'json'
-require 'tinder'
-require 'basecamp'
-require 'tmail'
-require 'xmpp4r'
-require 'xmpp4r-simple'
-require 'rubyforge'
-
-set :run, true
-set :environment, :production
-set :port, ARGV.first || 8080
-
-HOSTNAME = `hostname`.chomp
-
-begin
- require 'mongrel'
- set :server, 'mongrel'
-rescue LoadError
- begin
- require 'thin'
- set :server, 'thin'
- rescue LoadError
- set :server, 'webrick'
- end
-end
-
-module GitHub
- class ServiceTimeout < Timeout::Error
- end
-
- def service(name)
- post "/#{name}/" do
- begin
- data = JSON.parse(params[:data])
- payload = JSON.parse(params[:payload])
- Timeout.timeout(20, ServiceTimeout) { yield data, payload }
- rescue Object => boom
- # redact sensitive info in hook_data hash
- hook_data = data || params[:data]
- hook_payload = payload || params[:payload]
- %w[password token].each { |key| hook_data[key] &&= '<redacted>' }
- owner = hook_payload['repository']['owner']['name'] rescue nil
- repo = hook_payload['repository']['name'] rescue nil
- report_exception boom,
- :hook_name => name,
- :hook_data => hook_data.inspect,
- :hook_payload => hook_payload.inspect,
- :user => owner,
- :repo => "#{owner}/#{repo}"
- raise
- end
- end
- end
-
- def shorten_url(url)
- Timeout::timeout(6) do
- short = Net::HTTP.get("api.bit.ly", "/shorten?version=2.0.1&longUrl=#{url}&login=github&apiKey=R_261d14760f4938f0cda9bea984b212e4")
- short = JSON.parse(short)
- short["errorCode"].zero? ? short["results"][url]["shortUrl"] : url
- end
- rescue Timeout::Error
- url
- end
-
- def report_exception(exception, other)
- # run only in github's production environment
- return if HOSTNAME != 'sh1.rs.github.com'
-
- backtrace = Array(exception.backtrace)[0..500]
-
- data = {
- 'type' => 'exception',
- 'class' => exception.class.to_s,
- 'server' => HOSTNAME,
- 'message' => exception.message[0..254],
- 'backtrace' => backtrace.join("\n"),
- 'rollup' => Digest::MD5.hexdigest(exception.class.to_s + backtrace[0])
- }
-
- # optional
- other.each { |key, value| data[key.to_s] = value.to_s }
-
- Net::HTTP.new('aux1', 9292).
- post('/haystack/async', "json=#{Rack::Utils.escape(data.to_json)}")
- rescue => boom
- $stderr.puts "reporting exception failed:"
- $stderr.puts "#{boom.class}: #{boom}"
- # swallow errors
- end
-end
-include GitHub
-
-get "/" do
- "ok"
-end
-
-Dir["#{File.dirname(__FILE__)}/services/**/*.rb"].each { |service| load service }
View
16 script/deliver_payload
@@ -1,16 +0,0 @@
-#!/usr/bin/env ruby
-
-require "json"
-
-unless ARGV[0]
- puts "Usage: ./script/deliver_payload [service-name]"
- exit 1
-end
-
-payload_file = File.new("docs/github_payload")
-hash = eval(payload_file.read)
-
-data_json = JSON.generate(hash["data"])
-payload_json = JSON.generate(hash["payload"])
-
-exec "curl --data-binary 'data=#{data_json}&payload=#{payload_json}' http://localhost:8080/#{ARGV[0]}/"
View
52 services/basecamp.rb
@@ -1,52 +0,0 @@
-service :basecamp do |data, payload|
- repository = payload['repository']['name']
- name_with_owner = File.join(payload['repository']['owner']['name'], repository)
- branch = payload['ref'].split('/').last
-
- basecamp = Basecamp.new(data['url'], data['username'], data['password'])
- project_id = basecamp.projects.select { |p| p.name.downcase == data['project'].downcase }.first.id
- category_id = basecamp.message_categories(project_id).select { |category| category.name.downcase == data['category'].downcase }.first.id
-
- payload['commits'].each do |commit|
- gitsha = commit['id']
- short_git_sha = gitsha[0..5]
- timestamp = Date.parse(commit['timestamp'])
-
- added = commit['added'].map { |f| ['A', f] }
- removed = commit['removed'].map { |f| ['R', f] }
- modified = commit['modified'].map { |f| ['M', f] }
- changed_paths = (added + removed + modified).sort_by { |(char, file)| file }
- changed_paths = changed_paths.collect { |entry| entry * ' ' }.join("\n ")
-
- # Shorten the elements of the subject
- commit_title = commit['message'][/^([^\n]+)/, 1]
- if commit_title.length > 50
- commit_title = commit_title.slice(0,50) << '...'
- end
-
- title = "Commit on #{name_with_owner}: #{short_git_sha}: #{commit_title}"
-
- body = <<-EOH
-*Author:* #{commit['author']['name']} <#{commit['author']['email']}>
-*Commit:* <a href="#{commit['url']}">#{gitsha}</a>
-*Date:* #{timestamp} (#{timestamp.strftime('%a, %d %b %Y')})
-*Branch:* #{branch}
-*Home:* #{payload['repository']['url']}
-
-h2. Log Message
-
-<pre>#{commit['message']}</pre>
-EOH
-
- if changed_paths.size > 0
- body << <<-EOH
-
-h2. Changed paths
-
-<pre> #{changed_paths}</pre>
-EOH
- end
-
- basecamp.post_message(project_id, :title => title, :body => body, :category_id => category_id)
- end
-end
View
45 services/campfire.rb
@@ -1,45 +0,0 @@
-service :campfire do |data, payload|
- # fail fast with no token
- throw(:halt, 400) if data['token'].to_s == ''
-
- repository = payload['repository']['name']
- owner = payload['repository']['owner']['name']
- branch = payload['ref'].split('/').last
- commits = payload['commits']
- next if commits.empty?
- campfire = Tinder::Campfire.new(data['subdomain'], :ssl => data['ssl'].to_i == 1)
- play_sound = data['play_sound'].to_i == 1
-
- throw(:halt, 400) unless campfire && campfire.login(data['token'], 'X')
- throw(:halt, 400) unless room = campfire.find_room_by_name(data['room'])
-
- prefix = "[#{repository}/#{branch}]"
- primary, others = commits[0..4], Array(commits[5..-1])
- messages =
- primary.map do |commit|
- short = commit['message'].split("\n", 2).first
- short += ' ...' if short != commit['message']
- "#{prefix} #{short} - #{commit['author']['name']}"
- end
-
- if messages.size > 1
- before, after = payload['before'][0..6], payload['after'][0..6]
- url = payload['repository']['url'] + "/compare/#{before}...#{after}"
- summary =
- if others.any?
- "#{prefix} (+#{others.length} more) commits #{before}...#{after}: #{url}"
- else
- "#{prefix} commits #{before}...#{after}: #{url}"
- end
- messages << summary
- else
- url = commits.first['url']
- messages[0] = "#{messages.first} (#{url})"
- end
-
- messages.each { |line| room.speak line }
- room.play "rimshot" if play_sound
-
- room.leave
- campfire.logout
-end
View
56 services/cia.rb
@@ -1,56 +0,0 @@
-def build_cia_commit(repository, branch, sha1, commit, size = 1)
- log = commit['message']
- log << " (+#{size} more commits...)" if size > 1
-
- dt = DateTime.parse(commit['timestamp']).new_offset
- timestamp = Time.send(:gm, dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec).to_i
- files = commit['modified'] + commit['added'] + commit['removed']
- tiny_url = shorten_url(commit['url'])
-
- log << " - #{tiny_url}" unless tiny_url == commit['url']
-
- <<-MSG
- <message>
- <generator>
- <name>github</name>
- <version>1</version>
- <url>http://www.github.com</url>
- </generator>
- <source>
- <project>#{repository}</project>
- <branch>#{branch}</branch>
- </source>
- <timestamp>#{timestamp}</timestamp>
- <body>
- <commit>
- <author>#{commit['author']['name']}</author>
- <revision>#{sha1[0..6]}</revision>
- <log>#{CGI.escapeHTML(log)}</log>
- <url>#{commit['url']}</url>
- <files>
- <file> #{files.join("</file>\n<file>")} </file>
- </files>
- </commit>
- </body>
- </message>
- MSG
-end
-
-service :cia do |data, payload|
- server = XMLRPC::Client.new2("http://cia.navi.cx")
-
- repository = payload['repository']['name']
- branch = (payload['ref'] =~ /^refs\/heads\/(.+)$/ ? $1 : payload['ref'])
- commits = payload['commits']
-
- if commits.size > 5
- message = build_cia_commit(repository, branch, payload['after'], commits[payload['after']], commits.size - 1)
- server.call("hub.deliver", message)
- else
- commits.each do |commit|
- sha1 = commit['id']
- message = build_cia_commit(repository, branch, sha1, commit)
- server.call("hub.deliver", message)
- end
- end
-end
View
75 services/email.rb
@@ -1,75 +0,0 @@
-email_conf = YAML.load_file(File.join(File.dirname(__FILE__), '..', 'config', 'email.yml'))
-
-service :email do |data, payload|
- name_with_owner = File.join(payload['repository']['owner']['name'], payload['repository']['name'])
-
- # Should be: first_commit = payload['commits'].first
- first_commit = payload['commits'].first
- next if first_commit.nil?
-
- first_commit_sha = first_commit['id']
-
- # Shorten the elements of the subject
- first_commit_sha = first_commit_sha[0..5]
-
- first_commit_title = first_commit['message'][/^([^\n]+)/, 1]
- if first_commit_title.length > 50
- first_commit_title = first_commit_title.slice(0,50) << '...'
- end
-
- body = <<-EOH
-Branch: #{payload['ref']}
-Home: #{payload['repository']['url']}
-
-EOH
-
- payload['commits'].each do |commit|
- gitsha = commit['id']
- added = commit['added'].map { |f| ['A', f] }
- removed = commit['removed'].map { |f| ['R', f] }
- modified = commit['modified'].map { |f| ['M', f] }
-
- changed_paths = (added + removed + modified).sort_by { |(char, file)| file }
- changed_paths = changed_paths.collect { |entry| entry * ' ' }.join("\n ")
-
- timestamp = Date.parse(commit['timestamp'])
-
- body << <<-EOH
-Commit: #{gitsha}
- #{commit['url']}
-Author: #{commit['author']['name']} <#{commit['author']['email']}>
-Date: #{timestamp} (#{timestamp.strftime('%a, %d %b %Y')})
-
-EOH
-
- if changed_paths.size > 0
- body << <<-EOH
-Changed paths:
- #{changed_paths}
-
-EOH
- end
-
- body << <<-EOH
-Log Message:
------------
-#{commit['message']}
-
-
-EOH
- end
-
- message = TMail::Mail.new
- message.set_content_type('text', 'plain', {:charset => 'UTF-8'})
- message.to = data['address']
- message.subject = "[#{name_with_owner}] #{first_commit_sha}: #{first_commit_title}"
- message.body = body
- message.date = Time.now
-
- smtp_settings = [ email_conf['address'], (email_conf['port'] || 25).to_i, (email_conf['domain'] || 'localhost.localdomain') ]
- smtp_settings += [ email_conf['user_name'], email_conf['password'], email_conf['authentication'] ] if email_conf['authentication']
-
- Net::SMTP.start(*smtp_settings) do |smtp|
- smtp.send_message message.to_s, "GitHub <noreply@github.com>", data['address']
- end
-end
View
46 services/fog_bugz.rb
@@ -1,46 +0,0 @@
-service :fog_bugz do |data, payload|
-
- repository = payload['repository']['name']
- branch = payload['ref'].split('/').last
- before = payload['before']
-
- payload['commits'].each do |commit|
- commit_id = commit['id']
- message = commit["message"]
- files = commit["removed"] | commit["added"] | commit["modified"]
-
- # look for a bug id in each line of the commit message
- bug_list = []
- message.split("\n").each do |line|
- if (line =~ /\s*Bug[zs]*\s*IDs*\s*[#:; ]+((\d+[ ,:;#]*)+)/i)
- bug_list << $1.to_i
- end
- end
-
- # for each found bugzid, submit the files to fogbugz.
- bug_list.each do |fb_bugzid|
- files.each do |f|
- fb_repo = CGI.escape("#{repository}")
- fb_r1 = CGI.escape("#{before}")
- fb_r2 = CGI.escape("#{commit_id}")
- fb_file = CGI.escape("#{branch}/#{f}")
-
- # build the GET request, and send it to fogbugz
- if data['fb_version'] == '7.0'
- fb_url = "#{data['cvssubmit_url']}?ixBug=#{fb_bugzid}&sFile=#{fb_file}&sPrev=#{fb_r1}&sNew=#{fb_r2}&ixRepository=#{data['fb_repoid']}"
- else
- # FogBugz 6.1
- fb_url = "#{data['cvssubmit_url']}?ixBug=#{fb_bugzid}&sRepo=#{fb_repo}&sFile=#{fb_file}&sPrev=#{fb_r1}&sNew=#{fb_r2}"
- end
- url = URI.parse(fb_url)
- conn = Net::HTTP.new(url.host, url.port)
- conn.use_ssl = url.scheme == "https"
- conn.verify_mode = OpenSSL::SSL::VERIFY_NONE
- conn.start do |http|
- http.get(url.path + '?' + url.query)
- end
-
- end
- end
- end
-end
View
3 services/forwarding.rb
@@ -1,3 +0,0 @@
-service :forwarding do |data, payload|
- Net::HTTP.post_form(URI.parse(data['url']), payload)
-end
View
23 services/freckle.rb
@@ -1,23 +0,0 @@
-service :freckle do |data, payload|
-
- entries, subdomain, token, project =
- [], data['subdomain'].strip, data['token'].strip, data['project'].strip
-
- payload['commits'].each do |commit|
- minutes = (commit["message"].split(/\s/).find { |item| /^f:/ =~ item } || '')[2,100]
- next unless minutes
- entries << {
- :date => commit["timestamp"],
- :minutes => minutes,
- :description => commit["message"].gsub(/(\s|^)f:.*(\s|$)/, '').strip,
- :url => commit['url'],
- :project_name => project,
- :user => commit['author']['email']
- }
- end
- uri = URI.parse("http://#{data['subdomain']}.letsfreckle.com/api/entries/import")
- req = Net::HTTP::Post.new(uri.path)
- req.set_content_type('application/json')
- req.body = { :entries => entries, :token => data['token'] }.to_json
- Net::HTTP.new(uri.host, uri.port).start {|http| http.request(req) }
-end
View
15 services/friend_feed.rb
@@ -1,15 +0,0 @@
-service :friend_feed do |data, payload|
- repository = payload['repository']['name']
- friendfeed_url = URI.parse("http://friendfeed.com/api/share")
-
- payload['commits'].each do |commit|
- title = "#{commit['author']['name']} just committed a change to #{repository} on GitHub"
- comment = "#{commit['id']} - #{commit['message']}"
-
- req = Net::HTTP::Post.new(friendfeed_url.path)
- req.basic_auth(data['nickname'], data['remotekey'])
- req.set_form_data('title' => title, 'link' => commit['url'], 'comment' => comment, 'via' => 'github')
-
- Net::HTTP.new(friendfeed_url.host, friendfeed_url.port).start { |http| http.request(req) }
- end
-end
View
84 services/irc.rb
@@ -1,84 +0,0 @@
-service :irc do |data, payload|
- next if payload['commits'].empty?
-
- repository = payload['repository']['name']
- branch = (payload['ref'] =~ /^refs\/heads\/(.+)$/ ? $1 : payload['ref'])
- rooms = data['room'].gsub(",", " ").split(" ").map{|room| room[0].chr == '#' ? room : "##{room}"}
- botname = data['nick'].to_s.empty? ? "GitHub#{rand(200)}" : data['nick']
- socket = nil
-
- begin
- Timeout.timeout(2) do
- socket = TCPSocket.open(data['server'], data['port'])
- end
- rescue Timeout::Error
- throw :halt, 400
- end
-
- messages =
- payload['commits'].map do |commit|
- short = commit['message'].split("\n", 2).first
- short += ' ...' if short != commit['message']
- author = commit['author']['name']
- sha1 = commit['id']
- files = Array(commit['modified'])
- dirs = files.map { |file| File.dirname(file) }.uniq
- "\002#{repository}:\002 \00307#{branch}\003 \00303#{author}\003 * " +
- "\002#{sha1[0..6]}\002 (#{files.size} files in #{dirs.size} dirs): #{short}"
- end
-
- if messages.size > 1
- before, after = payload['before'][0..6], payload['after'][0..6]
- compare_url = payload['repository']['url'] + "/compare/#{before}...#{after}"
- tiny_url = shorten_url(compare_url)
- summary = "\002#{repository}:\002 \00307#{branch}\003 commits " +
- "\002#{before}\002...\002#{after}\002 - #{tiny_url}"
- messages << summary
- else
- commit = payload['commits'][0]
- tiny_url = shorten_url(commit['url'])
- messages[0] << " - #{tiny_url}"
- end
-
- if data['ssl'].to_i == 1
- ssl_context = OpenSSL::SSL::SSLContext.new
- ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
- ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
- ssl_socket.sync_close = true
- ssl_socket.connect
- irc = ssl_socket
- else
- irc = socket
- end
-
- irc.puts "PASS #{data['password']}" unless data['password'].empty?
- irc.puts "NICK #{botname}"
- irc.puts "USER #{botname} 8 * :GitHub IRCBot"
-
- begin
- Timeout.timeout(10) do
- loop do
- case irc.gets
- when / 004 #{botname} /
- break
- when /^PING\s*:\s*(.*)$/
- irc.puts "PONG #{$1}"
- end
- end
- end
- rescue Timeout::Error
- throw :halt, 400
- end
-
- rooms.each do |room|
- room, pass = room.split("::")
- irc.puts "JOIN #{room} #{pass}"
- messages.each do |message|
- irc.puts "PRIVMSG #{room} :#{message}"
- end
- irc.puts "PART #{room}"
- end
-
- irc.puts "QUIT"
- irc.gets until irc.eof?
-end
View
39 services/jabber.rb
@@ -1,39 +0,0 @@
-# Jabber::Simple does some insane kind of queueing if it thinks
-# we are not in their buddy list (which is always) so messages
-# never get sent before we disconnect. This forces the library
-# to assume the recipient is a buddy.
-class Jabber::Simple
- def subscribed_to?(x); true; end
-end
-
-service :jabber do |data, payload|
- repository = payload['repository']['name']
- branch = payload['ref'].split('/').last
- im = Jabber::Simple.new(jabber_user, jabber_password)
-
-
- # Accept any friend request
- im.accept_subscriptions = true
-
- #Split multiple addresses into array, removing duplicates
- recipients = data['user'].split(',').uniq.collect(&:strip)
-
- #Send message to each member in array (Limit to 25 members to prevent overloading something, if this is not and issue, just remove the [0..24] from recipients
- recipients[0..24].each do |recipient|
- # Ask recipient to be our buddy if need be
- im.add(recipient)
-
-
- payload['commits'].each do |commit|
- sha1 = commit['id']
- im.deliver recipient, <<EOM
-#{repository}: #{commit['author']['name']} #{branch} SHA1-#{sha1[0..6]}"
-
-#{commit['message']}
-#{commit['url']}
-EOM
- end
- end
-
- im.disconnect
-end
View
34 services/lighthouse.rb
@@ -1,34 +0,0 @@
-service :lighthouse do |data, payload|
- payload['commits'].each do |commit|
- next if commit['message'] =~ /^x /
-
- commit_id = commit['id']
- added = commit['added'].map { |f| ['A', f] }
- removed = commit['removed'].map { |f| ['R', f] }
- modified = commit['modified'].map { |f| ['M', f] }
- diff = YAML.dump(added + removed + modified)
-
- diff = YAML.dump([]) if data['private']
-
- title = "Changeset [%s] by %s" % [commit_id, commit['author']['name']]
- body = "#{commit['message']}\n#{commit['url']}"
- changeset_xml = <<-XML.strip
- <changeset>
- <title>#{CGI.escapeHTML(title)}</title>
- <body>#{CGI.escapeHTML(body)}</body>
- <changes type="yaml">#{CGI.escapeHTML(diff)}</changes>
- <committer>#{CGI.escapeHTML(commit['author']['name'])}</committer>
- <revision>#{CGI.escapeHTML(commit_id)}</revision>
- <changed-at type="datetime">#{CGI.escapeHTML(commit['timestamp'])}</changed-at>
- </changeset>
- XML
-
- account = "http://#{data['subdomain']}.lighthouseapp.com"
- url = URI.parse('%s/projects/%d/changesets.xml' % [account, data['project_id']])
- req = Net::HTTP::Post.new(url.path)
- req.basic_auth data['token'], 'x'
- req.body = changeset_xml
- req.set_content_type('application/xml')
- Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
- end
-end
View
34 services/presently.rb
@@ -1,34 +0,0 @@
-service :presently do |data, payload|
- repository = payload['repository']['name']
- url = URI.parse("https://#{data['subdomain']}.presentlyapp.com/api/twitter/statuses/update.xml")
-
- prefix = (data['group_name'].nil? || data['group_name'] == '') ? '' : "b #{data['group_name']} "
-
- payload['commits'].each do |commit|
-
- status = "#{prefix}[#{repository}] #{commit['author']['name']} - #{commit['message']}"
- status = status[0...137] + '...' if status.length > 140
-
- paste = "\"Commit #{commit['id']}\":#{commit['url']}\n\n"
- paste << "#{commit['message']}\n\n"
-
- %w(added modified removed).each do |kind|
- commit[kind].each do |filename|
- paste << "* *#{kind.capitalize}* '#{filename}'\n"
- end
- end
-
- req = Net::HTTP::Post.new(url.path)
- req.basic_auth(data['username'], data['password'])
- req.set_form_data(
- 'status' => status,
- 'source' => 'GitHub',
- 'paste_format' => 'textile',
- 'paste_text' => paste
- )
-
- net = Net::HTTP.new(url.host, 443)
- net.use_ssl = true
- net.start { |http| http.request(req) }
- end
-end
View
4 services/rdocinfo.rb
@@ -1,4 +0,0 @@
-service :rdocinfo do |data, payload|
- Net::HTTP.post_form(URI.parse("http://rdoc.info/projects/update"), :payload => JSON.generate(payload))
- "namaste"
-end
View
12 services/rubyforge.rb
@@ -1,12 +0,0 @@
-service :rubyforge do |data, payload|
- repository = payload['repository']['name']
- branch = payload['ref'].split('/').last
- payload['commits'].each do |commit|
- id = commit['id']
- rf = RubyForge.new(data['username'], data['password'])
- group_id = data['groupid']
- subject = "Commit Notification (#{repository}/#{branch}): #{id}"
- body = "`#{commit['message']}`, pushed by #{commit['author']['name']} (#{commit['author']['email']}). View more details for this change at #{commit['url']}."
- rf.post_news(group_id, subject, body)
- end
-end
View
5 services/run_code_run.rb
@@ -1,5 +0,0 @@
-service :run_code_run do |data, payload|
- runcoderun_url = URI.parse("http://runcoderun.com/github")
- Net::HTTP.post_form(runcoderun_url, :payload => JSON.generate(payload))
- "this output here to make the Sinatra happy when testing a GitHub service, biznatch!"
-end
View
24 services/statusnet.rb
@@ -1,24 +0,0 @@
-service :statusnet do |data, payload|
- repository = payload['repository']['name']
- url = URI.parse(data['server'] + "/api/statuses/update.xml")
- statuses = Array.new
-
- if data['digest'] == '1'
- commit = payload['commits'][-1]
- tiny_url = shorten_url(payload['repository']['url'] + '/commits/' + payload['ref'].split('/')[-1])
- statuses.push "[#{repository}] #{tiny_url} #{commit['author']['name']} - #{payload['commits'].length} commits"
- else
- payload['commits'].each do |commit|
- tiny_url = shorten_url(commit['url'])
- statuses.push "[#{repository}] #{tiny_url} #{commit['author']['name']} - #{commit['message']}"
- end
- end
-
- statuses.each do |status|
- req = Net::HTTP::Post.new(url.path)
- req.basic_auth(data['username'], data['password'])
- req.set_form_data('status' => status, 'source' => 'github')
-
- Net::HTTP.new(url.host, url.port).start { |http| http.request(req) }
- end
-end
View
32 services/talker.rb
@@ -1,32 +0,0 @@
-service :talker do |data, payload|
- repository = payload['repository']['name']
- branch = payload['ref'].split('/').last
- commits = payload['commits']
- token = data['token']
- url = URI.parse("#{data['url']}/messages.json")
-
- if data['digest'] == 1
- commit = commits.last
- message = "[#{repository}/#{branch}] #{commit['message']} (+#{commits.size - 1} more commits...) - #{commit['author']['name']} (#{commit['url']}))"
-
- req = Net::HTTP::Post.new(url.path)
- req["X-Talker-Token"] = "#{token}"
- req.set_form_data('message' => message)
-
- http = Net::HTTP.new(url.host, url.port)
- http.use_ssl = true if url.port == 443 || url.instance_of?(URI::HTTPS)
- http.start { |http| http.request(req) }
- else
- commits.each do |commit|
- message = "[#{repository}/#{branch}] #{commit['message']} - #{commit['author']['name']} (#{commit['url']})"
-
- req = Net::HTTP::Post.new(url.path)
- req["X-Talker-Token"] = "#{token}"
- req.set_form_data('message' => message)
-
- http = Net::HTTP.new(url.host, url.port)
- http.use_ssl = true if url.port == 443 || url.instance_of?(URI::HTTPS)
- http.start { |http| http.request(req) }
- end
- end
-end
View
7 services/trac.rb
@@ -1,7 +0,0 @@
-service :trac do |data, payload|
- #The data['url'] may contain a subdirectory, so this fails
- #url = URI.join(data['url'], '/github/', data['token'])
- url_value = data['url'].chomp('/')
- url = "#{url_value}/github/#{data['token']}"
- Net::HTTP.post_form(URI.parse(url), payload)
-end
View
24 services/twitter.rb
@@ -1,24 +0,0 @@
-service :twitter do |data, payload|
- repository = payload['repository']['name']
- url = URI.parse("http://twitter.com/statuses/update.xml")
- statuses = Array.new
-
- if data['digest'] == '1'
- commit = payload['commits'][-1]
- tiny_url = shorten_url(payload['repository']['url'] + '/commits/' + payload['ref'].split('/')[-1])
- statuses.push "[#{repository}] #{tiny_url} #{commit['author']['name']} - #{payload['commits'].length} commits"
- else
- payload['commits'].each do |commit|
- tiny_url = shorten_url(commit['url'])
- statuses.push "[#{repository}] #{tiny_url} #{commit['author']['name']} - #{commit['message']}"
- end
- end
-
- statuses.each do |status|
- req = Net::HTTP::Post.new(url.path)
- req.basic_auth(data['username'], data['password'])
- req.set_form_data('status' => status, 'source' => 'github')
-
- Net::HTTP.new(url.host, url.port).start { |http| http.request(req) }
- end
-end
View
4 services/web_translate_it.rb
@@ -1,4 +0,0 @@
-service :web_translate_it do |data, payload|
- wti_url = URI.parse("https://webtranslateit.com/api/projects/#{data['api_key']}/refresh_files")
- Net::HTTP.post_form(wti_url, :payload => JSON.generate(payload))
-end
View
123 spec/freckle_spec.rb
@@ -1,123 +0,0 @@
-require 'sinatra'
-require 'sinatra/test/rspec'
-require 'github-services'
-
-describe 'service freckle' do
-
- before(:each) do
- @req = mock('req')
- @req.stub!(:set_content_type)
- @req.class_eval do
- attr_accessor :body
- end
- Net::HTTP::Post.stub!(:new).and_return(@req)
- Net::HTTP.stub!(:new).and_return(mock('nethttp', :start => nil))
- end
-
- it 'should be ok' do
- do_request
- @response.should be_ok
- end
-
- it 'should post with 2 entries' do
- do_request
- @data['entries'].size.should == 2
- end
-
- it 'should include auth token' do
- do_request
- @data['token'].should == '12345'
- end
-
- it 'should parse the amount of minutes from the commit message' do
- do_request
- @data['entries'][0]['minutes'].should == '15'
- @data['entries'][1]['minutes'].should == '2hrs'
- end
-
- it 'should strip freckle tags from description' do
- do_request
- @data['entries'][0]['description'].should == 'stub git call for Grit#heads test'
- @data['entries'][1]['description'].should == 'clean up heads test'
- end
-
- it 'should include project name' do
- do_request
- @data['entries'][0]['project_name'].should == 'Test Project'
- end
-
- it 'should include author email as user' do
- do_request
- @data['entries'][0]['user'].should == 'tom@mojombo.com'
- end
-
- it 'should include commit url' do
- do_request
- @data['entries'][0]['url'].should == 'http://github.com/mojombo/grit/commit/06f63b43050935962f84fe54473a7c5de7977325'
- end
-
- it 'should include timestamp as date' do
- do_request
- @data['entries'][0]['date'].should == '2007-10-10T00:11:02-07:00'
- end
-
- def do_request
- post '/freckle/', :data => data.to_json, :payload => payload.to_json
- @data = JSON.parse(@req.body)
- end
-
- def data
- {
- "subdomain" => "abloom",
- "token" => "12345",
- "project" => "Test Project"
- }
- end
-
- def payload
- {
- "after" => "a47fd41f3aa4610ea527dcc1669dfdb9c15c5425",
- "ref" => "refs/heads/master",
- "before" => "4c8124ffcf4039d292442eeccabdeca5af5c5017",
-
- "repository" => {
- "name" => "grit",
- "url" => "http://github.com/mojombo/grit",
- "owner" => { "name" => "mojombo", "email" => "tom@mojombo.com" }
- },
-
- "commits" => [
- {
- "removed" => [],
- "message" => "stub git call for Grit#heads test f:15",
- "added" => [],
- "timestamp" => "2007-10-10T00:11:02-07:00",
- "modified" => ["lib/grit/grit.rb", "test/helper.rb", "test/test_grit.rb"],
- "url" => "http://github.com/mojombo/grit/commit/06f63b43050935962f84fe54473a7c5de7977325",
- "author" => { "name" => "Tom Preston-Werner", "email" => "tom@mojombo.com" },
- "id" => "06f63b43050935962f84fe54473a7c5de7977325"
- },
- {
- "removed" => [],
- "message" => "clean up heads test f:2hrs",
- "added" => [],
- "timestamp" => "2007-10-10T00:18:20-07:00",
- "modified" => ["test/test_grit.rb"],
- "url" => "http://github.com/mojombo/grit/commit/5057e76a11abd02e83b7d3d3171c4b68d9c88480",
- "author" => { "name" => "Tom Preston-Werner", "email" => "tom@mojombo.com" },
- "id" => "5057e76a11abd02e83b7d3d3171c4b68d9c88480"
- },
- {
- "removed" => [],
- "message" => "add more comments throughout",
- "added" => [],
- "timestamp" => "2007-10-10T00:50:39-07:00",
- "modified" => ["lib/grit.rb", "lib/grit/commit.rb", "lib/grit/grit.rb"],
- "url" => "http://github.com/mojombo/grit/commit/a47fd41f3aa4610ea527dcc1669dfdb9c15c5425",
- "author" => { "name" => "Tom Preston-Werner", "email" => "tom@mojombo.com" },
- "id" => "a47fd41f3aa4610ea527dcc1669dfdb9c15c5425"
- }
- ]
- }
- end
-end
View
2 spec/spec.opts
@@ -1,2 +0,0 @@
---color
-
View
3 vendor/.require_paths
@@ -1,3 +0,0 @@
-lib
-ext/tmailscanner
-bin
View
1,257 vendor/activesupport-2.2.2/CHANGELOG
@@ -1,1257 +0,0 @@
-*2.2 (November 21st, 2008)*
-
-* TimeZone offset tests: use current_period, to ensure TimeZone#utc_offset is up-to-date [Geoff Buesing]
-
-* Update bundled TZInfo to 0.3.12 [Geoff Buesing]
-
-* Increment the version of our altered memcache-client to prevent confusion caused when the 1.5.0 gem is installed.
-
-* Fixed the option merging in Array#to_xml #1126 [Rudolf Gavlas]
-
-* Make I18n::Backend::Simple reload its translations in development mode [DHH/Sven Fuchs]
-
-* TimeWithZone#freeze: preload instance variables so that we can actually freeze [Geoff Buesing]
-
-* Fix Brasilia timezone #1180 [Marcus Derencius, Kane]
-
-* Time#advance recognizes fractional days and weeks. Deprecate Durations of fractional months and years #970 [Tom Lea]
-
-* Add ActiveSupport::Rescuable module abstracting ActionController::Base rescue_from features. [Norbert Crombach, Pratik]
-
-* Switch from String#chars to String#mb_chars for the unicode proxy. [Manfred Stienstra]
-
- This helps with 1.8.7 compatibility and also improves performance for some operations by reducing indirection.
-
-* TimeWithZone #wday, #yday and #to_date avoid trip through #method_missing [Geoff Buesing]
-
-* Added Time, Date, DateTime and TimeWithZone #past?, #future? and #today? #720 [Clemens Kofler, Geoff Buesing]
-
-* Fixed Sri Jayawardenepura time zone to map to Asia/Colombo [Jamis Buck]
-
-* Added Inflector#parameterize for easy slug generation ("Donald E. Knuth".parameterize => "donald-e-knuth") #713 [Matt Darby]
-
-* Changed cache benchmarking to be reported in milliseconds [DHH]
-
-* Fix Ruby's Time marshaling bug in pre-1.9 versions of Ruby: utc instances are now correctly unmarshaled with a utc zone instead of the system local zone [#900 state:resolved] [Luca Guidi, Geoff Buesing]
-
-* Add Array#in_groups which splits or iterates over the array in specified number of groups. #579. [Adrian Mugnolo] Example:
-
- a = (1..10).to_a
- a.in_groups(3) #=> [[1, 2, 3, 4], [5, 6, 7, nil], [8, 9, 10, nil]]
- a.in_groups(3, false) #=> [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
-
-* Fix TimeWithZone unmarshaling: coerce unmarshaled Time instances to utc, because Ruby's marshaling of Time instances doesn't respect the zone [Geoff Buesing]
-
-* Added Memoizable mixin for caching simple lazy loaded attributes [Josh Peek]
-
-* Move the test related core_ext stuff out of core_ext so it's only loaded by the test helpers. [Michael Koziarski]
-
-* Add Inflection rules for String#humanize. #535 [dcmanges]
-
- ActiveSupport::Inflector.inflections do |inflect|
- inflect.human(/_cnt$/i, '\1_count')
- end
-
- 'jargon_cnt'.humanize # => 'Jargon count'
-
-* TimeWithZone: when crossing DST boundary, treat Durations of days, months or years as variable-length, and all other values as absolute length. A time + 24.hours will advance exactly 24 hours, but a time + 1.day will advance 23-25 hours, depending on the day. Ensure consistent behavior across all advancing methods [Geoff Buesing]
-
-* Added TimeZone #=~, to support matching zones by regex in time_zone_select. #195 [Ernie Miller]
-
-* Added Array#second through Array#fifth as aliases for Array#[1] through Array#[4] + Array#forty_two as alias for Array[41] [DHH]
-
-* Added test/do declaration style testing to ActiveSupport::TestCase [DHH via Jay Fields]
-
-* Added Object#present? which is equivalent to !Object#blank? [DHH]
-
-* Added Enumberable#many? to encapsulate collection.size > 1 [DHH/Damian Janowski]
-
-* Add more standard Hash methods to ActiveSupport::OrderedHash [Steve Purcell]
-
-* Namespace Inflector, Dependencies, OrderedOptions, and TimeZone under ActiveSupport [Josh Peek]
-
-* Added StringInquirer for doing things like StringInquirer.new("production").production? # => true and StringInquirer.new("production").development? # => false [DHH]
-
-* Fixed Date#end_of_quarter to not blow up on May 31st [#289 state:resolved] (Danger)
-
-
-*2.1.0 (May 31st, 2008)*
-
-* TimeZone#to_s shows offset as GMT instead of UTC, because GMT will be more familiar to end users (see time zone selects used by Windows OS, google.com and yahoo.com.) Reverts [8370] [Geoff Buesing]
-
-* Hash.from_xml: datetime xml types overflow to Ruby DateTime class when out of range of Time. Adding tests for utc offsets [Geoff Buesing]
-
-* TimeWithZone #+ and #- : ensure overflow to DateTime with Numeric arg [Geoff Buesing]
-
-* Time#to_json: don't convert to utc before encoding. References #175 [Geoff Buesing]
-
-* Remove unused JSON::RESERVED_WORDS, JSON.valid_identifier? and JSON.reserved_word? methods. Resolves #164. [Cheah Chu Yeow]
-
-* Adding Date.current, which returns Time.zone.today if config.time_zone is set; otherwise returns Date.today [Geoff Buesing]
-
-* TimeWithZone: date part getter methods (#year #mon #day etc) are defined on class; no longer relying on method_missing [Geoff Buesing]
-
-* Time.zone.parse return nil for strings with no date information [Geoff Buesing]
-
-* Time.zone.parse respects offset information in string. Resolves #105. [Scott Fleckenstein, Geoff Buesing]
-
-* Added Ruby 1.8 implementation of Process.daemon
-
-* Duration #since and #ago with no argument (e.g., 5.days.ago) return TimeWithZone when config.time_zone is set. Introducing Time.current, which returns Time.zone.now if config.time_zone is set, otherwise just returns Time.now [Geoff Buesing]
-
-* Time#since behaves correctly when passed a Duration. Closes #11527 [kemiller]
-
-* Add #getutc alias for DateTime#utc [Geoff Buesing]
-
-* Refactor TimeWithZone: don't send #since, #ago, #+, #-, #advance through method_missing [Geoff Buesing]
-
-* TimeWithZone respects config.active_support.use_standard_json_time_format [Geoff Buesing]
-
-* Add config.active_support.escape_html_entities_in_json to allow disabling of html entity escaping. [rick]
-
-* Improve documentation. [Xavier Noria]
-
-* Modified ActiveSupport::Callbacks::Callback#call to accept multiple arguments.
-
-* Time #yesterday and #tomorrow behave correctly crossing DST boundary. Closes #7399 [sblackstone]
-
-* TimeWithZone: Adding tests for dst and leap day edge cases when advancing time [Geoff Buesing]
-
-* TimeWithZone#method_missing: send to utc to advance with dst correctness, otherwise send to time. Adding tests for time calculations methods [Geoff Buesing]
-
-* Add config.active_support.use_standard_json_time_format setting so that Times and Dates export to ISO 8601 dates. [rick]
-
-* TZInfo: Removing unneeded TimezoneProxy class [Geoff Buesing]
-
-* TZInfo: Removing unneeded TimezoneIndexDefinition, since we're not including Indexes::Timezones [Geoff Buesing]
-
-* Removing unnecessary uses_tzinfo helper from tests, given that TZInfo is now bundled [Geoff Buesing]
-
-* Bundling abbreviated version of TZInfo gem 0.3.8: only the classes and zone definitions required to support Rails time zone features are included. If a recent version of the full TZInfo gem is installed, this will take precedence over the bundled version [Geoff Buesing]
-
-* TimeWithZone#marshal_load does zone lookup via Time.get_zone, so that tzinfo/Olson identifiers are handled [Geoff Buesing]
-
-* Time.zone= accepts TZInfo::Timezone instances and Olson identifiers; wraps result in TimeZone instance [Geoff Buesing]
-
-* TimeWithZone time conversions don't need to be wrapped in TimeOrDateTime, because TZInfo does this internally [Geoff Buesing]
-
-* TimeWithZone#usec returns 0 instead of error when DateTime is wrapped [Geoff Buesing]
-
-* Improve documentation. [Radar, Jan De Poorter, chuyeow, xaviershay, danger, miloops, Xavier Noria, Sunny Ripert]
-
-* Ensure that TimeWithZone#to_yaml works when passed a YAML::Emitter. [rick]
-
-* Ensure correct TimeWithZone#to_date [Geoff Buesing]
-
-* Make TimeWithZone work with tzinfo 0.2.x: use TZInfo::Timezone#zone_identifier alias for #abbreviation, silence warnings on tests. Raise LoadError when TZInfo version is < 0.2 by sniffing for TZInfo::TimeOrDateTime constant. Move all tzinfo-dependent TimeZone tests into uses_tzinfo block [Geoff Buesing]
-
-* Time, DateTime and TimeWithZone #in_time_zone defaults to Time.zone. Removing now unneeded #in_current_time_zone [Geoff Buesing]
-
-* TZInfo caches Timezone instances in its own internal hash cache, so TimeZone::MAPPING doesn't need to cache them as well [Geoff Buesing]
-
-* Adding TimeZone#parse [Geoff Buesing]
-
-* Adding TimeZone#at and DateTime#to_f [Geoff Buesing]
-
-* TimeWithZone responds to Ruby 1.9 weekday-named query methods [Geoff Buesing]
-
-* TimeWithZone caches TZInfo::TimezonePeriod used for time conversion so that it can be reused, and enforces DST rules correctly when instance is created from a local time [Geoff Buesing]
-
-* Fixed that BufferedLogger should create its own directory if one doesn't already exist #11285 [lotswholetime]
-
-* Fix Numeric time tests broken by DST change by anchoring them to fixed times instead of Time.now. Anchor TimeZone#now DST test to time specified with Time.at instead of Time.local to work around platform differences with Time.local and DST representation [Geoff Buesing]
-
-* Removing unneeded #change_time_zone method from Time, DateTime and TimeWithZone [Geoff Buesing]
-
-* TimeZone #local and #now correctly enforce DST rules [Geoff Buesing]
-
-* TimeWithZone instances correctly enforce DST rules. Adding TimeZone#period_for_utc [Geoff Buesing]
-
-* test_time_with_datetime_fallback expects DateTime.local_offset instead of DateTime.now.offset [Geoff Buesing]
-
-* Adding TimeWithZone #marshal_dump and #marshal_load [Geoff Buesing]
-
-* Add OrderedHash#to_hash [josh]
-
-* Adding Time#end_of_day, _quarter, _week, and _year. #9312 [Juanjo Bazan, Tarmo Tänav, BigTitus]
-
-* Adding TimeWithZone#between? [Geoff Buesing]
-
-* Time.=== returns true for TimeWithZone instances [Geoff Buesing]
-
-* TimeWithZone #+ and #- behave consistently with numeric arguments regardless of whether wrapped time is a Time or DateTime; consistenty answers false to #acts_like?(:date) [Geoff Buesing]
-
-* Add String#squish and String#squish! to remove consecutive chunks of whitespace. #11123 [jordi, Henrik N]
-
-* Serialize BigDecimals as Floats when using to_yaml. #8746 [ernesto.jimenez]
-
-* Adding TimeWithZone #to_yaml, #to_datetime, #eql? and method aliases for duck-typing compatibility with Time [Geoff Buesing]
-
-* TimeWithZone #in_time_zone returns +self+ if zone argument is the same as #time_zone [Geoff Buesing]
-
-* Adding TimeWithZone #to_a, #to_f, #to_i, #httpdate, #rfc2822 [Geoff Buesing]
-
-* Pruning unneeded TimeWithZone#change_time_zone_to_current [Geoff Buesing]
-
-* Time#zone=, #in_time_zone and #change_time_zone accept a Duration [Geoff Buesing]
-
-* Time#in_time_zone handles Time.local instances correctly [Geoff Buesing]
-
-* Pruning unneeded Time#change_time_zone_to_current. Enhanced docs to #change_time_zone to explain the difference between this method and #in_time_zone [Geoff Buesing]
-
-* TimeZone#new method renamed #local; when used with Time.zone, constructor now reads: Time.zone.local() [Geoff Buesing]
-
-* Added Base64.encode64s to encode values in base64 without the newlines. This makes the values immediately usable as URL parameters or memcache keys without further processing [DHH]
-
-* Remove :nodoc: entries around the ActiveSupport test/unit assertions. #10946 [dancroak, jamesh]
-
-* Add Time.zone_default accessor for setting the default time zone. Rails::Configuration.time_zone sets this. #10982 [Geoff Buesing]
-
-* cache.fetch(key, :force => true) to force a cache miss. [Jeremy Kemper]
-
-* Support retrieving TimeZones with a Duration. TimeZone[-28800] == TimeZone[-480.minutes]. [rick]
-
-* TimeWithZone#- added, so that #- can handle a Time or TimeWithZone argument correctly [Geoff Buesing]
-
-* with_timezone test helper renamed with_env_tz, to distinguish between setting ENV['TZ'] and setting Time.zone in tests [Geoff Buesing]
-
-* Time#- coerces TimeWithZone argument to a Time instance so that difference in seconds can be calculated. Closes #10914 [Geoff Buesing, yyyc514]
-
-* Adding UTC zone to TimeZone; TimeWithZone no longer has to fake UTC zone with nil [Geoff Buesing]
-
-* Time.get_zone refactored to private method, given that the encapsulated logic is only useful internally [Geoff Buesing]
-
-* Time.zone uses thread-local variable for thread safety. Adding Time.use_zone, for overriding Time.zone locally inside a block. Removing unneeded Time.zone_reset! [Geoff Buesing]
-
-* TimeZone#to_s uses UTC rather than GMT; reapplying change that was undone in [8679]. #1689 [Cheah Chu Yeow]
-
-* Time.days_in_month defaults to current year if no year is supplied as argument #10799 [Radar], uses Date.gregorian_leap? to determine leap year, and uses constant lookup to determine days in month [Geoff Buesing]
-
-* Adding Time and DateTime #compare_with_coercion, which layers behavior on #<=> so that any combination of Time, DateTime and ActiveSupport::TimeWithZone instances can be chronologically compared [Geoff Buesing]
-
-* TimeZone#now returns an ActiveSupport::TimeWithZone [Geoff Buesing]
-
-* Time #in_current_time_zone and #change_time_zone_to_current return self when Time.zone is nil [Geoff Buesing]
-
-* Remove unneeded #to_datetime_default_s alias for DateTime#to_s, given that we inherit a #to_default_s from Date that does exactly the same thing [Geoff Buesing]
-
-* Refactor Time and DateTime #to_formatted_s: use ternary instead of nested if/else [Geoff Buesing]
-
-* Adding Time and DateTime #formatted_offset, for outputting +HH:MM utc offset strings with cross-platform consistency [Geoff Buesing]
-
-* Adding alternate_utc_string option to TimeZone#formatted_offset. Removing unneeded TimeZone#offset. [Geoff Buesing]
-
-* Introduce ActiveSupport::TimeWithZone, for wrapping Time instances with a TimeZone. Introduce instance methods to Time for creating TimeWithZone instances, and class methods for managing a global time zone. [Geoff Buesing]
-
-* Replace non-dst-aware TimeZone class with dst-aware class from tzinfo_timezone plugin. TimeZone#adjust and #unadjust are no longer available; tzinfo gem must now be present in order to perform time zone calculations, via #local_to_utc and #utc_to_local methods. [Geoff Buesing]
-
-* Extract ActiveSupport::Callbacks from Active Record, test case setup and teardown, and ActionController::Dispatcher. #10727 [Josh Peek]
-
-* Introducing DateTime #utc, #utc? and #utc_offset, for duck-typing compatibility with Time. Closes #10002 [Geoff Buesing]
-
-* Time#to_json uses Numeric#to_utc_offset_s to output a cross-platform-consistent representation without having to convert to DateTime. References #9750 [Geoff Buesing]
-
-* Refactor number-to-HH:MM-string conversion logic from TimeZone#formatted_offset to a reusable Numeric#to_utc_offset_s method. [Geoff Buesing]
-
-* Continue evolution toward ActiveSupport::TestCase. #10679 [Josh Peek]
-
-* TestCase: introduce declared setup and teardown callbacks. Pass a list of methods and an optional block to call before setup or after teardown. Setup callbacks are run in the order declared; teardown callbacks are run in reverse. [Jeremy Kemper]
-
-* Added ActiveSupport::Gzip.decompress/compress(source) as an easy wrapper for Zlib [Tobias Luetke]
-