quarry 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. data/CHANGES +40 -3
  2. data/MANIFEST +290 -78
  3. data/README +51 -37
  4. data/RELEASE +12 -0
  5. data/VERSION +1 -1
  6. data/bin/quarry +117 -0
  7. data/bin/quarry-doc +26 -0
  8. data/bin/ruby-break +10 -0
  9. data/bin/{xact-ruby → ruby-xacto} +0 -0
  10. data/doc/assets/images/clipboard.jpg +0 -0
  11. data/doc/assets/images/clipboard2.png +0 -0
  12. data/doc/assets/images/darksilver.png +0 -0
  13. data/doc/assets/images/icon/book.jpg +0 -0
  14. data/doc/assets/images/icon/download.gif +0 -0
  15. data/doc/assets/images/icon/letter_r.png +0 -0
  16. data/doc/assets/images/icon/license.png +0 -0
  17. data/doc/assets/images/icon/software.png +0 -0
  18. data/doc/assets/images/icon/source.png +0 -0
  19. data/doc/assets/images/miner.jpg +0 -0
  20. data/doc/assets/images/rbrylmtrx.png +0 -0
  21. data/doc/assets/images/ruby.gif +0 -0
  22. data/doc/assets/images/runneth.png +0 -0
  23. data/doc/assets/images/silver.gif +0 -0
  24. data/doc/assets/images/test.jpg +0 -0
  25. data/doc/assets/jquery/jquery.js +1 -0
  26. data/doc/assets/jquery/jquery.tabs.js +1 -0
  27. data/doc/assets/rdoc_ad.html +12 -0
  28. data/doc/assets/styles/index.css +138 -0
  29. data/doc/guide/stubs.md +125 -0
  30. data/doc/index.html +285 -0
  31. data/doc/log/bstats/stats.html +39 -0
  32. data/doc/log/notes.xml +32 -0
  33. data/doc/log/stats.html +25 -0
  34. data/doc/log/stats.log +14 -0
  35. data/doc/log/syntax.log +0 -0
  36. data/doc/rdoc/classes/Assertion/False.html +151 -106
  37. data/doc/rdoc/classes/Assertion/True.html +128 -113
  38. data/doc/rdoc/classes/Assertion.html +147 -77
  39. data/doc/rdoc/classes/Kernel.html +84 -65
  40. data/doc/rdoc/classes/Method.html +123 -92
  41. data/doc/rdoc/classes/Object.html +468 -115
  42. data/doc/rdoc/classes/Quarry/Break.html +231 -0
  43. data/doc/rdoc/classes/Quarry/Command.html +443 -0
  44. data/doc/rdoc/classes/Quarry/Extract.html +215 -0
  45. data/doc/rdoc/classes/Quarry/MethodProbe.html +203 -145
  46. data/doc/rdoc/classes/Quarry/Mock/Delegator.html +179 -0
  47. data/doc/rdoc/classes/Quarry/Mock/Setter.html +175 -0
  48. data/doc/rdoc/classes/Quarry/Mock.html +211 -67
  49. data/doc/rdoc/classes/Quarry/Spec/Comment.html +237 -0
  50. data/doc/rdoc/classes/Quarry/Spec/Config.html +257 -0
  51. data/doc/rdoc/classes/Quarry/Spec/Context.html +154 -0
  52. data/doc/rdoc/classes/Quarry/Spec/Document.html +382 -0
  53. data/doc/rdoc/classes/Quarry/Spec/Header.html +195 -0
  54. data/doc/rdoc/classes/Quarry/Spec/Macro.html +166 -0
  55. data/doc/rdoc/classes/Quarry/Spec/Markup.html +279 -0
  56. data/doc/rdoc/classes/Quarry/Spec/Reporter/DotProgress.html +234 -0
  57. data/doc/rdoc/classes/Quarry/Spec/Reporter/Summary.html +294 -0
  58. data/doc/rdoc/classes/Quarry/Spec/Reporter/Verbatim.html +311 -0
  59. data/doc/rdoc/classes/Quarry/Spec/Runner.html +352 -0
  60. data/doc/rdoc/classes/Quarry/Spec/Step.html +190 -0
  61. data/doc/rdoc/classes/Quarry/Spec/Template.html +205 -0
  62. data/doc/rdoc/classes/Quarry/Stub/Delegator.html +179 -0
  63. data/doc/rdoc/classes/Quarry/Stub/Setter.html +175 -0
  64. data/doc/rdoc/classes/Quarry/Stub.html +224 -0
  65. data/doc/rdoc/classes/Quarry.html +153 -154
  66. data/doc/rdoc/created.rid +1 -1
  67. data/doc/rdoc/files/CHANGES.html +126 -76
  68. data/doc/rdoc/files/COPYING.html +84 -73
  69. data/doc/rdoc/files/README.html +135 -111
  70. data/doc/rdoc/files/RELEASE.html +122 -0
  71. data/doc/rdoc/files/VERSION.html +85 -74
  72. data/doc/rdoc/files/bin/quarry-doc.html +109 -0
  73. data/doc/rdoc/files/bin/quarry.html +109 -0
  74. data/doc/rdoc/files/bin/ruby-break.html +108 -0
  75. data/doc/rdoc/files/bin/ruby-xacto.html +101 -0
  76. data/doc/rdoc/files/lib/quarry/assert_rb.html +155 -0
  77. data/doc/rdoc/files/lib/quarry/break_rb.html +101 -0
  78. data/doc/rdoc/files/lib/quarry/extract_rb.html +108 -0
  79. data/doc/rdoc/files/lib/quarry/loadmonitor_rb.html +80 -71
  80. data/doc/rdoc/files/lib/quarry/spec/config_rb.html +101 -0
  81. data/doc/rdoc/files/lib/quarry/spec/context_rb.html +101 -0
  82. data/doc/rdoc/files/lib/quarry/spec/document_rb.html +111 -0
  83. data/doc/rdoc/files/lib/quarry/spec/markup_rb.html +108 -0
  84. data/doc/rdoc/files/lib/quarry/spec/reporter/dotprogress_rb.html +108 -0
  85. data/doc/rdoc/files/lib/quarry/spec/reporter/summary_rb.html +108 -0
  86. data/doc/rdoc/files/lib/quarry/spec/reporter/verbatim_rb.html +108 -0
  87. data/doc/rdoc/files/lib/quarry/spec/reporter_rb.html +109 -0
  88. data/doc/rdoc/files/lib/quarry/spec/runner_rb.html +109 -0
  89. data/doc/rdoc/files/lib/quarry/spec/step_rb.html +101 -0
  90. data/doc/rdoc/files/lib/quarry/spec/template_rhtml.html +228 -0
  91. data/doc/rdoc/files/lib/quarry/spec_rb.html +113 -0
  92. data/doc/rdoc/files/lib/quarry/stub/mock_rb.html +101 -0
  93. data/doc/rdoc/files/lib/quarry/stub/probe_rb.html +122 -0
  94. data/doc/rdoc/files/lib/quarry/stub/spec_txt.html +118 -0
  95. data/doc/rdoc/files/lib/quarry/stub/stub_rb.html +101 -0
  96. data/doc/rdoc/fr_class_index.html +48 -52
  97. data/doc/rdoc/fr_file_index.html +47 -57
  98. data/doc/rdoc/fr_method_index.html +109 -69
  99. data/doc/rdoc/index.html +12 -14
  100. data/doc/rdoc/rdoc-style.css +154 -121
  101. data/doc/ri/Assertion/False/cdesc-False.yaml +5 -3
  102. data/doc/ri/Assertion/True/cdesc-True.yaml +4 -2
  103. data/doc/ri/Assertion/True/message-c.yaml +2 -2
  104. data/doc/ri/Assertion/True/message-i.yaml +1 -1
  105. data/doc/ri/Assertion/True/method_missing-i.yaml +4 -3
  106. data/doc/ri/Assertion/cdesc-Assertion.yaml +24 -1
  107. data/doc/ri/Object/assert%21-i.yaml +7 -4
  108. data/doc/ri/Object/assert-i.yaml +3 -2
  109. data/doc/ri/Object/assert_raises%21-i.yaml +12 -0
  110. data/doc/ri/Object/assert_raises-i.yaml +15 -0
  111. data/doc/ri/Object/cdesc-Object.yaml +24 -2
  112. data/doc/ri/{Quarry/Design/Specification/outline-i.yaml → Object/mock-i.yaml} +4 -4
  113. data/doc/ri/Object/refute-i.yaml +13 -0
  114. data/doc/ri/Object/refute_raises-i.yaml +17 -0
  115. data/doc/ri/Object/remove-i.yaml +12 -0
  116. data/doc/ri/{Quarry/Design/check-c.yaml → Object/should-i.yaml} +4 -4
  117. data/doc/ri/Object/should_not-i.yaml +12 -0
  118. data/doc/ri/Object/should_not_raise-i.yaml +12 -0
  119. data/doc/ri/Object/should_raise-i.yaml +12 -0
  120. data/doc/ri/{Quarry/Mock/Object/mock-c.yaml → Object/stub-i.yaml} +5 -5
  121. data/doc/ri/{Module/cdesc-Module.yaml → Quarry/Break/cdesc-Break.yaml} +10 -8
  122. data/doc/ri/Quarry/Break/edit-i.yaml +11 -0
  123. data/doc/ri/Quarry/Break/new-c.yaml +11 -0
  124. data/doc/ri/Quarry/Extract/cdesc-Extract.yaml +26 -0
  125. data/doc/ri/Quarry/Extract/create_test-i.yaml +12 -0
  126. data/doc/ri/Quarry/Extract/extract_test_from_file-i.yaml +12 -0
  127. data/doc/ri/Quarry/Extract/test_extract-i.yaml +18 -0
  128. data/doc/ri/Quarry/Mock/Delegator/cdesc-Delegator.yaml +20 -0
  129. data/doc/ri/Quarry/{Design/Specification/Context → Mock/Delegator}/method_missing-i.yaml +2 -2
  130. data/doc/ri/Quarry/{Design/specification-c.yaml → Mock/Delegator/new-c.yaml} +3 -3
  131. data/doc/ri/{Module/method_added-i.yaml → Quarry/Mock/Setter/%3d%3d-i.yaml} +3 -3
  132. data/doc/ri/Quarry/Mock/Setter/cdesc-Setter.yaml +18 -0
  133. data/doc/ri/Quarry/Mock/Setter/new-c.yaml +10 -0
  134. data/doc/ri/Quarry/Mock/__table__-i.yaml +11 -0
  135. data/doc/ri/Quarry/Mock/cdesc-Mock.yaml +17 -7
  136. data/doc/ri/Quarry/Mock/method_missing-i.yaml +12 -0
  137. data/doc/ri/Quarry/{Design/outline-c.yaml → Mock/new-c.yaml} +2 -2
  138. data/doc/ri/Quarry/Spec/Comment/cdesc-Comment.yaml +33 -0
  139. data/doc/ri/Quarry/Spec/Comment/macro%3f-i.yaml +12 -0
  140. data/doc/ri/Quarry/Spec/Comment/new-c.yaml +10 -0
  141. data/doc/ri/Quarry/Spec/Comment/type-i.yaml +12 -0
  142. data/doc/ri/Quarry/Spec/Config/after-i.yaml +12 -0
  143. data/doc/ri/Quarry/Spec/Config/after_spec-i.yaml +12 -0
  144. data/doc/ri/Quarry/Spec/Config/before-i.yaml +12 -0
  145. data/doc/ri/Quarry/Spec/Config/before_spec-i.yaml +12 -0
  146. data/doc/ri/Quarry/{Design/Specification/Context/cdesc-Context.yaml → Spec/Config/cdesc-Config.yaml} +11 -9
  147. data/doc/ri/Quarry/{Mock/Object/mocks-c.yaml → Spec/Config/new-c.yaml} +2 -2
  148. data/doc/ri/Quarry/Spec/Context/cdesc-Context.yaml +21 -0
  149. data/doc/ri/Quarry/{Design/specifications-c.yaml → Spec/Context/new-c.yaml} +2 -2
  150. data/doc/ri/Quarry/Spec/Document/cdesc-Document.yaml +76 -0
  151. data/doc/ri/Quarry/Spec/Document/generate-i.yaml +12 -0
  152. data/doc/ri/Quarry/{Mock/Object/echo-c.yaml → Spec/Document/new-c.yaml} +4 -4
  153. data/doc/ri/Quarry/Spec/Document/quiet%3f-i.yaml +12 -0
  154. data/doc/ri/Quarry/Spec/Document/require_rdoc-i.yaml +11 -0
  155. data/doc/ri/Quarry/Spec/Document/save-i.yaml +12 -0
  156. data/doc/ri/Quarry/Spec/Document/template-i.yaml +12 -0
  157. data/doc/ri/Quarry/Spec/Header/cdesc-Header.yaml +30 -0
  158. data/doc/ri/Quarry/Spec/Header/new-c.yaml +10 -0
  159. data/doc/ri/Quarry/Spec/Macro/cdesc-Macro.yaml +22 -0
  160. data/doc/ri/Quarry/Spec/Macro/new-c.yaml +10 -0
  161. data/doc/ri/Quarry/Spec/Markup/cdesc-Markup.yaml +31 -0
  162. data/doc/ri/Quarry/Spec/Markup/description-i.yaml +11 -0
  163. data/doc/ri/Quarry/Spec/Markup/new-c.yaml +11 -0
  164. data/doc/ri/Quarry/Spec/Markup/parse-i.yaml +11 -0
  165. data/doc/ri/Quarry/Spec/Markup/parse_section-i.yaml +11 -0
  166. data/doc/ri/Quarry/Spec/Reporter/DotProgress/cdesc-DotProgress.yaml +21 -0
  167. data/doc/ri/Quarry/{Design/Specification/Context/specifications-i.yaml → Spec/Reporter/DotProgress/report_intro-i.yaml} +2 -2
  168. data/doc/ri/Quarry/Spec/Reporter/DotProgress/report_step-i.yaml +10 -0
  169. data/doc/ri/Quarry/Spec/Reporter/DotProgress/report_summary-i.yaml +16 -0
  170. data/doc/ri/Quarry/Spec/Reporter/Summary/cdesc-Summary.yaml +31 -0
  171. data/doc/ri/Quarry/Spec/Reporter/Summary/report_comment-i.yaml +10 -0
  172. data/doc/ri/Quarry/Spec/Reporter/Summary/report_error-i.yaml +10 -0
  173. data/doc/ri/Quarry/Spec/Reporter/Summary/report_fail-i.yaml +10 -0
  174. data/doc/ri/Quarry/Spec/Reporter/Summary/report_header-i.yaml +10 -0
  175. data/doc/ri/Quarry/Spec/Reporter/Summary/report_macro-i.yaml +10 -0
  176. data/doc/ri/Quarry/{Design/Specification/Context/before-i.yaml → Spec/Reporter/Summary/report_pass-i.yaml} +3 -3
  177. data/doc/ri/Quarry/Spec/Reporter/Verbatim/cdesc-Verbatim.yaml +29 -0
  178. data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_comment-i.yaml +10 -0
  179. data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_error-i.yaml +10 -0
  180. data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_fail-i.yaml +10 -0
  181. data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_header-i.yaml +16 -0
  182. data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_macro-i.yaml +10 -0
  183. data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_pass-i.yaml +10 -0
  184. data/doc/ri/Quarry/Spec/Reporter/cdesc-Reporter.yaml +20 -0
  185. data/doc/ri/Quarry/Spec/Runner/cdesc-Runner.yaml +47 -0
  186. data/doc/ri/Quarry/{Design/Specification → Spec/Runner}/check-i.yaml +3 -3
  187. data/doc/ri/Quarry/Spec/Runner/check_spec-i.yaml +12 -0
  188. data/doc/ri/Quarry/{Design/Specification → Spec/Runner}/new-c.yaml +2 -2
  189. data/doc/ri/Quarry/Spec/Runner/run_step-i.yaml +12 -0
  190. data/doc/ri/Quarry/Spec/Step/cdesc-Step.yaml +30 -0
  191. data/doc/ri/Quarry/Spec/Step/new-c.yaml +10 -0
  192. data/doc/ri/Quarry/Spec/Template/cdesc-Template.yaml +31 -0
  193. data/doc/ri/Quarry/Spec/Template/new-c.yaml +11 -0
  194. data/doc/ri/Quarry/{Design/Specification/Context/after-i.yaml → Spec/Template/parse_template-i.yaml} +3 -3
  195. data/doc/ri/Quarry/Spec/cdesc-Spec.yaml +15 -0
  196. data/doc/ri/Quarry/Stub/Delegator/cdesc-Delegator.yaml +20 -0
  197. data/doc/ri/Quarry/Stub/Delegator/method_missing-i.yaml +10 -0
  198. data/doc/ri/Quarry/Stub/Delegator/new-c.yaml +10 -0
  199. data/doc/ri/Quarry/Stub/Setter/%3d%3d-i.yaml +10 -0
  200. data/doc/ri/Quarry/Stub/Setter/cdesc-Setter.yaml +18 -0
  201. data/doc/ri/Quarry/Stub/Setter/new-c.yaml +10 -0
  202. data/doc/ri/Quarry/Stub/__table__-i.yaml +11 -0
  203. data/doc/ri/Quarry/Stub/cdesc-Stub.yaml +23 -0
  204. data/doc/ri/Quarry/Stub/method_missing-i.yaml +11 -0
  205. data/doc/ri/Quarry/Stub/new-c.yaml +10 -0
  206. data/doc/ri/Quarry/cdesc-Quarry.yaml +2 -3
  207. data/doc/ri/created.rid +1 -1
  208. data/doc/spec/stub.html +394 -0
  209. data/lib/quarry/assert.rb +198 -0
  210. data/lib/quarry/break.rb +51 -0
  211. data/lib/quarry/extract.rb +135 -0
  212. data/lib/quarry/loadmonitor.rb +6 -1
  213. data/lib/quarry/spec/config.rb +32 -0
  214. data/lib/quarry/spec/context.rb +19 -0
  215. data/lib/quarry/spec/document.rb +130 -0
  216. data/lib/quarry/spec/markup.rb +85 -0
  217. data/lib/quarry/spec/reporter/dotprogress.rb +66 -0
  218. data/lib/quarry/spec/reporter/summary.rb +74 -0
  219. data/lib/quarry/spec/reporter/verbatim.rb +87 -0
  220. data/lib/quarry/spec/reporter.rb +74 -0
  221. data/lib/quarry/spec/runner.rb +127 -0
  222. data/lib/quarry/spec/step.rb +78 -0
  223. data/lib/quarry/spec/template.rhtml +116 -0
  224. data/lib/quarry/spec.rb +7 -0
  225. data/lib/quarry/stub/mock.rb +94 -0
  226. data/lib/quarry/{methodprobe.rb → stub/probe.rb} +0 -0
  227. data/lib/quarry/stub/spec.txt +113 -0
  228. data/lib/quarry/stub/stub.rb +93 -0
  229. data/meta/abstract +5 -0
  230. data/meta/authors +1 -0
  231. data/meta/created +1 -0
  232. data/meta/homepage +1 -0
  233. data/meta/requires +1 -0
  234. data/meta/summary +1 -0
  235. data/spec/basic.rd +20 -0
  236. data/spec/complex.rd +50 -0
  237. data/spec/mock.rd +53 -0
  238. data/spec/stub.rd +61 -0
  239. data/{lib/quarry → work/consider}/document.rb +0 -0
  240. data/work/consider/fixture.rb +153 -0
  241. data/{lib/quarry → work/deprecated}/assert/must.rb +1 -0
  242. data/{lib/quarry → work/deprecated}/assert/should.rb +0 -0
  243. data/work/deprecated/build.rb +82 -0
  244. data/work/deprecated/mock/file.rb +11 -0
  245. data/work/deprecated/mock/mock.0.rb +77 -0
  246. data/work/deprecated/overlay.rb +64 -0
  247. data/work/deprecated/spec.rb +195 -0
  248. data/work/deprecated/stub/stub.0.rb +180 -0
  249. data/work/deprecated/stub/stub.1.rb +114 -0
  250. data/work/deprecated/stub/test_stub.rb +66 -0
  251. data/work/deprecated/test/case.rb +141 -0
  252. data/work/sandbox/assert.rb +100 -0
  253. data/work/sandbox/bug.rb +49 -0
  254. data/work/sandbox/build/announce.rb +213 -0
  255. data/work/sandbox/build/check.rb +109 -0
  256. data/work/sandbox/build/gem.rb +235 -0
  257. data/work/sandbox/build/make.rb +118 -0
  258. data/work/sandbox/build/manpage.rb +201 -0
  259. data/work/sandbox/build/notes.rb +214 -0
  260. data/work/sandbox/build/pack.rb +228 -0
  261. data/work/sandbox/build/rdoc.rb +289 -0
  262. data/work/sandbox/build/rubyforge.rb +91 -0
  263. data/work/sandbox/build/sign.rb +241 -0
  264. data/work/sandbox/build/stamp.rb +37 -0
  265. data/work/sandbox/build/stats.rb +154 -0
  266. data/work/sandbox/build/svn.rb +193 -0
  267. data/work/sandbox/build/test.rb +521 -0
  268. data/work/sandbox/design.rb +200 -0
  269. data/work/sandbox/iface_scanner.rb +102 -0
  270. data/work/sandbox/testunit/assertions/assert_has_keys.rb +38 -0
  271. data/work/sandbox/testunit/assertions/assert_has_only_keys.rb +38 -0
  272. data/work/sandbox/testunit/unit.rb +104 -0
  273. data/work/sandbox/unitspec.rb +54 -0
  274. data/work/sandbox/x_isotest.rb +532 -0
  275. metadata +318 -93
  276. data/METADATA +0 -22
  277. data/NEWS +0 -8
  278. data/bin/rubybreak +0 -3
  279. data/demo/spec/demo_check.rb +0 -21
  280. data/demo/spec/demo_outline.rb +0 -25
  281. data/demo/test/demo_run.rb +0 -21
  282. data/doc/manual.html2 +0 -1416
  283. data/doc/rdoc/classes/Module.html +0 -165
  284. data/doc/rdoc/classes/Quarry/Design/Specification/Context.html +0 -174
  285. data/doc/rdoc/classes/Quarry/Design/Specification.html +0 -265
  286. data/doc/rdoc/classes/Quarry/Design.html +0 -170
  287. data/doc/rdoc/classes/Quarry/Mock/Object.html +0 -276
  288. data/doc/rdoc/files/MANIFEST.html +0 -630
  289. data/doc/rdoc/files/METADATA.html +0 -92
  290. data/doc/rdoc/files/NEWS.html +0 -99
  291. data/doc/rdoc/files/bin/rubybreak.html +0 -96
  292. data/doc/rdoc/files/bin/xact-ruby.html +0 -92
  293. data/doc/rdoc/files/lib/quarry/assert/must_rb.html +0 -96
  294. data/doc/rdoc/files/lib/quarry/assert/should_rb.html +0 -96
  295. data/doc/rdoc/files/lib/quarry/assertion_rb.html +0 -96
  296. data/doc/rdoc/files/lib/quarry/breakout_rb.html +0 -144
  297. data/doc/rdoc/files/lib/quarry/design/spec_rb.html +0 -100
  298. data/doc/rdoc/files/lib/quarry/document_rb.html +0 -92
  299. data/doc/rdoc/files/lib/quarry/methodprobe_rb.html +0 -111
  300. data/doc/rdoc/files/lib/quarry/mock/object_rb.html +0 -123
  301. data/doc/rdoc/files/lib/quarry/mockery_rb.html +0 -115
  302. data/doc/ri/Module/doc-i.yaml +0 -16
  303. data/doc/ri/Quarry/Design/Specification/cdesc-Specification.yaml +0 -44
  304. data/doc/ri/Quarry/Design/cdesc-Design.yaml +0 -22
  305. data/doc/ri/Quarry/Mock/Object/cdesc-Object.yaml +0 -52
  306. data/doc/ri/Quarry/Mock/Object/keys-c.yaml +0 -12
  307. data/doc/ri/Quarry/Mock/Object/spin-c.yaml +0 -12
  308. data/doc/ri/Quarry/Mockery-i.yaml +0 -12
  309. data/lib/quarry/assertion.rb +0 -95
  310. data/lib/quarry/breakout.rb +0 -45
  311. data/lib/quarry/design/spec.rb +0 -197
  312. data/lib/quarry/mock/object.rb +0 -169
  313. data/lib/quarry/mockery.rb +0 -85
@@ -0,0 +1,241 @@
1
+ # = TITLE:
2
+ #
3
+ # Sign DSL
4
+ #
5
+ # = COPYING:
6
+ #
7
+ # Copyright (c) 2007,2008 Tiger Ops
8
+ #
9
+ # This file is part of the Reap program.
10
+ #
11
+ # Reap is free software: you can redistribute it and/or modify
12
+ # it under the terms of the GNU General Public License as published by
13
+ # the Free Software Foundation, either version 3 of the License, or
14
+ # (at your option) any later version.
15
+ #
16
+ # Reap is distributed in the hope that it will be useful,
17
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ # GNU General Public License for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with Reap. If not, see <http://www.gnu.org/licenses/>.
23
+ #
24
+ # = TODO:
25
+ # - Do signitures belong under data/{name}/?
26
+ # Heck do all these metadata files belong there?
27
+ # OTOH using remote require, how would one access these?
28
+ # should they be contigious to the libs themselves?
29
+
30
+ #require 'autorake/tasks/manifest'
31
+
32
+ #
33
+ module Quarry
34
+
35
+ # Create signitures for libraries.
36
+ # FIXME
37
+
38
+ class Sign < Build
39
+
40
+ # Default set of files to sign.
41
+ DEFAULT_SIGN_FILES = ['lib/**/*', 'ext/**/*']
42
+
43
+ DEFAULT_PUBLIC_KEY = 'pubkey.pem'
44
+ DEFAULT_PRIVATE_KEY = '_privkey.pem'
45
+
46
+ # Generate file signitures. This task generates signitures
47
+ # for each library file using public/private keys.
48
+ # The sign script will generate encrypted signitures for
49
+ # files in the project --by default the lib/ and ext/ files.
50
+ #
51
+ # name Project name [name]
52
+ # keyfile Pathname to .pem file for private key
53
+ # files Files to include/exclude.
54
+ # output Directory to store signiture files
55
+ # [data/{name}/signitures/]
56
+ #
57
+ # By default the keyfile is '_privkey.pem'. (BE SURE NEVER
58
+ # TO PUBLISH THIS FILE!!!) But if no a private key file is
59
+ # given/found, this will ask if you would like to
60
+ # generate one. It also can generate a public key for the
61
+ # project if it does not have one.
62
+ #
63
+ # There are two ways to approach key usage here. Either
64
+ # a per project key pair, or use a personal key pair.
65
+
66
+ def sign( override=nil )
67
+ name = info.project
68
+ keyfile = info.private_key
69
+
70
+ output = info.sign_output
71
+ files = info.sign_files
72
+
73
+ files ||= DEFAULT_SIGN_FILES
74
+ keyfile ||= DEFAULT_PRIVATE_KEY
75
+ output ||= File.join('data',name,'signitures')
76
+
77
+ files = Dir.multiglob_with_default(DEFAULT_SIGN_FILES, files)
78
+
79
+ unless File.directory?( dir = File.dirname(output) )
80
+ puts "Output directory #{dir} doesn't exist."
81
+ return nil
82
+ end
83
+
84
+ output = File.expand_path(output)
85
+
86
+ unless keyfile and File.exist?(keyfile)
87
+ ans = ask("Private key file required. Generate one?", "yN")
88
+ case ans
89
+ when 'y', 'Y'
90
+ keyfile = genkey(name)
91
+ puts "\nFile '#{keyfile}' created. Be sure to keep this file private and secure."
92
+ else
93
+ puts "Task cancelled."
94
+ exit -1
95
+ #return nil
96
+ end
97
+ end
98
+
99
+ keyfile = File.expand_path(keyfile)
100
+
101
+ generate_signitures(keyfile, files, output)
102
+ end
103
+
104
+ private
105
+
106
+ # Generate a signiture for a file.
107
+
108
+ def generate_signitures( keyfile, files, to_folder )
109
+ privkey = load_key(keyfile)
110
+
111
+ dir = File.dirname(to_folder)
112
+ save_key(privkey.public_key, File.join(dir, DEFAULT_PUBLIC_KEY))
113
+
114
+ fu.mkdir_p(to_folder)
115
+ files.each do |file|
116
+ next if File.directory?(file)
117
+ sig = sign_file(privkey, file)
118
+ write_signiture(to_folder, file, sig)
119
+ end
120
+ end
121
+
122
+ # Write signiture to file.
123
+
124
+ def write_signiture( to_folder, file, sig )
125
+ sigfile = File.join(to_folder, file + '.sig')
126
+ fu.mkdir_p(File.dirname(sigfile))
127
+ if project.dryrun?
128
+ puts "(save #{sigfile})" unless project.quiet?
129
+ else
130
+ File.open( sigfile, 'w' ) do |f|
131
+ f << sig
132
+ end
133
+ end
134
+ end
135
+
136
+ # Generate a signiture of a file.
137
+
138
+ def sign_file( key, file )
139
+ plain = File.read( file )
140
+ dig = digester(info.digest||'sha256').new
141
+ sig = key.sign(dig, plain)
142
+ return sig
143
+ end
144
+
145
+ # Verify a signiture of a file.
146
+
147
+ def verify_signiture?( pubkey, sig, plain )
148
+ plain = plain.read if IO === plain
149
+ dig = digester(info.digest||'sha256').new
150
+ success = pubkey.verify(dig, sig, plain)
151
+ return success
152
+ end
153
+
154
+ # Generate a public key from a private key.
155
+ #
156
+ #def pubkey( privkey )
157
+ # pubkey = privkey.public_key
158
+ # return pubkey
159
+ #end
160
+
161
+ # Load key.
162
+
163
+ def load_key( file )
164
+ key = OpenSSL::PKey::RSA.new(File.read(file))
165
+ end
166
+
167
+ # Save key.
168
+
169
+ def save_key( key, file )
170
+ if project.dryrun?
171
+ puts "(save #{file})" unless project.quiet?
172
+ else
173
+ File.open( file, 'w' ) do |f|
174
+ f << key.to_pem
175
+ end
176
+ end
177
+ end
178
+
179
+ # Generate a private key and save it to '_privkey.pem'.
180
+
181
+ def genkey( name )
182
+ key = OpenSSL::PKey::RSA.new(2048){ print "." } # @name }
183
+ save_key( key, PRIVATE_KEY )
184
+ return PRIVATE_KEY
185
+ end
186
+
187
+ # def write_keypair( libname )
188
+ # privkey = genkey( libname )
189
+ # pubkey = privkey.public_key
190
+ # save_key( privkey, "privkey.pem" )
191
+ # save_key( pubkey, "pubkey.pem" )
192
+ # puts "Key pair generated. Please secure privkey.pem."
193
+ # end
194
+ #
195
+ # # Generate a private key.
196
+ #
197
+ # def genkey( libname='.' )
198
+ # key = OpenSSL::PKey::RSA.new(2048) { print "." } # libname }
199
+ # return key
200
+ # end
201
+ #
202
+ # # Generate a public key from a private key.
203
+ #
204
+ # def pubkey( privkey )
205
+ # pubkey = privkey.public_key
206
+ # return pubkey
207
+ # end
208
+
209
+ # Return a digest class for given +type+.
210
+ # Supported digests are:
211
+ #
212
+ # * md5
213
+ # * sha1
214
+ # * sha128 (same as sha1)
215
+ # * sha256
216
+ # * sha512
217
+ #
218
+ # Default digest type is sha256.
219
+
220
+ # def digester( type=nil )
221
+ # require 'openssl'
222
+ # type = 'sha256' unless type
223
+ # case type.to_s.downcase
224
+ # when 'md5'
225
+ # require 'digest/md5'
226
+ # Digest::MD5
227
+ # when 'sha128', 'sha1'
228
+ # require 'digest/sha1' #need?
229
+ # OpenSSL::Digest::SHA1
230
+ # when 'sha256'
231
+ # require 'digest/sha1' #need?
232
+ # OpenSSL::Digest::SHA256
233
+ # when 'sha512'
234
+ # require 'digest/sha1' #need?
235
+ # OpenSSL::Digest::SHA512
236
+ # end
237
+ # end
238
+
239
+ end
240
+
241
+ end
@@ -0,0 +1,37 @@
1
+ rquire 'quarry/build'
2
+
3
+ module Quarry
4
+
5
+ # Create a VERSION stamp.
6
+
7
+ class Stamp < Build
8
+
9
+ attr_accessor :file
10
+ attr_accessor :name
11
+ attr_accessor :version
12
+ attr_accessor :status
13
+
14
+ attr_accessor :default
15
+ attr_accessor :libpath
16
+
17
+ # Update release "stamp" (.roll) file.
18
+
19
+ def stamp
20
+ w = ''
21
+ w << "#{name} #{version} #{status} #{Time.now.strftime('%Y-%m-%d')}"
22
+ w << " #{default}" if default
23
+ w << "\n"
24
+ w << libpath.join("\n")
25
+
26
+ if dryrun?
27
+ puts file + ":"
28
+ puts w
29
+ else
30
+ File.open(file, 'w'){|f| f << w}
31
+ puts "#{file} updated."
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,154 @@
1
+ require 'quarry/build'
2
+
3
+ module Quarry
4
+
5
+ #
6
+
7
+ class Stats < Build
8
+
9
+ DEFAULT_LOADPATH = ['lib']
10
+
11
+ # List of file path(s) of project scripts to code count.
12
+
13
+ attr_accessor :loadpath
14
+ attr_accessor :exclude
15
+
16
+ alias_method :include, :loadpath
17
+ alias_method :include=, :loadpath=
18
+
19
+ # Simple code count analysis.
20
+ #
21
+ # Scan source code counting files, lines of code and
22
+ # comments and presents a report of it's findings.
23
+ #
24
+ # scripts Files to include and/or exclude in
25
+ # analysis. The default includes all
26
+ # files in the lib/ and ext/ directories.
27
+ #
28
+ # TODO Support - and + augmentations for configuration ?
29
+
30
+ def stats(options=nil)
31
+ options ||= {}
32
+
33
+ glob = options[:include] || options[:loadpath] || loadpath || DEFAULT_LOADPATH
34
+ excl = options[:exclude] || exclude || []
35
+
36
+ if String===glob
37
+ glob = glob.split(/[:;]/)
38
+ end
39
+
40
+ files = multiglob_r(*glob) - multiglob_r(*excl)
41
+
42
+ #() #.inject([]){ |memo, find| memo.concat(glob(find)); memo }
43
+ #Dir.multiglob_with_default(DEFAULT_STATS_FILES)
44
+
45
+ fc, l, c, r, t, s = *line_count(*files)
46
+
47
+ fct, lt, ct, rt, tt, st = *([0]*6)
48
+ if File.directory?('test')
49
+ fct, lt, ct, rt, tt, st = *line_count('test/**/*')
50
+ t = lt if lt > 0
51
+ end
52
+
53
+ rat = lambda do |d,n|
54
+ if d > n and n != 0
55
+ "%.1f" % [ d.to_f / n ]
56
+ elsif n > d and d != 0
57
+ "-" #"%.1f:1" % [ n.to_f / d ]
58
+ elsif d == 0 or n == 0
59
+ "-"
60
+ else
61
+ "1.0"
62
+ end
63
+ end
64
+
65
+ per = lambda do |n,d|
66
+ if d != 0
67
+ (((n.to_f / d)*100).to_i).to_s + "%"
68
+ else
69
+ "-"
70
+ end
71
+ end
72
+
73
+ max = l.to_s.size + 4
74
+
75
+ puts
76
+ #puts "FILES:"
77
+ #puts " source: #{fc}"
78
+ #puts " test : #{fct}"
79
+ #puts " total : #{fc+fct}"
80
+ #puts
81
+ #puts "LINES:"
82
+ #puts " code : %#{max}s %4s" % [ c.to_s, per[c,l] ]
83
+ #puts " docs : %#{max}s %4s" % [ r.to_s, per[r,l] ]
84
+ #puts " space : %#{max}s %4s" % [ s.to_s, per[s,l] ]
85
+ #puts " test : %#{max}s %4s" % [ t.to_s, per[t,l] ]
86
+ #puts " total : %#{max}s %4s" % [ l.to_s, per[l,l] ]
87
+ #puts
88
+ #puts "Ratio to 1 :"
89
+ #puts " code to test : #{rat[c,t]} #{per[c,t]}"
90
+
91
+ head = ["Total", "Code", "-%-", "Docs", "-%-", "Blank", "-%-", "Files"]
92
+ prod = [l.to_s, c.to_s, per[c,l], r.to_s, per[r,l], s.to_s, per[s,l], fc]
93
+ test = [lt.to_s, ct.to_s, per[ct,l], rt.to_s, per[rt,l], st.to_s, per[st,l], fct]
94
+ totl = [(l+lt), (c+ct), per[c+ct,l+lt], (r+rt), per[r+rt,l+lt], (s+st), per[s+st,l+lt], (fc+fct)]
95
+
96
+ puts "TYPE %#{max}s %#{max}s %4s %#{max}s %4s %#{max}s %4s %#{max}s" % head
97
+ puts "Source %#{max}s %#{max}s %4s %#{max}s %4s %#{max}s %4s %#{max}s" % prod
98
+ puts "Test %#{max}s %#{max}s %4s %#{max}s %4s %#{max}s %4s %#{max}s" % test
99
+ puts "Total %#{max}s %#{max}s %4s %#{max}s %4s %#{max}s %4s %#{max}s" % totl
100
+ puts
101
+ puts "RATIO Code Docs Blank Test Total"
102
+ puts "Code %7s %7s %7s %7s %7s" % [ rat[c,c], rat[c,r], rat[c,s], rat[c,t], rat[c,l] ]
103
+ puts "Docs %7s %7s %7s %7s %7s" % [ rat[r,c], rat[r,r], rat[r,s], rat[r,t], rat[r,l] ]
104
+ puts "Blank %7s %7s %7s %7s %7s" % [ rat[s,c], rat[s,r], rat[s,s], rat[s,t], rat[s,l] ]
105
+ puts "Test %7s %7s %7s %7s %7s" % [ rat[t,c], rat[t,r], rat[t,s], rat[t,t], rat[t,l] ]
106
+ puts "Total %7s %7s %7s %7s %7s" % [ rat[l,c], rat[l,r], rat[l,s], rat[l,t], rat[l,l] ]
107
+ puts
108
+ end
109
+
110
+ private
111
+
112
+ # Return line counts for files.
113
+
114
+ def line_count( *files )
115
+ files = files.inject([]) do |memo, find|
116
+ memo.concat(Dir.glob(find)); memo
117
+ end
118
+
119
+ fc, l, c, t, r = 0, 0, 0, 0, 0
120
+ bt, rb = false, false
121
+
122
+ files.each do |fname|
123
+ next unless fname =~ /.*rb/ # TODO should this be done?
124
+ fc += 1
125
+ File.open( fname ) do |f|
126
+ while line = f.gets
127
+ l += 1
128
+ next if line =~ /^\s*$/
129
+ case line
130
+ when /^=begin\s+test/
131
+ tb = true; t+=1
132
+ when /^=begin/
133
+ rb = true; r+=1
134
+ when /^=end/
135
+ t+=1 if tb
136
+ r+=1 if rb
137
+ rb, tb = false, false
138
+ when /^\s*#/
139
+ r += 1
140
+ else
141
+ c+=1 if !(rb or tb)
142
+ r+=1 if rb
143
+ t+=1 if tb
144
+ end
145
+ end
146
+ end
147
+ end
148
+ s = l - c - r - t
149
+ return fc, l, c, r, t, s
150
+ end
151
+
152
+ end
153
+
154
+ end
@@ -0,0 +1,193 @@
1
+ require 'quarry/build'
2
+
3
+ module Quarry
4
+
5
+ #
6
+
7
+ class Svn < Build
8
+
9
+ # Tag current version (via rubyforge).
10
+
11
+ def tag
12
+ name, version = release.name, release.version
13
+
14
+ config = configuration['tag']
15
+
16
+ prefix = commandline('prefix') || config['prefix']
17
+ prefix = prefix + '_' if prefix && prefix !~ /[_-]$/
18
+
19
+ tagdir = config['tagdir'] || 'tags'
20
+
21
+ rubyforge_username = ENV['RUBYFORGE_USERNAME']
22
+ rubyforge_project = config['project'] || name
23
+
24
+ abort "Need RUBYFORGE_USERNAME evironment setting." unless rubyforge_username
25
+
26
+ tagname = "#{prefix}#{version}"
27
+ tagname = File.join(tagdir, tagname) if tagdir
28
+
29
+ puts "Tag '#{tagname}' ?"
30
+
31
+ case ask("Continue? [yN]").strip.downcase
32
+ when 'y', 'yes'
33
+ svn "copy", "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{name}/trunk",
34
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{name}/#{tagname}"
35
+ end
36
+ end
37
+
38
+ # Create changelog.
39
+
40
+ def log(format=:rd)
41
+ case format
42
+ when :rd
43
+ log_rd
44
+ when :xml
45
+ log_xml
46
+ end
47
+ end
48
+
49
+ # Create a human readable changelog.
50
+
51
+ def log_rd
52
+ config = configuration['log']
53
+ txtlog = config['file'] || 'ChangeLog'
54
+
55
+ text = `svn log`
56
+
57
+ changes = log_parse(text)
58
+ sorted = log_organize(changes)
59
+ string = log_format(sorted)
60
+
61
+ if dryrun?
62
+ puts string
63
+ else
64
+ File.open(txtlog, 'w'){|f| f << string }
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ #
71
+
72
+ def log_parse(text)
73
+ changes = []
74
+ entries = text.split(/^[-]+\n/)
75
+ entries.shift # get rid of emtpy first
76
+ entries.each do |entry|
77
+ lines = entry.split(/\n/)
78
+ data = lines.shift
79
+ text = lines.join("\n").strip
80
+
81
+ rev, who, date, *rest = *data.split('|')
82
+ rev.strip!
83
+ who.strip!
84
+ date = date.strip.split(/\s+/).first
85
+
86
+ changes << [ date, who, rev, text ]
87
+ end
88
+ changes
89
+ end
90
+
91
+ #
92
+
93
+ def log_organize(changes)
94
+ mapped = {}
95
+ changes.each do |date, who, rev, text|
96
+ mapped[[date, who]] ||= []
97
+ mapped[[date, who]] << [text, rev]
98
+ end
99
+ sorted = []
100
+ mapped.each do |(date, who), entries|
101
+ sorted << [ date, who, entries ]
102
+ end
103
+ sorted.sort{ |a,b| b[0] <=> a[0] }
104
+ end
105
+
106
+ #
107
+
108
+ def log_format(sorted)
109
+ string = "= ChangeLog\n\n"
110
+ sorted.each do |date, who, entries|
111
+ string << "== #{date} #{who}\n\n" # no email :(
112
+ entries.each do |entry|
113
+ string << "* #{entry.first} (#{entry.last})\n"
114
+ end
115
+ string << "\n"
116
+ end
117
+ string
118
+ end
119
+
120
+ public
121
+
122
+ # Create a XML-formatted changelog.
123
+
124
+ def log_xml
125
+ config = configuration['log']
126
+ xmlfile = config['xmlfile'] || 'doc/changelog.xml'
127
+ xslfile = File.join(File.dirname(xmlfile), 'changelog.xsl')
128
+
129
+ log_xsl(xslfile)
130
+
131
+ text = `svn log --xml`
132
+ i = text.index("?>\n")
133
+ text.insert(i+2, "\n" + '<?xml-stylesheet href="changelog.xsl" type="text/xsl" ?>')
134
+
135
+ if dryrun?
136
+ puts text
137
+ else
138
+ File.open(xmlfile){ |f| f << text }
139
+ end
140
+ end
141
+
142
+ private
143
+
144
+ #
145
+
146
+ def log_xsl(xslfile)
147
+ if force? or not File.exist?(xslfile)
148
+ File.open(xslfile, 'w') do |f|
149
+ f << XSLOG
150
+ end
151
+ end
152
+ end
153
+
154
+ XSLOG = <<-END
155
+ <?xml version="1.0" encoding="ISO-8859-1"?>
156
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
157
+
158
+ <xsl:output cdata-section-elements="script"/>
159
+
160
+ <xsl:template match="/">
161
+ <html>
162
+ <head>
163
+ <title>Changelog</title>
164
+ <link REL='SHORTCUT ICON' HREF="../img/ruby-sm.png" />
165
+ <style>
166
+ td { font-family: sans-serif; padding: 0px 10px; }
167
+ </style>
168
+ </head>
169
+ <body>
170
+ <div class="container">
171
+ <h1>Changelog</h1>
172
+ <table style="width: 100%;">
173
+ <xsl:apply-templates />
174
+ </table>
175
+ </div>
176
+ </body>
177
+ </html>
178
+ </xsl:template>
179
+
180
+ <xsl:template match="logentry">
181
+ <tr>
182
+ <td><b><pre><xsl:value-of select="msg"/></pre></b></td>
183
+ <td><xsl:value-of select="author"/></td>
184
+ <td><xsl:value-of select="date"/></td>
185
+ </tr>
186
+ </xsl:template>
187
+
188
+ </xsl:stylesheet>
189
+ END
190
+
191
+ end
192
+
193
+ end