benschwarz-smoke 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. data/Rakefile +47 -0
  2. data/VERSION.yml +2 -2
  3. data/lib/core_ext/string.rb +6 -0
  4. data/lib/smoke/cache.rb +38 -23
  5. data/lib/smoke/request.rb +4 -8
  6. data/lib/smoke.rb +7 -2
  7. data/rdoc/classes/Smoke/Origin.html +340 -0
  8. data/rdoc/classes/Smoke/Source/Data.html +126 -0
  9. data/rdoc/classes/Smoke/Source/Feed.html +117 -0
  10. data/rdoc/classes/Smoke/Source/YQL.html +223 -0
  11. data/rdoc/classes/Smoke.html +260 -0
  12. data/rdoc/created.rid +1 -0
  13. data/rdoc/files/README_markdown.html +180 -0
  14. data/rdoc/files/lib/core_ext/hash_rb.html +49 -0
  15. data/rdoc/files/lib/smoke/origin_rb.html +49 -0
  16. data/rdoc/files/lib/smoke/request_rb.html +49 -0
  17. data/rdoc/files/lib/smoke/source/data_rb.html +49 -0
  18. data/rdoc/files/lib/smoke/source/feed_rb.html +49 -0
  19. data/rdoc/files/lib/smoke/source/join_rb.html +49 -0
  20. data/rdoc/files/lib/smoke/source/yql_rb.html +49 -0
  21. data/rdoc/files/lib/smoke_rb.html +65 -0
  22. data/rdoc/fr_class_index.html +21 -0
  23. data/rdoc/fr_file_index.html +28 -0
  24. data/rdoc/fr_method_index.html +4459 -0
  25. data/rdoc/index.html +15 -0
  26. data/rdoc/rdoc-style.css +319 -0
  27. data/spec/smoke/cache_spec.rb +28 -6
  28. data/vendor/crack/History +15 -0
  29. data/vendor/crack/LICENSE +20 -0
  30. data/vendor/crack/README.rdoc +42 -0
  31. data/vendor/crack/Rakefile +49 -0
  32. data/vendor/crack/VERSION.yml +4 -0
  33. data/vendor/crack/crack.gemspec +61 -0
  34. data/vendor/crack/lib/crack/core_extensions.rb +128 -0
  35. data/vendor/crack/lib/crack/json.rb +68 -0
  36. data/vendor/crack/lib/crack/xml.rb +214 -0
  37. data/vendor/crack/lib/crack.rb +7 -0
  38. data/vendor/crack/test/crack_test.rb +4 -0
  39. data/vendor/crack/test/data/twittersearch-firefox.json +1 -0
  40. data/vendor/crack/test/data/twittersearch-ie.json +1 -0
  41. data/vendor/crack/test/hash_test.rb +56 -0
  42. data/vendor/crack/test/json_test.rb +66 -0
  43. data/vendor/crack/test/string_test.rb +31 -0
  44. data/vendor/crack/test/test_helper.rb +12 -0
  45. data/vendor/crack/test/xml_test.rb +489 -0
  46. data/vendor/dependencies/README.markdown +113 -0
  47. data/vendor/dependencies/Rakefile +5 -0
  48. data/vendor/dependencies/bin/dep +83 -0
  49. data/vendor/dependencies/dependencies.gemspec +15 -0
  50. data/vendor/dependencies/dependencies.gemspec.erb +27 -0
  51. data/vendor/dependencies/lib/dependencies/dep.rb +99 -0
  52. data/vendor/dependencies/lib/dependencies.rb +5 -0
  53. data/vendor/dependencies/test/dependencies_test.rb +228 -0
  54. data/vendor/dependencies/test/foobaz-0.3.gem +0 -0
  55. data/vendor/fakeweb/CHANGELOG +163 -0
  56. data/vendor/fakeweb/LICENSE.txt +281 -0
  57. data/vendor/fakeweb/README.rdoc +193 -0
  58. data/vendor/fakeweb/Rakefile +76 -0
  59. data/vendor/fakeweb/fakeweb.gemspec +21 -0
  60. data/vendor/fakeweb/lib/fake_web/ext/net_http.rb +71 -0
  61. data/vendor/fakeweb/lib/fake_web/registry.rb +103 -0
  62. data/vendor/fakeweb/lib/fake_web/responder.rb +113 -0
  63. data/vendor/fakeweb/lib/fake_web/response.rb +10 -0
  64. data/vendor/fakeweb/lib/fake_web/stub_socket.rb +15 -0
  65. data/vendor/fakeweb/lib/fake_web/utility.rb +22 -0
  66. data/vendor/fakeweb/lib/fake_web.rb +172 -0
  67. data/vendor/fakeweb/lib/fakeweb.rb +2 -0
  68. data/vendor/fakeweb/test/fixtures/google_response_from_curl +12 -0
  69. data/vendor/fakeweb/test/fixtures/google_response_with_transfer_encoding +17 -0
  70. data/vendor/fakeweb/test/fixtures/google_response_without_transfer_encoding +11 -0
  71. data/vendor/fakeweb/test/fixtures/test_example.txt +1 -0
  72. data/vendor/fakeweb/test/fixtures/test_txt_file +3 -0
  73. data/vendor/fakeweb/test/test_allow_net_connect.rb +85 -0
  74. data/vendor/fakeweb/test/test_deprecations.rb +54 -0
  75. data/vendor/fakeweb/test/test_fake_authentication.rb +92 -0
  76. data/vendor/fakeweb/test/test_fake_web.rb +535 -0
  77. data/vendor/fakeweb/test/test_fake_web_open_uri.rb +58 -0
  78. data/vendor/fakeweb/test/test_helper.rb +74 -0
  79. data/vendor/fakeweb/test/test_missing_open_uri.rb +25 -0
  80. data/vendor/fakeweb/test/test_precedence.rb +51 -0
  81. data/vendor/fakeweb/test/test_query_string.rb +45 -0
  82. data/vendor/fakeweb/test/test_regexes.rb +103 -0
  83. data/vendor/fakeweb/test/test_response_headers.rb +73 -0
  84. data/vendor/fakeweb/test/test_trailing_slashes.rb +53 -0
  85. data/vendor/fakeweb/test/test_utility.rb +70 -0
  86. data/vendor/json-1.1.3/CHANGES +93 -0
  87. data/vendor/json-1.1.3/GPL +340 -0
  88. data/vendor/json-1.1.3/README +78 -0
  89. data/vendor/json-1.1.3/RUBY +58 -0
  90. data/vendor/json-1.1.3/Rakefile +309 -0
  91. data/vendor/json-1.1.3/TODO +1 -0
  92. data/vendor/json-1.1.3/VERSION +1 -0
  93. data/vendor/json-1.1.3/benchmarks/benchmark.txt +133 -0
  94. data/vendor/json-1.1.3/benchmarks/benchmark_generator.rb +48 -0
  95. data/vendor/json-1.1.3/benchmarks/benchmark_parser.rb +26 -0
  96. data/vendor/json-1.1.3/benchmarks/benchmark_rails.rb +26 -0
  97. data/vendor/json-1.1.3/bin/edit_json.rb +10 -0
  98. data/vendor/json-1.1.3/bin/prettify_json.rb +76 -0
  99. data/vendor/json-1.1.3/data/example.json +1 -0
  100. data/vendor/json-1.1.3/data/index.html +38 -0
  101. data/vendor/json-1.1.3/data/prototype.js +4184 -0
  102. data/vendor/json-1.1.3/ext/json/ext/generator/extconf.rb +9 -0
  103. data/vendor/json-1.1.3/ext/json/ext/generator/generator.c +875 -0
  104. data/vendor/json-1.1.3/ext/json/ext/generator/unicode.c +182 -0
  105. data/vendor/json-1.1.3/ext/json/ext/generator/unicode.h +53 -0
  106. data/vendor/json-1.1.3/ext/json/ext/parser/extconf.rb +9 -0
  107. data/vendor/json-1.1.3/ext/json/ext/parser/parser.c +1758 -0
  108. data/vendor/json-1.1.3/ext/json/ext/parser/parser.rl +638 -0
  109. data/vendor/json-1.1.3/ext/json/ext/parser/unicode.c +154 -0
  110. data/vendor/json-1.1.3/ext/json/ext/parser/unicode.h +58 -0
  111. data/vendor/json-1.1.3/install.rb +26 -0
  112. data/vendor/json-1.1.3/lib/json/Array.xpm +21 -0
  113. data/vendor/json-1.1.3/lib/json/FalseClass.xpm +21 -0
  114. data/vendor/json-1.1.3/lib/json/Hash.xpm +21 -0
  115. data/vendor/json-1.1.3/lib/json/Key.xpm +73 -0
  116. data/vendor/json-1.1.3/lib/json/NilClass.xpm +21 -0
  117. data/vendor/json-1.1.3/lib/json/Numeric.xpm +28 -0
  118. data/vendor/json-1.1.3/lib/json/String.xpm +96 -0
  119. data/vendor/json-1.1.3/lib/json/TrueClass.xpm +21 -0
  120. data/vendor/json-1.1.3/lib/json/add/core.rb +135 -0
  121. data/vendor/json-1.1.3/lib/json/add/rails.rb +58 -0
  122. data/vendor/json-1.1.3/lib/json/common.rb +354 -0
  123. data/vendor/json-1.1.3/lib/json/editor.rb +1362 -0
  124. data/vendor/json-1.1.3/lib/json/ext.rb +13 -0
  125. data/vendor/json-1.1.3/lib/json/json.xpm +1499 -0
  126. data/vendor/json-1.1.3/lib/json/pure/generator.rb +394 -0
  127. data/vendor/json-1.1.3/lib/json/pure/parser.rb +259 -0
  128. data/vendor/json-1.1.3/lib/json/pure.rb +75 -0
  129. data/vendor/json-1.1.3/lib/json/version.rb +9 -0
  130. data/vendor/json-1.1.3/lib/json.rb +235 -0
  131. data/vendor/json-1.1.3/tests/fixtures/fail1.json +1 -0
  132. data/vendor/json-1.1.3/tests/fixtures/fail10.json +1 -0
  133. data/vendor/json-1.1.3/tests/fixtures/fail11.json +1 -0
  134. data/vendor/json-1.1.3/tests/fixtures/fail12.json +1 -0
  135. data/vendor/json-1.1.3/tests/fixtures/fail13.json +1 -0
  136. data/vendor/json-1.1.3/tests/fixtures/fail14.json +1 -0
  137. data/vendor/json-1.1.3/tests/fixtures/fail18.json +1 -0
  138. data/vendor/json-1.1.3/tests/fixtures/fail19.json +1 -0
  139. data/vendor/json-1.1.3/tests/fixtures/fail2.json +1 -0
  140. data/vendor/json-1.1.3/tests/fixtures/fail20.json +1 -0
  141. data/vendor/json-1.1.3/tests/fixtures/fail21.json +1 -0
  142. data/vendor/json-1.1.3/tests/fixtures/fail22.json +1 -0
  143. data/vendor/json-1.1.3/tests/fixtures/fail23.json +1 -0
  144. data/vendor/json-1.1.3/tests/fixtures/fail24.json +1 -0
  145. data/vendor/json-1.1.3/tests/fixtures/fail25.json +1 -0
  146. data/vendor/json-1.1.3/tests/fixtures/fail27.json +2 -0
  147. data/vendor/json-1.1.3/tests/fixtures/fail28.json +2 -0
  148. data/vendor/json-1.1.3/tests/fixtures/fail3.json +1 -0
  149. data/vendor/json-1.1.3/tests/fixtures/fail4.json +1 -0
  150. data/vendor/json-1.1.3/tests/fixtures/fail5.json +1 -0
  151. data/vendor/json-1.1.3/tests/fixtures/fail6.json +1 -0
  152. data/vendor/json-1.1.3/tests/fixtures/fail7.json +1 -0
  153. data/vendor/json-1.1.3/tests/fixtures/fail8.json +1 -0
  154. data/vendor/json-1.1.3/tests/fixtures/fail9.json +1 -0
  155. data/vendor/json-1.1.3/tests/fixtures/pass1.json +56 -0
  156. data/vendor/json-1.1.3/tests/fixtures/pass15.json +1 -0
  157. data/vendor/json-1.1.3/tests/fixtures/pass16.json +1 -0
  158. data/vendor/json-1.1.3/tests/fixtures/pass17.json +1 -0
  159. data/vendor/json-1.1.3/tests/fixtures/pass2.json +1 -0
  160. data/vendor/json-1.1.3/tests/fixtures/pass26.json +1 -0
  161. data/vendor/json-1.1.3/tests/fixtures/pass3.json +6 -0
  162. data/vendor/json-1.1.3/tests/runner.rb +25 -0
  163. data/vendor/json-1.1.3/tests/test_json.rb +293 -0
  164. data/vendor/json-1.1.3/tests/test_json_addition.rb +161 -0
  165. data/vendor/json-1.1.3/tests/test_json_fixtures.rb +30 -0
  166. data/vendor/json-1.1.3/tests/test_json_generate.rb +100 -0
  167. data/vendor/json-1.1.3/tests/test_json_rails.rb +118 -0
  168. data/vendor/json-1.1.3/tests/test_json_unicode.rb +61 -0
  169. data/vendor/json-1.1.3/tools/fuzz.rb +140 -0
  170. data/vendor/json-1.1.3/tools/server.rb +62 -0
  171. data/vendor/moneta/LICENSE +20 -0
  172. data/vendor/moneta/README +51 -0
  173. data/vendor/moneta/Rakefile +60 -0
  174. data/vendor/moneta/TODO +4 -0
  175. data/vendor/moneta/benchmarks/various.rb +234 -0
  176. data/vendor/moneta/lib/moneta/basic_file.rb +111 -0
  177. data/vendor/moneta/lib/moneta/berkeley.rb +53 -0
  178. data/vendor/moneta/lib/moneta/couch.rb +63 -0
  179. data/vendor/moneta/lib/moneta/datamapper.rb +117 -0
  180. data/vendor/moneta/lib/moneta/file.rb +91 -0
  181. data/vendor/moneta/lib/moneta/lmc.rb +52 -0
  182. data/vendor/moneta/lib/moneta/memcache.rb +53 -0
  183. data/vendor/moneta/lib/moneta/memory.rb +11 -0
  184. data/vendor/moneta/lib/moneta/mongodb.rb +58 -0
  185. data/vendor/moneta/lib/moneta/redis.rb +49 -0
  186. data/vendor/moneta/lib/moneta/rufus.rb +41 -0
  187. data/vendor/moneta/lib/moneta/s3.rb +162 -0
  188. data/vendor/moneta/lib/moneta/sdbm.rb +33 -0
  189. data/vendor/moneta/lib/moneta/tyrant.rb +58 -0
  190. data/vendor/moneta/lib/moneta/xattr.rb +58 -0
  191. data/vendor/moneta/lib/moneta.rb +76 -0
  192. data/vendor/moneta/moneta.gemspec +32 -0
  193. data/vendor/moneta/script/destroy +14 -0
  194. data/vendor/moneta/script/generate +14 -0
  195. data/vendor/moneta/spec/moneta_basic_file_spec.rb +50 -0
  196. data/vendor/moneta/spec/moneta_berkeley_spec.rb +20 -0
  197. data/vendor/moneta/spec/moneta_couch_spec.rb +22 -0
  198. data/vendor/moneta/spec/moneta_datamapper_spec.rb +79 -0
  199. data/vendor/moneta/spec/moneta_file_spec.rb +21 -0
  200. data/vendor/moneta/spec/moneta_lmc_spec.rb +24 -0
  201. data/vendor/moneta/spec/moneta_memcache_spec.rb +16 -0
  202. data/vendor/moneta/spec/moneta_memory_spec.rb +12 -0
  203. data/vendor/moneta/spec/moneta_mongodb_spec.rb +16 -0
  204. data/vendor/moneta/spec/moneta_redis_spec.rb +16 -0
  205. data/vendor/moneta/spec/moneta_rufus_spec.rb +15 -0
  206. data/vendor/moneta/spec/moneta_s3_spec.rb +19 -0
  207. data/vendor/moneta/spec/moneta_sdbm_spec.rb +21 -0
  208. data/vendor/moneta/spec/moneta_tyrant_spec.rb +15 -0
  209. data/vendor/moneta/spec/moneta_xattr_spec.rb +21 -0
  210. data/vendor/moneta/spec/shared.rb +122 -0
  211. data/vendor/moneta/spec/spec_helper.rb +7 -0
  212. data/vendor/rest-client/README.rdoc +151 -0
  213. data/vendor/rest-client/Rakefile +58 -0
  214. data/vendor/rest-client/VERSION +1 -0
  215. data/vendor/rest-client/bin/restclient +87 -0
  216. data/vendor/rest-client/lib/rest_client.rb +2 -0
  217. data/vendor/rest-client/lib/restclient/exceptions.rb +88 -0
  218. data/vendor/rest-client/lib/restclient/mixin/response.rb +43 -0
  219. data/vendor/rest-client/lib/restclient/raw_response.rb +30 -0
  220. data/vendor/rest-client/lib/restclient/request.rb +238 -0
  221. data/vendor/rest-client/lib/restclient/resource.rb +146 -0
  222. data/vendor/rest-client/lib/restclient/response.rb +20 -0
  223. data/vendor/rest-client/lib/restclient.rb +99 -0
  224. data/vendor/rest-client/rest-client.gemspec +66 -0
  225. data/vendor/rest-client/spec/base.rb +4 -0
  226. data/vendor/rest-client/spec/exceptions_spec.rb +65 -0
  227. data/vendor/rest-client/spec/mixin/response_spec.rb +46 -0
  228. data/vendor/rest-client/spec/raw_response_spec.rb +17 -0
  229. data/vendor/rest-client/spec/request_spec.rb +476 -0
  230. data/vendor/rest-client/spec/resource_spec.rb +75 -0
  231. data/vendor/rest-client/spec/response_spec.rb +16 -0
  232. data/vendor/rest-client/spec/restclient_spec.rb +53 -0
  233. data/vendor/simple-rss/LICENSE +429 -0
  234. data/vendor/simple-rss/README +43 -0
  235. data/vendor/simple-rss/Rakefile +212 -0
  236. data/vendor/simple-rss/install.rb +40 -0
  237. data/vendor/simple-rss/lib/simple-rss.rb +150 -0
  238. data/vendor/simple-rss/simple-rss.gemspec +12 -0
  239. data/vendor/simple-rss/test/base/base_test.rb +51 -0
  240. data/vendor/simple-rss/test/data/atom.xml +45 -0
  241. data/vendor/simple-rss/test/data/not-rss.xml +8 -0
  242. data/vendor/simple-rss/test/data/rss09.rdf +79 -0
  243. data/vendor/simple-rss/test/data/rss20.xml +818 -0
  244. data/vendor/simple-rss/test/test_helper.rb +4 -0
  245. metadata +314 -40
@@ -0,0 +1,128 @@
1
+ require 'uri'
2
+
3
+ class Object #:nodoc:
4
+ # @return <TrueClass, FalseClass>
5
+ #
6
+ # @example [].blank? #=> true
7
+ # @example [1].blank? #=> false
8
+ # @example [nil].blank? #=> false
9
+ #
10
+ # Returns true if the object is nil or empty (if applicable)
11
+ def blank?
12
+ nil? || (respond_to?(:empty?) && empty?)
13
+ end unless method_defined?(:blank?)
14
+ end # class Object
15
+
16
+ class Numeric #:nodoc:
17
+ # @return <TrueClass, FalseClass>
18
+ #
19
+ # Numerics can't be blank
20
+ def blank?
21
+ false
22
+ end unless method_defined?(:blank?)
23
+ end # class Numeric
24
+
25
+ class NilClass #:nodoc:
26
+ # @return <TrueClass, FalseClass>
27
+ #
28
+ # Nils are always blank
29
+ def blank?
30
+ true
31
+ end unless method_defined?(:blank?)
32
+ end # class NilClass
33
+
34
+ class TrueClass #:nodoc:
35
+ # @return <TrueClass, FalseClass>
36
+ #
37
+ # True is not blank.
38
+ def blank?
39
+ false
40
+ end unless method_defined?(:blank?)
41
+ end # class TrueClass
42
+
43
+ class FalseClass #:nodoc:
44
+ # False is always blank.
45
+ def blank?
46
+ true
47
+ end unless method_defined?(:blank?)
48
+ end # class FalseClass
49
+
50
+ class String #:nodoc:
51
+ # @example "".blank? #=> true
52
+ # @example " ".blank? #=> true
53
+ # @example " hey ho ".blank? #=> false
54
+ #
55
+ # @return <TrueClass, FalseClass>
56
+ #
57
+ # Strips out whitespace then tests if the string is empty.
58
+ def blank?
59
+ strip.empty?
60
+ end unless method_defined?(:blank?)
61
+
62
+ def snake_case
63
+ return self.downcase if self =~ /^[A-Z]+$/
64
+ self.gsub(/([A-Z]+)(?=[A-Z][a-z]?)|\B[A-Z]/, '_\&') =~ /_*(.*)/
65
+ return $+.downcase
66
+ end unless method_defined?(:snake_case)
67
+ end # class String
68
+
69
+ class Hash #:nodoc:
70
+ # @return <String> This hash as a query string
71
+ #
72
+ # @example
73
+ # { :name => "Bob",
74
+ # :address => {
75
+ # :street => '111 Ruby Ave.',
76
+ # :city => 'Ruby Central',
77
+ # :phones => ['111-111-1111', '222-222-2222']
78
+ # }
79
+ # }.to_params
80
+ # #=> "name=Bob&address[city]=Ruby Central&address[phones][]=111-111-1111&address[phones][]=222-222-2222&address[street]=111 Ruby Ave."
81
+ def to_params
82
+ params = self.map { |k,v| normalize_param(k,v) }.join
83
+ params.chop! # trailing &
84
+ params
85
+ end
86
+
87
+ # @param key<Object> The key for the param.
88
+ # @param value<Object> The value for the param.
89
+ #
90
+ # @return <String> This key value pair as a param
91
+ #
92
+ # @example normalize_param(:name, "Bob Jones") #=> "name=Bob%20Jones&"
93
+ def normalize_param(key, value)
94
+ param = ''
95
+ stack = []
96
+
97
+ if value.is_a?(Array)
98
+ param << value.map { |element| normalize_param("#{key}[]", element) }.join
99
+ elsif value.is_a?(Hash)
100
+ stack << [key,value]
101
+ else
102
+ param << "#{key}=#{URI.encode(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}&"
103
+ end
104
+
105
+ stack.each do |parent, hash|
106
+ hash.each do |key, value|
107
+ if value.is_a?(Hash)
108
+ stack << ["#{parent}[#{key}]", value]
109
+ else
110
+ param << normalize_param("#{parent}[#{key}]", value)
111
+ end
112
+ end
113
+ end
114
+
115
+ param
116
+ end
117
+
118
+ # @return <String> The hash as attributes for an XML tag.
119
+ #
120
+ # @example
121
+ # { :one => 1, "two"=>"TWO" }.to_xml_attributes
122
+ # #=> 'one="1" two="TWO"'
123
+ def to_xml_attributes
124
+ map do |k,v|
125
+ %{#{k.to_s.snake_case.sub(/^(.{1,1})/) { |m| m.downcase }}="#{v}"}
126
+ end.join(' ')
127
+ end
128
+ end
@@ -0,0 +1,68 @@
1
+ # Copyright (c) 2004-2008 David Heinemeier Hansson
2
+ # 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:
3
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
4
+ # 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.
5
+
6
+ require 'yaml'
7
+ require 'strscan'
8
+
9
+ module Crack
10
+ class JSON
11
+ def self.parse(json)
12
+ YAML.load(unescape(convert_json_to_yaml(json)))
13
+ rescue ArgumentError => e
14
+ raise ParseError, "Invalid JSON string"
15
+ end
16
+
17
+ protected
18
+ def self.unescape(str)
19
+ str.gsub(/\\u([0-9a-f]{4})/) { [$1.hex].pack("U") }
20
+ end
21
+
22
+ # matches YAML-formatted dates
23
+ DATE_REGEX = /^\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[ \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?)?$/
24
+
25
+ # Ensure that ":" and "," are always followed by a space
26
+ def self.convert_json_to_yaml(json) #:nodoc:
27
+ scanner, quoting, marks, pos, times = StringScanner.new(json), false, [], nil, []
28
+ while scanner.scan_until(/(\\['"]|['":,\\]|\\.)/)
29
+ case char = scanner[1]
30
+ when '"', "'"
31
+ if !quoting
32
+ quoting = char
33
+ pos = scanner.pos
34
+ elsif quoting == char
35
+ if json[pos..scanner.pos-2] =~ DATE_REGEX
36
+ # found a date, track the exact positions of the quotes so we can remove them later.
37
+ # oh, and increment them for each current mark, each one is an extra padded space that bumps
38
+ # the position in the final YAML output
39
+ total_marks = marks.size
40
+ times << pos+total_marks << scanner.pos+total_marks
41
+ end
42
+ quoting = false
43
+ end
44
+ when ":",","
45
+ marks << scanner.pos - 1 unless quoting
46
+ when "\\"
47
+ scanner.skip(/\\/)
48
+ end
49
+ end
50
+
51
+ if marks.empty?
52
+ json.gsub(/\\\//, '/')
53
+ else
54
+ left_pos = [-1].push(*marks)
55
+ right_pos = marks << json.length
56
+ output = []
57
+ left_pos.each_with_index do |left, i|
58
+ output << json[left.succ..right_pos[i]]
59
+ end
60
+ output = output * " "
61
+
62
+ times.each { |i| output[i-1] = ' ' }
63
+ output.gsub!(/\\\//, '/')
64
+ output
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,214 @@
1
+ require 'rexml/parsers/streamparser'
2
+ require 'rexml/parsers/baseparser'
3
+ require 'rexml/light/node'
4
+ require 'rexml/text'
5
+ require 'date'
6
+ require 'time'
7
+ require 'yaml'
8
+ require 'bigdecimal'
9
+
10
+ # This is a slighly modified version of the XMLUtilityNode from
11
+ # http://merb.devjavu.com/projects/merb/ticket/95 (has.sox@gmail.com)
12
+ # It's mainly just adding vowels, as I ht cd wth n vwls :)
13
+ # This represents the hard part of the work, all I did was change the
14
+ # underlying parser.
15
+ class REXMLUtilityNode #:nodoc:
16
+ attr_accessor :name, :attributes, :children, :type
17
+
18
+ def self.typecasts
19
+ @@typecasts
20
+ end
21
+
22
+ def self.typecasts=(obj)
23
+ @@typecasts = obj
24
+ end
25
+
26
+ def self.available_typecasts
27
+ @@available_typecasts
28
+ end
29
+
30
+ def self.available_typecasts=(obj)
31
+ @@available_typecasts = obj
32
+ end
33
+
34
+ self.typecasts = {}
35
+ self.typecasts["integer"] = lambda{|v| v.nil? ? nil : v.to_i}
36
+ self.typecasts["boolean"] = lambda{|v| v.nil? ? nil : (v.strip != "false")}
37
+ self.typecasts["datetime"] = lambda{|v| v.nil? ? nil : Time.parse(v).utc}
38
+ self.typecasts["date"] = lambda{|v| v.nil? ? nil : Date.parse(v)}
39
+ self.typecasts["dateTime"] = lambda{|v| v.nil? ? nil : Time.parse(v).utc}
40
+ self.typecasts["decimal"] = lambda{|v| v.nil? ? nil : BigDecimal(v.to_s)}
41
+ self.typecasts["double"] = lambda{|v| v.nil? ? nil : v.to_f}
42
+ self.typecasts["float"] = lambda{|v| v.nil? ? nil : v.to_f}
43
+ self.typecasts["symbol"] = lambda{|v| v.nil? ? nil : v.to_sym}
44
+ self.typecasts["string"] = lambda{|v| v.to_s}
45
+ self.typecasts["yaml"] = lambda{|v| v.nil? ? nil : YAML.load(v)}
46
+ self.typecasts["base64Binary"] = lambda{|v| v.unpack('m').first }
47
+
48
+ self.available_typecasts = self.typecasts.keys
49
+
50
+ def initialize(name, normalized_attributes = {})
51
+
52
+ # unnormalize attribute values
53
+ attributes = Hash[* normalized_attributes.map { |key, value|
54
+ [ key, unnormalize_xml_entities(value) ]
55
+ }.flatten]
56
+
57
+ @name = name.tr("-", "_")
58
+ # leave the type alone if we don't know what it is
59
+ @type = self.class.available_typecasts.include?(attributes["type"]) ? attributes.delete("type") : attributes["type"]
60
+
61
+ @nil_element = attributes.delete("nil") == "true"
62
+ @attributes = undasherize_keys(attributes)
63
+ @children = []
64
+ @text = false
65
+ end
66
+
67
+ def add_node(node)
68
+ @text = true if node.is_a? String
69
+ @children << node
70
+ end
71
+
72
+ def to_hash
73
+ if @type == "file"
74
+ f = StringIO.new((@children.first || '').unpack('m').first)
75
+ class << f
76
+ attr_accessor :original_filename, :content_type
77
+ end
78
+ f.original_filename = attributes['name'] || 'untitled'
79
+ f.content_type = attributes['content_type'] || 'application/octet-stream'
80
+ return {name => f}
81
+ end
82
+
83
+ if @text
84
+ t = typecast_value( unnormalize_xml_entities( inner_html ) )
85
+ t.class.send(:attr_accessor, :attributes)
86
+ t.attributes = attributes
87
+ return { name => t }
88
+ else
89
+ #change repeating groups into an array
90
+ groups = @children.inject({}) { |s,e| (s[e.name] ||= []) << e; s }
91
+
92
+ out = nil
93
+ if @type == "array"
94
+ out = []
95
+ groups.each do |k, v|
96
+ if v.size == 1
97
+ out << v.first.to_hash.entries.first.last
98
+ else
99
+ out << v.map{|e| e.to_hash[k]}
100
+ end
101
+ end
102
+ out = out.flatten
103
+
104
+ else # If Hash
105
+ out = {}
106
+ groups.each do |k,v|
107
+ if v.size == 1
108
+ out.merge!(v.first)
109
+ else
110
+ out.merge!( k => v.map{|e| e.to_hash[k]})
111
+ end
112
+ end
113
+ out.merge! attributes unless attributes.empty?
114
+ out = out.empty? ? nil : out
115
+ end
116
+
117
+ if @type && out.nil?
118
+ { name => typecast_value(out) }
119
+ else
120
+ { name => out }
121
+ end
122
+ end
123
+ end
124
+
125
+ # Typecasts a value based upon its type. For instance, if
126
+ # +node+ has #type == "integer",
127
+ # {{[node.typecast_value("12") #=> 12]}}
128
+ #
129
+ # @param value<String> The value that is being typecast.
130
+ #
131
+ # @details [:type options]
132
+ # "integer"::
133
+ # converts +value+ to an integer with #to_i
134
+ # "boolean"::
135
+ # checks whether +value+, after removing spaces, is the literal
136
+ # "true"
137
+ # "datetime"::
138
+ # Parses +value+ using Time.parse, and returns a UTC Time
139
+ # "date"::
140
+ # Parses +value+ using Date.parse
141
+ #
142
+ # @return <Integer, TrueClass, FalseClass, Time, Date, Object>
143
+ # The result of typecasting +value+.
144
+ #
145
+ # @note
146
+ # If +self+ does not have a "type" key, or if it's not one of the
147
+ # options specified above, the raw +value+ will be returned.
148
+ def typecast_value(value)
149
+ return value unless @type
150
+ proc = self.class.typecasts[@type]
151
+ proc.nil? ? value : proc.call(value)
152
+ end
153
+
154
+ # Take keys of the form foo-bar and convert them to foo_bar
155
+ def undasherize_keys(params)
156
+ params.keys.each do |key, value|
157
+ params[key.tr("-", "_")] = params.delete(key)
158
+ end
159
+ params
160
+ end
161
+
162
+ # Get the inner_html of the REXML node.
163
+ def inner_html
164
+ @children.join
165
+ end
166
+
167
+ # Converts the node into a readable HTML node.
168
+ #
169
+ # @return <String> The HTML node in text form.
170
+ def to_html
171
+ attributes.merge!(:type => @type ) if @type
172
+ "<#{name}#{attributes.to_xml_attributes}>#{@nil_element ? '' : inner_html}</#{name}>"
173
+ end
174
+
175
+ # @alias #to_html #to_s
176
+ def to_s
177
+ to_html
178
+ end
179
+
180
+ private
181
+
182
+ def unnormalize_xml_entities value
183
+ REXML::Text.unnormalize(value)
184
+ end
185
+ end
186
+
187
+ module Crack
188
+ class XML
189
+ def self.parse(xml)
190
+ stack = []
191
+ parser = REXML::Parsers::BaseParser.new(xml)
192
+
193
+ while true
194
+ event = parser.pull
195
+ case event[0]
196
+ when :end_document
197
+ break
198
+ when :end_doctype, :start_doctype
199
+ # do nothing
200
+ when :start_element
201
+ stack.push REXMLUtilityNode.new(event[1], event[2])
202
+ when :end_element
203
+ if stack.size > 1
204
+ temp = stack.pop
205
+ stack.last.add_node(temp)
206
+ end
207
+ when :text, :cdata
208
+ stack.last.add_node(event[1]) unless event[1].strip.length == 0 || stack.empty?
209
+ end
210
+ end
211
+ stack.length > 0 ? stack.pop.to_hash : {}
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,7 @@
1
+ module Crack
2
+ class ParseError < StandardError; end
3
+ end
4
+
5
+ require 'crack/core_extensions'
6
+ require 'crack/json'
7
+ require 'crack/xml'
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ # class CrackTest < Test::Unit::TestCase
4
+ # end
@@ -0,0 +1 @@
1
+ {"results":[{"text":"#let\u00f6lt\u00e9s - Mozilla SeaMonkey 1.1.16 magyar: B\u00f6ng\u00e9sz\u00f5 (Firefox), chat program (ChatZilla), weboldal.. http:\/\/tinyurl.com\/clvydf","to_user_id":null,"from_user":"mp33portal","id":1567167290,"from_user_id":7191223,"iso_language_code":"hu","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/96234069\/mp33teamlogo_normal.JPG","created_at":"Mon, 20 Apr 2009 17:25:16 +0000"},{"text":"#veille-sur-internet Speedtile 0.4, un nouveau plugin de bookmarks en visuel pour Firefox: \n.. http:\/\/twurl.nl\/43eq0o","to_user_id":null,"from_user":"rez0","id":1567164191,"from_user_id":87975,"iso_language_code":"fr","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/71734441\/80x80-2_normal.jpg","created_at":"Mon, 20 Apr 2009 17:24:53 +0000"},{"text":"Firefox #fail 2 do dia...","to_user_id":null,"from_user":"lucascimino","id":1567163150,"from_user_id":561101,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/www.nambu.com&quot;&gt;Nambu&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/108061839\/macbookpro_7_normal.gif","created_at":"Mon, 20 Apr 2009 17:24:45 +0000"},{"text":"Download Squad: AVG offers standalone realtime web page scanning for Firefox and IE: Filed under:.. http:\/\/tinyurl.com\/c4v923","to_user_id":null,"from_user":"techwatch","id":1567162787,"from_user_id":907915,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/118338486\/FotoFlexer_Photo_normal.jpg","created_at":"Mon, 20 Apr 2009 17:24:42 +0000"},{"text":"oops.....thought I was typing in my address bar. Using my Sidekick as web for past 3 days...Need...Firefox...Back...In...Life...","to_user_id":null,"from_user":"MikeMorganJr","id":1567162698,"from_user_id":8472813,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterhelp.blogspot.com\/2008\/05\/twitter-via-mobile-web-mtwittercom.html&quot;&gt;mobile web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/101742681\/S4201261_normal.JPG","created_at":"Mon, 20 Apr 2009 17:24:42 +0000"},{"text":"Top 10 Firefox Add-ons for Linux Users http:\/\/www.linux-mag.com\/id\/7307 @LinuxMagazine","to_user_id":null,"from_user":"jtcatchenco","id":1567161761,"from_user_id":102514,"iso_language_code":"no","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/67647355\/jairo2_normal.jpg","created_at":"Mon, 20 Apr 2009 17:24:32 +0000"},{"text":"@mamamali Try &quot;TwitterFox&quot; for Firefox?","to_user_id":11418879,"to_user":"mamamali","from_user":"coldmilktea","id":1567160292,"from_user_id":366808,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/58805948\/n546821674_1689558_9769_normal.jpg","created_at":"Mon, 20 Apr 2009 17:24:24 +0000"},{"text":"@cbcurran i have and i like it, but i use firefox for dev. because of the dev tools available to users","to_user_id":4604162,"to_user":"cbcurran","from_user":"joshuamc","id":1567160224,"from_user_id":1038770,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/57059100\/1a8f013_normal.jpg","created_at":"Mon, 20 Apr 2009 17:24:24 +0000"},{"text":"@salustio A vers\u00e3o portuguesa do Firefox inclui motor de pesquisa para o Dicion\u00e1rio Priberam que funciona correctamente!? N\u00e3o \u00e9 essa?","to_user_id":2011109,"to_user":"salustio","from_user":"priberam","id":1567158943,"from_user_id":12725990,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/148282351\/logoquadrado_normal.jpg","created_at":"Mon, 20 Apr 2009 17:24:15 +0000"},{"text":"@enver555 hoy. En todos los ordenadores hay firefox y explorer, menos en el que me ha tocado hoy, que s\u00f3lo hay explorer.","to_user_id":1117,"to_user":"enver555","from_user":"Purnas","id":1567153499,"from_user_id":2869,"iso_language_code":"es","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/122746846\/ventanica_normal.jpg","created_at":"Mon, 20 Apr 2009 17:23:31 +0000"},{"text":"uffff por favor prueben la evolucion de las pesta\u00f1as en firefox... http:\/\/tinyurl.com\/3bhosa","to_user_id":null,"from_user":"rubbenslife","id":1567152871,"from_user_id":318865,"iso_language_code":"es","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/109636341\/gir-vector2_normal.png","created_at":"Mon, 20 Apr 2009 17:23:27 +0000"},{"text":"@Andrew_Taylor I used to use IE as an excuse to not get any work done--you know, when a web page looks great in Firefox but is crap in IE.","to_user_id":920152,"to_user":"Andrew_Taylor","from_user":"thepete","id":1567151382,"from_user_id":20159,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/software\/bigbird\/&quot;&gt;Bigbird&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/78425271\/ThePeteHead_normal.png","created_at":"Mon, 20 Apr 2009 17:23:16 +0000"},{"text":"15 cool tricks for firefox users http:\/\/twurl.nl\/ydpfj4 found via delicious network","to_user_id":null,"from_user":"mcfarljo","id":1567150610,"from_user_id":543823,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/67908105\/twitterprofile_normal.jpg","created_at":"Mon, 20 Apr 2009 17:23:10 +0000"},{"text":"Is there a good reason why it's taking so long for Firefox to load images since the last update?","to_user_id":null,"from_user":"KidKaz","id":1567150504,"from_user_id":2473590,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/78432331\/009_a_normal.png","created_at":"Mon, 20 Apr 2009 17:23:08 +0000"},{"text":"now its not working in Firefox on clients machine and they have exact same version as me (3.0.8) on a PC. Oh well....","to_user_id":null,"from_user":"andrewyee","id":1567150403,"from_user_id":1297173,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/destroytwitter.com\/&quot;&gt;DestroyTwitter&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/107140778\/CIMG738a5_normal.jpg","created_at":"Mon, 20 Apr 2009 17:23:07 +0000"},{"text":"Voltei para o Firefox 3.0.8, o 3.1b3 est\u00e1 com alguns bugs que acabam com a produtividade...","to_user_id":null,"from_user":"yporti","id":1567148429,"from_user_id":1470378,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/126029039\/avatar2_normal.png","created_at":"Mon, 20 Apr 2009 17:22:51 +0000"},{"text":"recovered bookmarks with firefox's automatic recovery - nice feature when you need it.","to_user_id":null,"from_user":"coffeeshrk","id":1567147766,"from_user_id":2776616,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.twitterlight.com\/&quot;&gt;Twitterlight&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/132290339\/cg_normal.jpg","created_at":"Mon, 20 Apr 2009 17:22:48 +0000"},{"text":"@ewillett I'm using Firefox Portable. It has Flash, but not the latest version. I just checked in IE 7, and the titles appear last, and slow","to_user_id":1112964,"to_user":"ewillett","from_user":"fallapart","id":1567143242,"from_user_id":570499,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/55279513\/marturia_normal.gif","created_at":"Mon, 20 Apr 2009 17:22:12 +0000"},{"text":"Is there any &quot;Stop Susan Boyle News&quot; button on Firefox or IE7?","to_user_id":null,"from_user":"MyCaricaturecom","id":1567141153,"from_user_id":8967683,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/103773093\/untitled_normal.jpg","created_at":"Mon, 20 Apr 2009 17:21:56 +0000"},{"text":"Firefox Question: why is firefox not working for me? http:\/\/twurl.nl\/7dvotq","to_user_id":null,"from_user":"Firefox_Queries","id":1567139413,"from_user_id":994884,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/56842902\/fxq-a_normal.png","created_at":"Mon, 20 Apr 2009 17:21:42 +0000"},{"text":"Showing Joan the coolest add on for firefox = twitterfox","to_user_id":null,"from_user":"shannonels","id":1567130581,"from_user_id":8743358,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/112823048\/small_text1_17_normal.JPG","created_at":"Mon, 20 Apr 2009 17:20:34 +0000"},{"text":"Mientras espero la integraci\u00f3n en el Adium uso Twitbin en Firefox","to_user_id":null,"from_user":"elgaita","id":1567124994,"from_user_id":6025355,"iso_language_code":"es","source":"&lt;a href=&quot;http:\/\/www.twitbin.com\/&quot;&gt;TwitBin&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/86912947\/Ojo_normal.png","created_at":"Mon, 20 Apr 2009 17:19:53 +0000"},{"text":"@tenketanken fikk du noe svar p\u00e5 den addonen til firefox?","to_user_id":4597139,"to_user":"tenketanken","from_user":"cluver","id":1567120286,"from_user_id":3489762,"iso_language_code":"no","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/119889955\/Bilde_326_normal.jpg","created_at":"Mon, 20 Apr 2009 17:19:18 +0000"},{"text":"@KurtScholle Digg had Ads? lol, With Firefox, AdBlock &amp; RSS I never see the ads","to_user_id":333651,"to_user":"KurtScholle","from_user":"bcbeatty","id":1567119630,"from_user_id":68460,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/64319687\/Me_from_the_Lodge_7-13-08_normal.jpeg","created_at":"Mon, 20 Apr 2009 17:19:12 +0000"},{"text":"@spittingcat ahhh! didn't know, I only look at youtube on firefox. don't have any mobile communicators.","to_user_id":4254917,"to_user":"spittingcat","from_user":"mattmagic","id":1567117100,"from_user_id":5727306,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/84251889\/795405-big_normal.jpg","created_at":"Mon, 20 Apr 2009 17:18:53 +0000"},{"text":"@maboa - Mozilla\/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.13) Gecko\/20080316 SUSE\/2.0.0.13-0.2 Firefox\/2.0.0.13","to_user_id":33370,"to_user":"maboa","from_user":"lhearl","id":1567116047,"from_user_id":11145048,"iso_language_code":"no","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/static.twitter.com\/images\/default_profile_normal.png","created_at":"Mon, 20 Apr 2009 17:18:47 +0000"},{"text":"Finally upgrading to Firefox 3 (from 2), on both my work and home computers. Why did it take me so long?","to_user_id":null,"from_user":"FrederikGoris","id":1567114241,"from_user_id":2183657,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/&quot;&gt;Tweetie&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/57245090\/binkley_trans_normal.gif","created_at":"Mon, 20 Apr 2009 17:18:34 +0000"},{"text":"really people. stop using internet explorer! FIREFOX! that way I don't have to keep changing my details on my site :)","to_user_id":null,"from_user":"StilettoSportsJ","id":1567114128,"from_user_id":3263198,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/140589587\/summer_me_normal.jpg","created_at":"Mon, 20 Apr 2009 17:18:32 +0000"},{"text":"at\u00e9q esse firefox 308 n\u00e3o est\u00e1 t\u00e3o ruim. mas ainda me irritam alguns bugs ~~","to_user_id":null,"from_user":"caduzito","id":1567111654,"from_user_id":5051483,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/76892540\/package_toys_normal.png","created_at":"Mon, 20 Apr 2009 17:18:15 +0000"},{"text":"Cierro Firefox y tweetdeck que tengo bastante tarea que hacer","to_user_id":null,"from_user":"marv3x","id":1567110471,"from_user_id":111779,"iso_language_code":"es","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/135137954\/moto_0679_normal.jpg","created_at":"Mon, 20 Apr 2009 17:18:05 +0000"},{"text":"@tmc057 love firefox, but now I use that google chrome on my laptop...like it too!","to_user_id":8622848,"to_user":"tmc057","from_user":"jennmet","id":1567108866,"from_user_id":7219827,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/129220839\/smile_feet_normal.jpg","created_at":"Mon, 20 Apr 2009 17:17:52 +0000"},{"text":"Firefox Plugin for Twitter http:\/\/tinyurl.com\/2bmr3q","to_user_id":null,"from_user":"mazharin","id":1567108398,"from_user_id":12764228,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/148417263\/logo_normal.gif","created_at":"Mon, 20 Apr 2009 17:17:51 +0000"},{"text":"firefox needs to not use a problematic cache","to_user_id":null,"from_user":"jakedahn","id":1567108188,"from_user_id":89635,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/iconfactory.com\/software\/twitterrific&quot;&gt;twitterrific&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/57291688\/n1277970100_2225_normal.jpg","created_at":"Mon, 20 Apr 2009 17:17:47 +0000"},{"text":"Dodajte Gmail Tasks u Firefox sidebar: Po\u0161to ste verovatno po\u010deli da koristite Gmail Tasks za pam\u0107enje va\u0161ih dne.. http:\/\/tinyurl.com\/df7dgt","to_user_id":null,"from_user":"djevrek","id":1567104166,"from_user_id":6752155,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/112428857\/Picture_202_normal.jpg","created_at":"Mon, 20 Apr 2009 17:17:17 +0000"},{"text":"sandwich? sandwhich? can i spell at all? why doesn't safari have spellcheck like firefox does?","to_user_id":null,"from_user":"slimfender","id":1567102131,"from_user_id":461073,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/125212882\/20-02-2009_1-2_normal.jpg","created_at":"Mon, 20 Apr 2009 17:16:58 +0000"},{"text":"Did you know that you can drag a tab from Firefox to Chome and back? Neat.","to_user_id":null,"from_user":"joshutk","id":1567100604,"from_user_id":222578,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/destroytwitter.com\/&quot;&gt;DestroyTwitter&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/53112855\/josh_cs3_normal.png","created_at":"Mon, 20 Apr 2009 17:16:48 +0000"},{"text":"@cineboy \n\nI think it's Firefox. Safari seems faster. I thought it was comcast.","to_user_id":3502968,"to_user":"cineboy","from_user":"AndrewFRobinson","id":1567092336,"from_user_id":5219854,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/80758440\/Blog_Picture_normal.jpg","created_at":"Mon, 20 Apr 2009 17:15:46 +0000"},{"text":"@Avinio thank you, firefox didn't work. it always gives back an error. thanks for helping though :)","to_user_id":218611,"to_user":"Avinio","from_user":"Sarah_Stuart","id":1567091592,"from_user_id":1854673,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/148425394\/n1050963749_30402544_5294812_normal.jpg","created_at":"Mon, 20 Apr 2009 17:15:40 +0000"},{"text":"Speed Up Firefox web browser http:\/\/tinyurl.com\/28zjbm","to_user_id":null,"from_user":"jayminkapish","id":1567089438,"from_user_id":227615,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/51442432\/jay_normal.png","created_at":"Mon, 20 Apr 2009 17:15:26 +0000"},{"text":"Minimap sidebar for Firefox ~ Mapping, addresses and directions @ http:\/\/tinyurl.com\/6f3yt6","to_user_id":null,"from_user":"steven2509","id":1567087844,"from_user_id":10204537,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/124435871\/Thor_3_normal.JPG","created_at":"Mon, 20 Apr 2009 17:15:12 +0000"},{"text":"@plutoniumpage Firefox -&gt; Safari: Mac or PC?","to_user_id":3185443,"to_user":"plutoniumpage","from_user":"Malacandra","id":1567087584,"from_user_id":1174499,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/&quot;&gt;Tweetie&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/91904641\/miles_for_twitter_normal.jpg","created_at":"Mon, 20 Apr 2009 17:15:10 +0000"},{"text":"@Beeeeg except firefox gets bored after a while and asks if you want the script to be stopped.","to_user_id":9535974,"to_user":"Beeeeg","from_user":"Drarok","id":1567080622,"from_user_id":941369,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/&quot;&gt;Tweetie&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/56645906\/Goomba_normal.jpg","created_at":"Mon, 20 Apr 2009 17:14:18 +0000"},{"text":"Screen resizing problems in Firefox http:\/\/tinyurl.com\/chz3wb","to_user_id":null,"from_user":"otherinboxhelp","id":1567079152,"from_user_id":2263650,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/63409998\/otherinbox_icon_normal.png","created_at":"Mon, 20 Apr 2009 17:14:07 +0000"},{"text":"@johnfbraun I really don't like Tweetdeck. Even with two monitors it takes up too much space. Tweetie fits perfectly just next to Firefox.","to_user_id":1291479,"to_user":"johnfbraun","from_user":"nentecular","id":1567076517,"from_user_id":928787,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/&quot;&gt;Tweetie&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/57182988\/nentecular_normal.jpg","created_at":"Mon, 20 Apr 2009 17:13:45 +0000"},{"text":"t\u00f4 de boa com a organiza\u00e7\u00e3o das abas do firefox. se mta coisa acumula pra ler, organiza nos favoritos! :)","to_user_id":null,"from_user":"foxpretender","id":1567075265,"from_user_id":2199243,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/72981570\/DSC00347_normal.JPG","created_at":"Mon, 20 Apr 2009 17:13:37 +0000"},{"text":"Queria o Gmail sempre aberto sem precisar usar o Firefox pra isso","to_user_id":null,"from_user":"rustymind","id":1567072458,"from_user_id":6155,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/88642915\/c_normal.jpg","created_at":"Mon, 20 Apr 2009 17:13:14 +0000"},{"text":"@BostonWealthMan i'll try to fix, but Firefox users can see the blog fine; come back to the blog in 20 mins and c what happens","to_user_id":6438140,"to_user":"BostonWealthMan","from_user":"yesandnotyes","id":1567067108,"from_user_id":3780901,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/118180349\/deo-portrait_normal.JPG","created_at":"Mon, 20 Apr 2009 17:12:34 +0000"},{"text":"@viciousbleu @benipsen if you have firefox, you can get a script via Greasemonkey to block apps\/quizzes in swathes. but it's a little work","to_user_id":1681225,"to_user":"viciousbleu","from_user":"SamCousins","id":1567066165,"from_user_id":5090625,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.twhirl.org\/&quot;&gt;twhirl&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/127496405\/Sam_normal.jpg","created_at":"Mon, 20 Apr 2009 17:12:27 +0000"},{"text":"PS It seems like the photo album only works in Firefox, not IE right now. Good a reason as any to switch :)","to_user_id":null,"from_user":"toosunnyouthere","id":1567061723,"from_user_id":312807,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/57121330\/Twitter_profile_photo_normal.jpg","created_at":"Mon, 20 Apr 2009 17:11:53 +0000"},{"text":"@mackaffinity thanks for tip on firefox threaded tabs. Nice!","to_user_id":267931,"to_user":"mackaffinity","from_user":"malcolmbot","id":1567056739,"from_user_id":11583811,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/83degrees.com\/to\/powertwitter&quot;&gt;Power Twitter&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/78425206\/malcom_hat3_normal.jpg","created_at":"Mon, 20 Apr 2009 17:11:14 +0000"},{"text":"@Biertjuh JA, ik lul teveel :) Ene FireFox Pimp en ene Henk van Dijke zijn ineens verdwenen :) Ene Jenny Doverspike heb ik heengezonden","to_user_id":9701261,"to_user":"Biertjuh","from_user":"Kruimeldief","id":1567056294,"from_user_id":4748714,"iso_language_code":"nl","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/126656948\/8b06388c-1206-43df-b9dd-4b51228b373b_normal.jpg","created_at":"Mon, 20 Apr 2009 17:11:11 +0000"},{"text":"@bravenewcode tested in safari 4 beta &amp; 3.1.2 &amp; latest firefox on mac. the ajax stuff doesn't work in any of them.","to_user_id":994961,"to_user":"bravenewcode","from_user":"khlrqa","id":1567052831,"from_user_id":224717,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/&quot;&gt;Tweetie&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/57154560\/rrr300_normal.jpg","created_at":"Mon, 20 Apr 2009 17:10:45 +0000"},{"text":"RT: &quot;Throw all the tiny red lines you wish, I shall destroy them all!&quot;\n-- Fox, da SJ Games, sobre o corretor ortogr\u00e1fico do Firefox.","to_user_id":null,"from_user":"mamangava","id":1567052258,"from_user_id":4390018,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/75652189\/DSC04072_normal.JPG","created_at":"Mon, 20 Apr 2009 17:10:41 +0000"},{"text":"#Firefox prend officialement le nom de #Firefox3.5 dans la quatri\u00e8me beta de ce dernier :)","to_user_id":null,"from_user":"OyoKooN","id":1567044110,"from_user_id":176092,"iso_language_code":"fr","source":"&lt;a href=&quot;http:\/\/desktop.seesmic.com\/&quot;&gt;Seesmic Desktop&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/129147038\/OliviaDunhamJPG_normal.jpg","created_at":"Mon, 20 Apr 2009 17:09:40 +0000"},{"text":"Atlantainternetmarketing.net News: &quot;Top 10 Firefox Add-ons for Linux Users - Linux Magazine (registration)&quot; - http:\/\/tinyurl.com\/cfgdqb","to_user_id":null,"from_user":"SEOAtlanta","id":1567034693,"from_user_id":5051211,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.bravenewcode.com\/wordtwit\/&quot;&gt;WordTwit&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/126242512\/atlanta-seo-1_normal.png","created_at":"Mon, 20 Apr 2009 17:08:28 +0000"},{"text":"@Avinio i haven't tried firefox, just safari, good idea. am going to try it out now :) thanks","to_user_id":218611,"to_user":"Avinio","from_user":"Sarah_Stuart","id":1567028645,"from_user_id":1854673,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/148425394\/n1050963749_30402544_5294812_normal.jpg","created_at":"Mon, 20 Apr 2009 17:07:41 +0000"},{"text":"me voy a regresar a firefox porke google chrome no me convenci\u00f3","to_user_id":null,"from_user":"SonneMx","id":1567020771,"from_user_id":1065217,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/59431140\/DSC00072_normal.JPG","created_at":"Mon, 20 Apr 2009 17:06:41 +0000"},{"text":"Wyzo 3.0.1 The New Customized Browser Of FireFox 3.0.8 - http:\/\/tinyurl.com\/cm98td","to_user_id":null,"from_user":"anwarwagdi","id":1567016110,"from_user_id":2183567,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.sharethis.com&quot;&gt;ShareThis.com&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/83273512\/125x125_banner_normal.png","created_at":"Mon, 20 Apr 2009 17:06:06 +0000"},{"text":"Firefox = passoire ?: C\u2018est en tout cas ce que semble d\u00e9montrer une \u00e9tude men\u00e9e en 2008 par la soci\u00e9t\u00e9 Secunia, .. http:\/\/tinyurl.com\/dkgkj5","to_user_id":null,"from_user":"fuzzfr","id":1567013785,"from_user_id":3239997,"iso_language_code":"fr","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/68899486\/avatar_fuzz_normal.jpg","created_at":"Mon, 20 Apr 2009 17:05:47 +0000"},{"text":"@DavidEntremont It is a decent iPhone webb app. I need to start using a desktop app since Twitter.com always seems so laggy on firefox.","to_user_id":150359,"to_user":"DavidEntremont","from_user":"DrArdtagon","id":1567006240,"from_user_id":4627853,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/&quot;&gt;Tweetie&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/70564130\/Anthony93_normal.JPG","created_at":"Mon, 20 Apr 2009 17:04:51 +0000"},{"text":"Firefox 3.5b4 \u0432\u044b\u0439\u0434\u0435\u0442 22-24 \u0430\u043f\u0440\u0435\u043b\u044f http:\/\/tr.im\/jflf","to_user_id":null,"from_user":"smartfon","id":1567002479,"from_user_id":1538736,"iso_language_code":"ru","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/130824428\/av-150_normal.png","created_at":"Mon, 20 Apr 2009 17:04:23 +0000"},{"text":"im using firefox right now for my tweets but ima be on tweet deck or Tweetie in a minute","to_user_id":null,"from_user":"solaravada","id":1567000487,"from_user_id":3205793,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/140410086\/Picture_060_normal.jpg","created_at":"Mon, 20 Apr 2009 17:04:06 +0000"},{"text":"Speedtile 0.4, un nouveau plugin de bookmarks en visuel pour Firefox: \n\t\t\n\t\t\t\n\t\t\n\tPour les utiisateurs du naviga.. http:\/\/tinyurl.com\/cp9ado","to_user_id":null,"from_user":"jmgall","id":1566997778,"from_user_id":23853,"iso_language_code":"fr","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/90306573\/jmbg54000_normal.jpg","created_at":"Mon, 20 Apr 2009 17:03:47 +0000"},{"text":"Top 10 Firefox Add-ons for Linux Users http:\/\/bit.ly\/15v1bC","to_user_id":null,"from_user":"ielite","id":1566997201,"from_user_id":3174070,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/68501431\/logo_normal.PNG","created_at":"Mon, 20 Apr 2009 17:03:43 +0000"},{"text":"@AngryChad Use the Better GReader extension for Firefox!","to_user_id":310949,"to_user":"AngryChad","from_user":"abeldanger","id":1566992843,"from_user_id":611593,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/&quot;&gt;Tweetie&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/56922450\/my_head_normal.jpg","created_at":"Mon, 20 Apr 2009 17:03:11 +0000"},{"text":"twitter travando o firefox de cinco em cinco minutos!","to_user_id":null,"from_user":"marcel_silva","id":1566987360,"from_user_id":12757889,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/148430974\/7wBCg9Y8AaNEqXT_normal.jpg","created_at":"Mon, 20 Apr 2009 17:02:31 +0000"},{"text":"Anyone notice Firefox trying to be more like Chrome? &amp; with the FB\/twitter ap\/look and &amp; copy-tition it's like one big virtual brand soup","to_user_id":null,"from_user":"rachelcw","id":1566986955,"from_user_id":3051268,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/68342500\/rach_glasses_normal.jpg","created_at":"Mon, 20 Apr 2009 17:02:27 +0000"},{"text":"#Titook: The research was conducted by NSS labs and they had included the likes of Firefox (3.07), Apple.. http:\/\/tinyurl.com\/cnqhjs","to_user_id":null,"from_user":"TechnoZero","id":1566980725,"from_user_id":12687581,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/147420706\/TiDolphi_normal.jpg","created_at":"Mon, 20 Apr 2009 17:01:42 +0000"},{"text":"Turning OFF firefox so I get WORK!","to_user_id":null,"from_user":"CandiedFabrics","id":1566978524,"from_user_id":8190119,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/146694105\/Vimeo_avatar_300_normal.jpg","created_at":"Mon, 20 Apr 2009 17:01:27 +0000"},{"text":"Likes Mozilla Labs Weave 0.3 : Need to wait it be upgraded, hope to sync all of my firefox plugins and add-o... - http:\/\/likaholix.com\/r\/fBK","to_user_id":null,"from_user":"betashow","id":1566977384,"from_user_id":181186,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/147546718\/Leo_mobile_normal.jpg","created_at":"Mon, 20 Apr 2009 17:01:19 +0000"},{"text":"Firefox users, you probably know of the Twitter search add-on http:\/\/tinyurl.com\/c58xm9","to_user_id":null,"from_user":"edizquierdo","id":1566977150,"from_user_id":2010561,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/54481780\/ed_normal.png","created_at":"Mon, 20 Apr 2009 17:01:19 +0000"},{"text":"Download Facebook Albums to Your PC with FacePAD Firefox Add-on http:\/\/tinyurl.com\/daglp8","to_user_id":null,"from_user":"pcsbox","id":1566974888,"from_user_id":754736,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/76459142\/single_normal.JPG","created_at":"Mon, 20 Apr 2009 17:01:00 +0000"},{"text":"Testar Firefox 3.1 Beta 3","to_user_id":null,"from_user":"jonstg","id":1566974831,"from_user_id":2801022,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/www.chrisfinke.com\/addons\/twitterbar\/&quot;&gt;TwitterBar&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/70746207\/johan_stenberg_normal.JPG","created_at":"Mon, 20 Apr 2009 17:00:59 +0000"},{"text":"@priberam Uso o motor de pesquisa do dicion\u00e1rio instalado no Firefox. Sempre que procuro palavra com acentos, cedilha ou til, n\u00e3o reconhece.","to_user_id":12725990,"to_user":"priberam","from_user":"salustio","id":1566970119,"from_user_id":2011109,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/122514367\/maca2-twitter_normal.jpg","created_at":"Mon, 20 Apr 2009 17:00:28 +0000"},{"text":"Me hecho a dormir o pruebo Firefox 3.5 ? me hecho a dormir eso es mejor XD","to_user_id":null,"from_user":"icekrypto","id":1566965118,"from_user_id":11255742,"iso_language_code":"es","source":"&lt;a href=&quot;http:\/\/itweet.net\/&quot;&gt;iTweet&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/135479149\/icekrypto-mini_normal.jpg","created_at":"Mon, 20 Apr 2009 16:59:53 +0000"},{"text":"How to get a better Firefox with Ubiquity extension http:\/\/tinyurl.com\/c8pxlr","to_user_id":null,"from_user":"macstories","id":1566964874,"from_user_id":12757200,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/bluebirdapp.com&quot;&gt;Bluebird&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/148456587\/apple_logo_rainbow_6_color_normal.jpg","created_at":"Mon, 20 Apr 2009 16:59:51 +0000"},{"text":"@passionpit the video won't play on my Mac in neither Safari 4 nor Firefox 3. It jumps right to the end where it says &quot;replay&quot;\/&quot;share&quot;...","to_user_id":1195668,"to_user":"passionpit","from_user":"julscho","id":1566960035,"from_user_id":424071,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/loungeapp.com&quot;&gt;Lounge&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/148317755\/Tamala2010_330x296_normal.jpg","created_at":"Mon, 20 Apr 2009 16:59:17 +0000"},{"text":"@haacked Better yet, goes around and installs Firefox and makes it the default browser?","to_user_id":34575,"to_user":"haacked","from_user":"beebe4","id":1566958997,"from_user_id":183100,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/&quot;&gt;Tweetie&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/57482684\/Photo_5_normal.jpg","created_at":"Mon, 20 Apr 2009 16:59:08 +0000"},{"text":"@therealmaz Ideas for other topics: IDEs (Eclipse, Visual Studio, etc,,,) and Firefox + Firebug","to_user_id":381054,"to_user":"therealmaz","from_user":"elevine","id":1566957248,"from_user_id":83133,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.twhirl.org\/&quot;&gt;twhirl&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/24654522\/avatar2_normal.jpg","created_at":"Mon, 20 Apr 2009 16:58:56 +0000"},{"text":"@Carol_Meneses @Carol_Meneses F\u00e1cil... se vc usa o firefox, baixe o twitter fox, a~i vai funcionar que nem orkut o seu twitter","to_user_id":12710301,"to_user":"Carol_Meneses","from_user":"koiann","id":1566956562,"from_user_id":8928327,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/112468850\/030209180946_normal.jpg","created_at":"Mon, 20 Apr 2009 16:58:49 +0000"},{"text":"is anyone else having problems with Firefox crashing? It's been crashing nonstop for me at work and at home...I do not want to go back to IE","to_user_id":null,"from_user":"Joveth","id":1566952618,"from_user_id":5661754,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/84254585\/Jono1_normal.jpg","created_at":"Mon, 20 Apr 2009 16:58:18 +0000"},{"text":"Wyzo 3.0.1 The New Customized Browser Of FireFox 3.0.8","to_user_id":null,"from_user":"ibraheiem","id":1566952321,"from_user_id":6483451,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/static.twitter.com\/images\/default_profile_normal.png","created_at":"Mon, 20 Apr 2009 16:58:19 +0000"},{"text":"Enjoying the fruits of Firefox 3","to_user_id":null,"from_user":"NeonXero","id":1566949639,"from_user_id":4159819,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.twhirl.org\/&quot;&gt;twhirl&lt;\/a&gt;","profile_image_url":"https:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/131049544\/Photo_147_normal.jpg","created_at":"Mon, 20 Apr 2009 16:57:59 +0000"},{"text":"New Post: [tip] \u5c07\u4efb\u4f55\u641c\u5c0b\u6846\u52a0\u5165\u706b\u72d0\u641c\u5c0b\u5217 \u2013 add any search engine into firefox search bar http:\/\/tinyurl.com\/dymzhm","to_user_id":null,"from_user":"brownywalking","id":1566948188,"from_user_id":130823,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfeed.com&quot;&gt;twitterfeed&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/37532782\/\u5f71\u50cf008_normal.jpg","created_at":"Mon, 20 Apr 2009 16:57:47 +0000"},{"text":"&quot;Conflux&quot; is too a word, Firefox! You won't make me use &quot;confluence.&quot; Throw all the tiny red lines you wish, I shall destroy them all! -Fox","to_user_id":null,"from_user":"SJGames","id":1566946967,"from_user_id":2097481,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/64317528\/bigpyr_normal.png","created_at":"Mon, 20 Apr 2009 16:57:39 +0000"},{"text":"c4est relou d ecrire sur un clqvier qwerty. pis yq pqs firefox donc pqs de ;qils. fqil.","to_user_id":null,"from_user":"delgoff","id":1566944285,"from_user_id":1508369,"iso_language_code":"fr","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/94776151\/3318979772_3a9675756c_b_normal.jpg","created_at":"Mon, 20 Apr 2009 16:57:20 +0000"},{"text":"check out &quot;Personas&quot; for Firefox. Much easier than messing with themes. Dull Browser? get it here! http:\/\/digg.com\/d1nfa0 #newtechmondays","to_user_id":null,"from_user":"RosenKratz","id":1566935847,"from_user_id":2460052,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.atebits.com\/&quot;&gt;Tweetie&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/56395851\/n7021936_38073746_8583_normal.jpg","created_at":"Mon, 20 Apr 2009 16:56:16 +0000"},{"text":"20+ Great Twitter Tools for Firefox http:\/\/ping.fm\/qQDf1","to_user_id":null,"from_user":"RealEstateXpert","id":1566927762,"from_user_id":461121,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.ping.fm\/&quot;&gt;Ping.fm&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/54324508\/jons_pic_normal.jpg","created_at":"Mon, 20 Apr 2009 16:55:14 +0000"},{"text":"@filipekiss \u00e9 verdade! O Foxytunes, extens\u00e3o pro Firefox, usa a Amazon pra pegar as capas.. eaHeaouhAEOUahe","to_user_id":216075,"to_user":"filipekiss","from_user":"mustabr","id":1566927275,"from_user_id":872878,"iso_language_code":"pt","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/138775391\/elitegeek_normal.png","created_at":"Mon, 20 Apr 2009 16:55:09 +0000"},{"text":"Come on PayPal, you don't support Firefox on your developer website?","to_user_id":null,"from_user":"paulwpagel","id":1566925393,"from_user_id":1145227,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/57536184\/Photo_8_normal.jpg","created_at":"Mon, 20 Apr 2009 16:54:55 +0000"},{"text":"Cool Firefox extension, Firediff: http:\/\/www.incaseofstairs.com\/firediff\/","to_user_id":null,"from_user":"nderksen","id":1566920249,"from_user_id":410013,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/108693203\/opus_small_normal.png","created_at":"Mon, 20 Apr 2009 16:54:18 +0000"},{"text":"Firefox.next: an iTunes-like browser? http:\/\/tinyurl.com\/dexkrr","to_user_id":null,"from_user":"macstories","id":1566919449,"from_user_id":12757200,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/bluebirdapp.com&quot;&gt;Bluebird&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/148456587\/apple_logo_rainbow_6_color_normal.jpg","created_at":"Mon, 20 Apr 2009 16:54:12 +0000"},{"text":"*sigh* I do cruel things to Firefox. *restarts browser*","to_user_id":null,"from_user":"mactavish","id":1566917670,"from_user_id":60868,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.tweetdeck.com\/&quot;&gt;TweetDeck&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/59435649\/maryforprofileaug08_normal.jpg","created_at":"Mon, 20 Apr 2009 16:53:57 +0000"},{"text":"@mandiebear oh thats foxy tunes for firefox. its a plugin. that can control your music apps on your comp and post your song to twitter.","to_user_id":1734139,"to_user":"mandiebear","from_user":"samuraipanzer","id":1566914895,"from_user_id":126457,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.digsby.com\/&quot;&gt;digsby&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/79442241\/IMG00201_normal.jpg","created_at":"Mon, 20 Apr 2009 16:53:37 +0000"},{"text":"Its really confusing to keep track of windows in multiple desktops.. I have four windows of Firefox with the same page on each desktop.. :\\","to_user_id":null,"from_user":"itsanimesh","id":1566912616,"from_user_id":6778642,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/93907938\/DSC00370_normal.JPG","created_at":"Mon, 20 Apr 2009 16:53:19 +0000"},{"text":"Reading: &quot;10 Essential Firefox Addons\/Extensions For Bloggers | PCandWEB&quot; ( http:\/\/tinyurl.com\/dfrprz )","to_user_id":null,"from_user":"sgayen","id":1566912172,"from_user_id":4381856,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitthat.com\/&quot;&gt;twitthat&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/75387168\/sg_normal.JPG","created_at":"Mon, 20 Apr 2009 16:53:17 +0000"},{"text":"is sayin download skipscreen for firefox no more wait times for zshare rapidshare etc.....","to_user_id":null,"from_user":"r__dub","id":1566909817,"from_user_id":3204128,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/twitter.com\/&quot;&gt;web&lt;\/a&gt;","profile_image_url":"http:\/\/static.twitter.com\/images\/default_profile_normal.png","created_at":"Mon, 20 Apr 2009 16:52:59 +0000"},{"text":"@rbieber you using Firefox 3.0 or the 3.1 beta? I was using 3.1 beta (very stable) until Safari 4 beta came out","to_user_id":29636,"to_user":"rbieber","from_user":"frumpa","id":1566905518,"from_user_id":192534,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.nambu.com&quot;&gt;Nambu&lt;\/a&gt;","profile_image_url":"https:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/137414986\/3437301687_7edf805439_normal.jpg","created_at":"Mon, 20 Apr 2009 16:52:25 +0000"},{"text":"Can it be true that Google @Adsense doesn't support Firefox on the Mac OS? For real?! Google hangs &amp; doesn't offer any confirmations. WTF?","to_user_id":null,"from_user":"mylerdude","id":1566905089,"from_user_id":10384,"iso_language_code":"en","source":"&lt;a href=&quot;http:\/\/www.twhirl.org\/&quot;&gt;twhirl&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/125612392\/mylerdude_gmail.com_615b413c_normal.jpg","created_at":"Mon, 20 Apr 2009 16:52:24 +0000"},{"text":"amo el hack &quot;open new tabs in background&quot; de firefox. creo que deber\u00eda venir por defecto.","to_user_id":null,"from_user":"claudio","id":1566903611,"from_user_id":14147,"iso_language_code":"es","source":"&lt;a href=&quot;http:\/\/twitterfox.net\/&quot;&gt;TwitterFox&lt;\/a&gt;","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/77314492\/Imagen_1_normal.png","created_at":"Mon, 20 Apr 2009 16:52:13 +0000"}],"since_id":0,"max_id":1567167290,"refresh_url":"?since_id=1567167290&q=firefox","results_per_page":100,"next_page":"?page=2&max_id=1567167290&rpp=100&q=firefox","completed_in":0.041434,"page":1,"query":"firefox"}