amqp 0.8.0.rc14 → 0.8.0.rc15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/.travis.yml +3 -3
  2. data/Gemfile +9 -6
  3. data/README.md +18 -12
  4. data/amqp.gemspec +2 -2
  5. data/bin/docup +3 -0
  6. data/docs/08Migration.textile +67 -5
  7. data/docs/AMQP091ModelExplained.textile +138 -101
  8. data/docs/Bindings.textile +109 -8
  9. data/docs/ConnectingToTheBroker.textile +8 -0
  10. data/docs/ConnectionEncryptionWithTLS.textile +5 -0
  11. data/docs/DocumentationGuidesIndex.textile +21 -5
  12. data/docs/Durability.textile +3 -1
  13. data/docs/ErrorHandling.textile +20 -0
  14. data/docs/Exchanges.textile +7 -1
  15. data/docs/GettingStarted.textile +10 -0
  16. data/docs/PatternsAndUseCases.textile +6 -0
  17. data/docs/Queues.textile +7 -1
  18. data/docs/RabbitMQVersions.textile +6 -1
  19. data/docs/RunningTests.textile +8 -3
  20. data/docs/Troubleshooting.textile +31 -0
  21. data/docs/VendorSpecificExtensions.textile +137 -6
  22. data/examples/extensions/rabbitmq/per_queue_message_ttl.rb +24 -25
  23. data/examples/extensions/rabbitmq/publisher_confirmations_with_transient_messages.rb +11 -20
  24. data/examples/extensions/rabbitmq/using_alternate_exchanges.rb +28 -0
  25. data/examples/hello_world.rb +1 -1
  26. data/lib/amqp.rb +1 -0
  27. data/lib/amqp/compatibility/ruby187_patchlevel_check.rb +2 -0
  28. data/lib/amqp/integration/rails.rb +17 -0
  29. data/lib/amqp/version.rb +1 -1
  30. data/spec/integration/authentication_spec.rb +2 -2
  31. data/spec/integration/fanout_exchange_routing_spec.rb +43 -199
  32. data/spec/integration/multiple_consumers_per_queue_spec.rb +7 -7
  33. data/spec/integration/regressions/concurrent_publishing_on_the_same_channel_spec.rb +1 -1
  34. data/spec/integration/stress/publishing_of_messages_with_incrementing_sizes_spec.rb +50 -0
  35. metadata +13 -9
@@ -1,12 +1,13 @@
1
1
  # @title Ruby AMQP gem: Bindings
2
2
 
3
- h1. TBD
3
+ h1. Working With Bindings
4
4
 
5
5
  h2. About this guide
6
6
 
7
7
  This guide covers bindings in AMQP 0.9.1, what they are, what role do they play and how to accomplish typical operations using
8
8
  Ruby amqp gem.
9
9
 
10
+ This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
10
11
 
11
12
  h2. Covered versions
12
13
 
@@ -16,27 +17,127 @@ This guide covers "Ruby amqp gem":http://github.com/ruby-amqp/amqp v0.8.0 and la
16
17
 
17
18
  h2. Bindings in AMQP 0.9.1
18
19
 
19
- TBD
20
+ Bindings are rules that exchanges use (among other things) to route messages to queues. To instruct an exchange E to route messages to a queue Q,
21
+ Q has to _be bound_ to E. Bindings may have an optional _routing key_ attribute used by some exchange types. The purpose of the routing key is to
22
+ selectively match only specific (matching) messages published to an exchange to the bound queue. In other words, the routing key acts like a filter.
20
23
 
24
+ Learn more about how bindings fit into the AMQP Model in the {file:docs/AMQP091ModelExplained.textile AMQP 0.9.1 Model Explained} documentation guide.
21
25
 
22
- h2. One day in life of an AMQP 0.9.1 message
23
26
 
24
- TBD
27
+ h2. What Are AMQP 0.9.1 Bindings
28
+
29
+ Bindings are rules that exchanges use (among other things) to route messages to queues. To instruct an exchange E to route messages to a queue Q,
30
+ Q has to _be bound_ to E. Bindings may have an optional _routing key_ attribute used by some exchange types. The purpose of the routing key is to
31
+ selectively match only specific (matching) messages published to an exchange to the bound queue. In other words, the routing key acts like a filter.
32
+
33
+ To draw an analogy:
34
+
35
+ * Queue is like your destination in New York city
36
+ * Exchange is like JFK airport
37
+ * Bindings are routes from JFK to your destination. There can be none or more than one way to reach it
38
+
39
+ Some exchange types use routing key while some others do not (and route messages unconditionally or based on message metadata).
40
+ If AMQP message cannot be routed to any queue (for example, because there are no bindings for the exchange it was published to), it is either
41
+ dropped or returned to the publisher, depending on message attributes the publisher has set.
42
+
43
+ If application wants to connect a queue to an exchange, it needs to _bind_ them. The opposite operation is called _unbinding_.
25
44
 
26
45
 
27
46
  h2. Binding queues to exchanges
28
47
 
29
- TBD
48
+ In order to receive messages, a queue needs to be bound to at least one exchange. Most of the time binding is explcit
49
+ (done by applications). To bind a queue to an exchange, use {AMQP::Queue#bind} where the argument passed can be
50
+ either an {AMQP::Exchange} instance or a string.
51
+
52
+ <pre>
53
+ <code>
54
+ queue.bind(exchange) do |bind_ok|
55
+ puts "Just bound #{queue.name} to #{exchange.name}"
56
+ end
57
+ </code>
58
+ </pre>
59
+
60
+ Full example:
61
+ <script src="https://gist.github.com/998727.js"> </script>
62
+
63
+ The same example using a string without callback:
64
+
65
+ <pre>
66
+ <code>
67
+ queue.bind("amq.fanout")
68
+ </code>
69
+ </pre>
70
+
71
+ Full example:
72
+ <script src="https://gist.github.com/998729.js"> </script>
30
73
 
31
74
 
32
75
  h2. Unbinding queues from exchanges
33
76
 
34
- TBD
77
+ To unbind a queue from an exchange use {AMQP::Queue#unbind}:
78
+
79
+ <pre>
80
+ <code>
81
+ queue.unbind(exchange)
82
+ </code>
83
+ </pre>
84
+
85
+ Full example:
86
+ <script src="https://gist.github.com/998742.js"> </script>
87
+
88
+ <span class="note">
89
+ Trying to unbind a queue from an exchange that the queue was never bound to will result in a
90
+ channel-level exception.
91
+ </span>
92
+
93
+
94
+ h2. Bindings, Routing and Returned Messages
95
+
96
+ h3. How AMQP 0.9.1 Brokers Route Messages
97
+
98
+ After AMQP message reaches AMQP broker and before it reaches a consumer, several things happen:
99
+
100
+ * AMQP broker needs to find one or more queues the message needs to be routed to, depending on exchange
101
+ * AMQP broker puts a copy of the message into each of those queues or decides to return the messages to the publisher
102
+ * AMQP broker pushes messages to consumers on those queues or waits for applications to fetch them on demand
103
+
104
+ A more in-depth description is this:
105
+
106
+ * AMQP broker needs to consult bindings list for the exchange the message was published to find one or more queues the message needs to be routed to (step 1)
107
+ * If there are no suitable queues found during step 1 and the message was published as mandatory, it is returned to the publisher (step 1b)
108
+ * If there are suitable queues, a _copy_ of the message is placed into each one (step 2)
109
+ * If the message was published as mandatory, but there are no active consumers for it, it is returned to the publisher (step 2b)
110
+ * If there are active consumers on those queues and basic.qos setting permits, message is pushed to those consumers (step 3)
111
+ * If there are no active consumers and the message is *not* published as mandatory, it will be left in the queue
112
+
113
+ The takeaway is that messages may or may not be routed and it is important for applications to handle unroutable messages.
114
+
115
+
116
+ h3. Handling of Unroutable Messages
117
+
118
+ Unroutable messages are either dropped or returned back to producers. Vendor-specific extensions can provide additional ways of handing of unroutable
119
+ messages: for example, RabbitMQ's "Alternate Exchanges extension":http://www.rabbitmq.com/extensions.html#alternate-exchange makes it possible to route unroutable messages to another exchange.
120
+ amqp gem support for it is documented in the {file:docs/VendorSpecificExtensions.textile Vendor-specific Extensions guide}.
121
+
122
+ RabbitMQ 2.6 will introduce a new feature callled dead letter queue where unroutable messages will be put instead of dropping them.
123
+
124
+ amqp gem provides a way to handle returned messages with the {AMQP::Exchange#on_return} method:
125
+
126
+ <pre>
127
+ <code>
128
+ exchange.on_return do |basic_return, metadata, payload|
129
+ puts "#{payload} was returned! reply_code = #{basic_return.reply_code}, reply_text = #{basic_return.reply_text}"
130
+ end
131
+ </code>
132
+ </pre>
133
+
134
+ {file:docs/Exchanges.textile Working With Exchanges} documentation guide provides more information on the subject, including full code examples.
135
+
35
136
 
36
137
 
37
- h2. Binding attributes
138
+ h2. Authors
38
139
 
39
- TBD
140
+ This guide was written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee.
40
141
 
41
142
 
42
143
 
@@ -8,6 +8,8 @@ h2. About this guide
8
8
  This guide covers connection to an AMQP broker from standalone and Web applications,
9
9
  connection error handling, authentication failure handling and related issues.
10
10
 
11
+ This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
12
+
11
13
 
12
14
  h2. Which versions of the amqp gem does this guide cover?
13
15
 
@@ -502,6 +504,12 @@ h2. What to read next
502
504
  * {file:docs/ConnectionEncryptionWithTLS.textile Using TLS (SSL)} (if you want to use an SSL encrypted connection to the broker)
503
505
 
504
506
 
507
+ h2. Authors
508
+
509
+ This guide was written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee.
510
+
511
+
512
+
505
513
  h2. Tell us what you think!
506
514
 
507
515
  Please take a moment to tell us what you think about this guide "on Twitter":http://twitter.com/rubyamqp or the "Ruby AMQP mailing list":http://groups.google.com/group/ruby-amqp.
@@ -79,6 +79,11 @@ h2. Example code
79
79
  TLS example (as well as sample certificates you can use to get started with) can be found in the "amqp gem git repository":https://github.com/ruby-amqp/amqp/tree/master/examples
80
80
 
81
81
 
82
+ h2. Authors
83
+
84
+ This guide was written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee.
85
+
86
+
82
87
 
83
88
  h2. Tell us what you think!
84
89
 
@@ -4,7 +4,7 @@ h1. Ruby AMQP gem documentation guides
4
4
 
5
5
  h2. Which versions of the amqp gem do the guides cover?
6
6
 
7
- These guides cover v0.8.0.RC13 and later of the "Ruby amqp gem":http://github.com/ruby-amqp/amqp.
7
+ These guides cover v0.8.0.RC14 and later of the "Ruby amqp gem":http://github.com/ruby-amqp/amqp.
8
8
 
9
9
 
10
10
  h2. Documentation structure and how to read these guides
@@ -29,9 +29,9 @@ Here is a summary of guides and their content:
29
29
 
30
30
  <dt>{file:docs/AMQP091ModelExplained.textile AMQP 0.9.1 Model Explained}</dt>
31
31
  <dd>
32
- Explains the AMQP 0.9.1 model, focusing on what purpose individual features have. Reading
32
+ A simple, 2 page long introduction to the AMQP 0.9.1 model, focusing on what purpose individual features have. Reading
33
33
  other documentation guides will be easier when you are armed with this knowledge: a lot of the AMQP & RabbitMQ power
34
- comes from the AMQP model.
34
+ comes from the AMQP Model.
35
35
  </dd>
36
36
 
37
37
  <dt>{file:docs/ConnectingToTheBroker.textile Connecting to the Broker}</dt>
@@ -51,8 +51,14 @@ Here is a summary of guides and their content:
51
51
  <dt>{file:docs/Exchanges.textile Working With Exchanges}</dt>
52
52
  <dd>
53
53
  What AMQP exchanges are. Concept of binding. How to declare AMQP exchanges. How different exchange types route messages and common
54
- use cases. How to publish messages, especially how to do it reliably. What AMQP transactions are. What Publisher Confirms are.
55
- How to delete an exchange.
54
+ use cases. How to publish messages, especially how to do it reliably. What AMQP transactions are. What Publisher Confirms are. When
55
+ messages are returned. How to delete an exchange.
56
+ </dd>
57
+
58
+ <dt>{file:docs/Bindings.textile Bindings}</dt>
59
+ <dd>
60
+ What AMQP bindings are, in-depth. How to bind queues to exchanges. How to unbind queues from exchanges. What's the life cycle
61
+ of messages is. How unroutable messages are handled.
56
62
  </dd>
57
63
 
58
64
  <dt>{file:docs/PatternsAndUseCases.textile Patterns and Use Cases}</dt>
@@ -101,6 +107,16 @@ h2. Full guide list
101
107
  * {file:docs/RunningTests.textile Running amqp gem test suite}
102
108
 
103
109
 
110
+ h2. License
111
+
112
+ This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
113
+
114
+ h2. Authors
115
+
116
+ These guides were written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee
117
+
118
+
119
+
104
120
  h2. Tell us what you think!
105
121
 
106
122
  Please take a moment to tell us what you think about this guide "on Twitter":http://twitter.com/rubyamqp or the "Ruby AMQP mailing list":http://groups.google.com/group/ruby-amqp.
@@ -8,6 +8,8 @@ h2. About this guide
8
8
  This guide covers queue, exchange and message durability, as well as other
9
9
  topics related to durability, for example, durability in cluster environment.
10
10
 
11
+ This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
12
+
11
13
 
12
14
  h2. Covered versions
13
15
 
@@ -43,7 +45,7 @@ AMQP broker persist them to disk. If the server is restarted, the system ensures
43
45
  are not lost. Simply publishing message to a durable exchange or the fact that queue(s) they are routed to
44
46
  is durable doesn't make messages persistent: it all depends on persistence mode of the messages itself.
45
47
  Publishing messages as persistent affects performance (just like with data stores, durability comes at a certain cost
46
- in performance and vise versa). Pass :persistent => true to {Exchange#publish} to publish your message as persistent.
48
+ in performance and vise versa). Pass :persistent => true to {AMQP::Exchange#publish} to publish your message as persistent.
47
49
 
48
50
 
49
51
  h3. Transactions
@@ -21,6 +21,7 @@ as well as
21
21
  * How to recover after a network failure
22
22
  * What is automatic recovery mode, when you should and should not use it
23
23
 
24
+ This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
24
25
 
25
26
 
26
27
  h2. Covered versions
@@ -271,6 +272,11 @@ Detecting network connections is nearly useless if AMQP-based application cannot
271
272
  in "error handling and recovery". Fortunately, recovery process for many applications follows one simple scheme that amqp
272
273
  gem can perform automatically for you.
273
274
 
275
+ <span class="note">
276
+ Recovery process, both manual and automatic, always begins with re-opening AMQP connection and then all the channels on that connection.
277
+ </span>
278
+
279
+
274
280
  h3. Manual recovery
275
281
 
276
282
  Similarly to the Shutdown Protocol, amqp gem entities implement Recovery Protocol. Recovery Protocol consists of 3 methods
@@ -286,6 +292,15 @@ re-established but before AMQP connection is reopened*. {AMQP::Session#after_rec
286
292
 
287
293
  {AMQP::Channel}, {AMQP::Queue}, {AMQP::Consumer} and {AMQP::Exchange} methods behavior is identical.
288
294
 
295
+ Recovery process for AMQP applications usually involves the following steps:
296
+
297
+ # Re-open AMQP connection.
298
+ # Once connection is open again, re-open all AMQP channels on that connection.
299
+ # For each channel, re-declare all exchanges
300
+ # For each channel, re-declare all queues
301
+ # Once queue is declared, for each queue, re-register all bindings
302
+ # Once queue is declared, for each queue, re-register all consumers
303
+
289
304
 
290
305
  h3. Automatic recovery
291
306
 
@@ -591,6 +606,11 @@ but they turn out to be similar with respect to network failures and connection-
591
606
  TBD
592
607
 
593
608
 
609
+ h2. Authors
610
+
611
+ This guide was written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee.
612
+
613
+
594
614
 
595
615
  h2. Tell us what you think!
596
616
 
@@ -6,7 +6,7 @@ h1. Working with exchanges
6
6
  h2. About this guide
7
7
 
8
8
  This guide covers the use of exchanges according to the AMQP v0.9.1 specification including message publishing,
9
- common usage scenarios and how to accomplish typical operations using the Ruby amqp gem.
9
+ common usage scenarios and how to accomplish typical operations using the Ruby amqp gem. This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
10
10
 
11
11
 
12
12
  h2. Which versions of the amqp gem does this guide cover?
@@ -1051,6 +1051,12 @@ topics. Guides related to this one are
1051
1051
  * {file:docs/ErrorHandling.textile Error handling and recovery}
1052
1052
 
1053
1053
 
1054
+ h2. Authors
1055
+
1056
+ This guide was written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee.
1057
+
1058
+
1059
+
1054
1060
  h2. Tell us what you think!
1055
1061
 
1056
1062
  Please take a moment to tell us what you think about this guide "on Twitter":http://twitter.com/rubyamqp or the "Ruby AMQP mailing list":http://groups.google.com/group/ruby-amqp.
@@ -15,6 +15,8 @@ It should take about 20 minutes to read and study the provided code examples. Th
15
15
  * Creating a topic routing example with 2 publishers and 8 subscribers showcasing n:m communication when subscribers only receive messages that they are interested in.
16
16
  * Learning how the amqp gem can be integrated with Ruby objects in a way that makes unit testing easy.
17
17
 
18
+ This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
19
+
18
20
 
19
21
  h2. Which versions of the amqp gem does this guide cover?
20
22
 
@@ -588,6 +590,8 @@ topics from {file:docs/Exchanges.textile use cases for various exchange types} t
588
590
 
589
591
  We recommend that you read the following guides next, if possible, in this order:
590
592
 
593
+ * {file:docs/AMQP091ModelExplained.textile AMQP 0.9.1 Model Explained}. A simple 2 page long introduction to the AMQP Model concepts and features. Understanding the AMQP Model
594
+ will make a lot of other documentation, both for the Ruby amqp gem and RabbitMQ itself, easier to follow. With this guide, you don't have to waste hours of time reading the whole specification.
591
595
  * {file:docs/ConnectingToTheBroker.textile Connection to the broker}. This guide explains how to connect to an AMQP broker and how to integrate the amqp gem into standalone and Web applications.
592
596
  * {file:docs/Queues.textile Working With Queues}. This guide focuses on features that consumer applications use heavily.
593
597
  * {file:docs/Exchanges.textile Working With Exchanges}. This guide focuses on features that producer applications use heavily.
@@ -598,6 +602,12 @@ If you are migrating your application from earlier versions of the amqp gem (0.6
598
602
  {file:docs/08Migration.textile amqp gem 0.8 migration guide}.
599
603
 
600
604
 
605
+ h2. Authors
606
+
607
+ This guide was written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee.
608
+
609
+
610
+
601
611
  h2. Tell us what you think!
602
612
 
603
613
  Please take a moment to tell us what you think about this guide "on Twitter":http://twitter.com/rubyamqp or the "Ruby AMQP mailing list":http://groups.google.com/group/ruby-amqp.
@@ -9,6 +9,8 @@ h2. About this guide
9
9
  This guide explains typical messaging patterns and use cases. It only covers the most common scenarios. For comprehensive list
10
10
  of messaging patterns, consult books on this subject, for example, "Enterprise Integration Patterns":http://www.eaipatterns.com.
11
11
 
12
+ This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
13
+
12
14
 
13
15
  h2. Covered versions
14
16
 
@@ -410,6 +412,10 @@ h3. Code example
410
412
  TBD
411
413
 
412
414
 
415
+ h2. Authors
416
+
417
+ These guides were written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee
418
+
413
419
 
414
420
  h2. Tell us what you think!
415
421
 
data/docs/Queues.textile CHANGED
@@ -6,7 +6,7 @@ h1. Working with queues
6
6
  h2. About this guide
7
7
 
8
8
  This guide covers everything related to queues in the AMQP v0.9.1 specification, common usage scenarios and how to accomplish typical operations using the
9
- amqp gem.
9
+ amqp gem. This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
10
10
 
11
11
 
12
12
  h2. Which versions of the amqp gem does this guide cover?
@@ -1161,6 +1161,12 @@ RabbitMQ implements a number of extensions to AMQP v0.9.1 functionality that are
1161
1161
  per-queue messages time-to-live (TTL), is related to this guide and can be used with the amqp gem v0.8.0 and later.
1162
1162
 
1163
1163
 
1164
+ h2. Authors
1165
+
1166
+ This guide was written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee.
1167
+
1168
+
1169
+
1164
1170
  h2. Tell us what you think!
1165
1171
 
1166
1172
  Please take a moment to tell us what you think about this guide "on Twitter":http://twitter.com/rubyamqp or the "Ruby AMQP mailing list":http://groups.google.com/group/ruby-amqp.
@@ -46,7 +46,12 @@ support, RabbitMQ 1.7.0 requires
46
46
  * Erlang/OTP R13B or later
47
47
  * Erlang SSL 3.10 or later
48
48
 
49
- and recommends using Erlang R141B that ships with Erlang SSL 4.0.1.
49
+ and recommends using Erlang R141B that ships with Erlang SSL 4.0.1. Learn more in our {file:docs/ConnectionEncryptionWithTLS.textile Using TLS (SSL)} guide.
50
+
51
+
52
+ h2. Authors
53
+
54
+ This guide was written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee.
50
55
 
51
56
 
52
57
 
@@ -8,6 +8,8 @@ h2. About this guide
8
8
  This guide is for people who want to contribute to amqp gem development. It has no relevant information for those
9
9
  who want to build applications using the library.
10
10
 
11
+ This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a> (including images & stylesheets). The source is available "on Github":https://github.com/ruby-amqp/amqp/tree/master/docs.
12
+
11
13
 
12
14
  h2. Covered versions
13
15
 
@@ -42,7 +44,7 @@ h2. Dependencies
42
44
  Dependencies are managed by Bundler. So begin with
43
45
 
44
46
  <pre><code>
45
- gem install bundler --version "~> 1.0.13"
47
+ gem install bundler
46
48
  </code></pre>
47
49
 
48
50
  and then, from the root of the repository run
@@ -82,9 +84,12 @@ For that, we use Rake:
82
84
  rake spec:ci
83
85
  </code></pre>
84
86
 
85
- Thanks to the excellent "Travis CI":http://travis-ci.org project, we run test suites across 5 Ruby implementations and 2 EventMachine versions, and can
86
- add more implementations/versions so easily it still seems unreal.
87
+ Thanks to the excellent "Travis CI":http://travis-ci.org project, we run test suites across multiple Ruby implementations/versions and 2 EventMachine versions.
88
+
89
+
90
+ h2. Authors
87
91
 
92
+ This guide was written by "Michael Klishin":http://twitter.com/michaelklishin and edited by "Chris Duncan":https://twitter.com/celldee.
88
93
 
89
94
 
90
95