mack-data_mapper 0.8.1 → 0.8.2

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 (166) hide show
  1. data/lib/gems/addressable-2.0.0/lib/addressable/idna.rb +4867 -0
  2. data/lib/gems/addressable-2.0.0/lib/addressable/uri.rb +2469 -0
  3. data/lib/gems/addressable-2.0.0/lib/addressable/version.rb +35 -0
  4. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/adapters/data_objects_adapter.rb +85 -0
  5. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/aggregate_functions.rb +201 -0
  6. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/collection.rb +11 -0
  7. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/model.rb +11 -0
  8. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/repository.rb +7 -0
  9. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/support/symbol.rb +21 -0
  10. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/version.rb +7 -0
  11. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates.rb +15 -0
  12. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/abstract_adapter.rb +209 -0
  13. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/data_objects_adapter.rb +709 -0
  14. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/in_memory_adapter.rb +87 -0
  15. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/mysql_adapter.rb +136 -0
  16. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/postgres_adapter.rb +188 -0
  17. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/sqlite3_adapter.rb +105 -0
  18. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters.rb +22 -0
  19. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/many_to_many.rb +147 -0
  20. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/many_to_one.rb +107 -0
  21. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/one_to_many.rb +318 -0
  22. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/one_to_one.rb +61 -0
  23. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/relationship.rb +223 -0
  24. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/relationship_chain.rb +81 -0
  25. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations.rb +200 -0
  26. data/lib/gems/dm-core-0.9.7/lib/dm-core/auto_migrations.rb +105 -0
  27. data/lib/gems/dm-core-0.9.7/lib/dm-core/collection.rb +642 -0
  28. data/lib/gems/dm-core-0.9.7/lib/dm-core/dependency_queue.rb +32 -0
  29. data/lib/gems/dm-core-0.9.7/lib/dm-core/hook.rb +11 -0
  30. data/lib/gems/dm-core-0.9.7/lib/dm-core/identity_map.rb +42 -0
  31. data/lib/gems/dm-core-0.9.7/lib/dm-core/is.rb +16 -0
  32. data/lib/gems/dm-core-0.9.7/lib/dm-core/logger.rb +232 -0
  33. data/lib/gems/dm-core-0.9.7/lib/dm-core/migrations/destructive_migrations.rb +17 -0
  34. data/lib/gems/dm-core-0.9.7/lib/dm-core/migrator.rb +29 -0
  35. data/lib/gems/dm-core-0.9.7/lib/dm-core/model.rb +488 -0
  36. data/lib/gems/dm-core-0.9.7/lib/dm-core/naming_conventions.rb +84 -0
  37. data/lib/gems/dm-core-0.9.7/lib/dm-core/property.rb +663 -0
  38. data/lib/gems/dm-core-0.9.7/lib/dm-core/property_set.rb +169 -0
  39. data/lib/gems/dm-core-0.9.7/lib/dm-core/query.rb +628 -0
  40. data/lib/gems/dm-core-0.9.7/lib/dm-core/repository.rb +159 -0
  41. data/lib/gems/dm-core-0.9.7/lib/dm-core/resource.rb +637 -0
  42. data/lib/gems/dm-core-0.9.7/lib/dm-core/scope.rb +58 -0
  43. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/array.rb +13 -0
  44. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/assertions.rb +8 -0
  45. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/errors.rb +23 -0
  46. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/kernel.rb +11 -0
  47. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/symbol.rb +41 -0
  48. data/lib/gems/dm-core-0.9.7/lib/dm-core/support.rb +7 -0
  49. data/lib/gems/dm-core-0.9.7/lib/dm-core/transaction.rb +267 -0
  50. data/lib/gems/dm-core-0.9.7/lib/dm-core/type.rb +160 -0
  51. data/lib/gems/dm-core-0.9.7/lib/dm-core/type_map.rb +80 -0
  52. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/boolean.rb +7 -0
  53. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/discriminator.rb +34 -0
  54. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/object.rb +24 -0
  55. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/paranoid_boolean.rb +34 -0
  56. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/paranoid_datetime.rb +33 -0
  57. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/serial.rb +9 -0
  58. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/text.rb +10 -0
  59. data/lib/gems/dm-core-0.9.7/lib/dm-core/types.rb +19 -0
  60. data/lib/gems/dm-core-0.9.7/lib/dm-core/version.rb +3 -0
  61. data/lib/gems/dm-core-0.9.7/lib/dm-core.rb +217 -0
  62. data/lib/gems/dm-core-0.9.7/script/all +5 -0
  63. data/lib/gems/dm-core-0.9.7/script/performance.rb +284 -0
  64. data/lib/gems/dm-core-0.9.7/script/profile.rb +87 -0
  65. data/lib/gems/dm-migrations-0.9.7/lib/dm-migrations/version.rb +5 -0
  66. data/lib/gems/dm-migrations-0.9.7/lib/dm-migrations.rb +1 -0
  67. data/lib/gems/dm-migrations-0.9.7/lib/migration.rb +215 -0
  68. data/lib/gems/dm-migrations-0.9.7/lib/migration_runner.rb +88 -0
  69. data/lib/gems/dm-migrations-0.9.7/lib/spec/example/migration_example_group.rb +73 -0
  70. data/lib/gems/dm-migrations-0.9.7/lib/spec/matchers/migration_matchers.rb +107 -0
  71. data/lib/gems/dm-migrations-0.9.7/lib/sql/column.rb +9 -0
  72. data/lib/gems/dm-migrations-0.9.7/lib/sql/mysql.rb +52 -0
  73. data/lib/gems/dm-migrations-0.9.7/lib/sql/postgresql.rb +78 -0
  74. data/lib/gems/dm-migrations-0.9.7/lib/sql/sqlite3.rb +43 -0
  75. data/lib/gems/dm-migrations-0.9.7/lib/sql/table.rb +19 -0
  76. data/lib/gems/dm-migrations-0.9.7/lib/sql/table_creator.rb +81 -0
  77. data/lib/gems/dm-migrations-0.9.7/lib/sql/table_modifier.rb +53 -0
  78. data/lib/gems/dm-migrations-0.9.7/lib/sql.rb +10 -0
  79. data/lib/gems/dm-observer-0.9.7/lib/dm-observer/version.rb +5 -0
  80. data/lib/gems/dm-observer-0.9.7/lib/dm-observer.rb +91 -0
  81. data/lib/gems/dm-serializer-0.9.7/lib/dm-serializer/version.rb +5 -0
  82. data/lib/gems/dm-serializer-0.9.7/lib/dm-serializer.rb +183 -0
  83. data/lib/gems/dm-timestamps-0.9.7/lib/dm-timestamps/version.rb +5 -0
  84. data/lib/gems/dm-timestamps-0.9.7/lib/dm-timestamps.rb +57 -0
  85. data/lib/gems/dm-types-0.9.7/lib/dm-types/bcrypt_hash.rb +31 -0
  86. data/lib/gems/dm-types-0.9.7/lib/dm-types/csv.rb +28 -0
  87. data/lib/gems/dm-types-0.9.7/lib/dm-types/enum.rb +70 -0
  88. data/lib/gems/dm-types-0.9.7/lib/dm-types/epoch_time.rb +27 -0
  89. data/lib/gems/dm-types-0.9.7/lib/dm-types/file_path.rb +27 -0
  90. data/lib/gems/dm-types-0.9.7/lib/dm-types/flag.rb +61 -0
  91. data/lib/gems/dm-types-0.9.7/lib/dm-types/ip_address.rb +30 -0
  92. data/lib/gems/dm-types-0.9.7/lib/dm-types/json.rb +40 -0
  93. data/lib/gems/dm-types-0.9.7/lib/dm-types/regexp.rb +20 -0
  94. data/lib/gems/dm-types-0.9.7/lib/dm-types/serial.rb +8 -0
  95. data/lib/gems/dm-types-0.9.7/lib/dm-types/slug.rb +37 -0
  96. data/lib/gems/dm-types-0.9.7/lib/dm-types/uri.rb +29 -0
  97. data/lib/gems/dm-types-0.9.7/lib/dm-types/uuid.rb +64 -0
  98. data/lib/gems/dm-types-0.9.7/lib/dm-types/version.rb +5 -0
  99. data/lib/gems/dm-types-0.9.7/lib/dm-types/yaml.rb +36 -0
  100. data/lib/gems/dm-types-0.9.7/lib/dm-types.rb +28 -0
  101. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/absent_field_validator.rb +60 -0
  102. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/acceptance_validator.rb +76 -0
  103. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/auto_validate.rb +153 -0
  104. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/block_validator.rb +60 -0
  105. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/confirmation_validator.rb +80 -0
  106. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/contextual_validators.rb +56 -0
  107. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/custom_validator.rb +72 -0
  108. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/format_validator.rb +97 -0
  109. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/formats/email.rb +40 -0
  110. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/formats/url.rb +20 -0
  111. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/generic_validator.rb +100 -0
  112. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/length_validator.rb +113 -0
  113. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/method_validator.rb +68 -0
  114. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/numeric_validator.rb +83 -0
  115. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/primitive_validator.rb +60 -0
  116. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/required_field_validator.rb +88 -0
  117. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/support/object.rb +5 -0
  118. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/uniqueness_validator.rb +64 -0
  119. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/validation_errors.rb +63 -0
  120. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/version.rb +5 -0
  121. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/within_validator.rb +53 -0
  122. data/lib/gems/dm-validations-0.9.7/lib/dm-validations.rb +234 -0
  123. data/lib/gems/json_pure-1.1.3/GPL +340 -0
  124. data/lib/gems/json_pure-1.1.3/VERSION +1 -0
  125. data/lib/gems/json_pure-1.1.3/bin/edit_json.rb +10 -0
  126. data/lib/gems/json_pure-1.1.3/bin/prettify_json.rb +76 -0
  127. data/lib/gems/json_pure-1.1.3/lib/json/Array.xpm +21 -0
  128. data/lib/gems/json_pure-1.1.3/lib/json/FalseClass.xpm +21 -0
  129. data/lib/gems/json_pure-1.1.3/lib/json/Hash.xpm +21 -0
  130. data/lib/gems/json_pure-1.1.3/lib/json/Key.xpm +73 -0
  131. data/lib/gems/json_pure-1.1.3/lib/json/NilClass.xpm +21 -0
  132. data/lib/gems/json_pure-1.1.3/lib/json/Numeric.xpm +28 -0
  133. data/lib/gems/json_pure-1.1.3/lib/json/String.xpm +96 -0
  134. data/lib/gems/json_pure-1.1.3/lib/json/TrueClass.xpm +21 -0
  135. data/lib/gems/json_pure-1.1.3/lib/json/add/core.rb +135 -0
  136. data/lib/gems/json_pure-1.1.3/lib/json/add/rails.rb +58 -0
  137. data/lib/gems/json_pure-1.1.3/lib/json/common.rb +354 -0
  138. data/lib/gems/json_pure-1.1.3/lib/json/editor.rb +1362 -0
  139. data/lib/gems/json_pure-1.1.3/lib/json/ext.rb +13 -0
  140. data/lib/gems/json_pure-1.1.3/lib/json/json.xpm +1499 -0
  141. data/lib/gems/json_pure-1.1.3/lib/json/pure/generator.rb +394 -0
  142. data/lib/gems/json_pure-1.1.3/lib/json/pure/parser.rb +259 -0
  143. data/lib/gems/json_pure-1.1.3/lib/json/pure.rb +75 -0
  144. data/lib/gems/json_pure-1.1.3/lib/json/version.rb +9 -0
  145. data/lib/gems/json_pure-1.1.3/lib/json.rb +235 -0
  146. data/lib/gems/launchy-0.3.2/bin/launchy +12 -0
  147. data/lib/gems/launchy-0.3.2/lib/launchy/application.rb +163 -0
  148. data/lib/gems/launchy-0.3.2/lib/launchy/browser.rb +85 -0
  149. data/lib/gems/launchy-0.3.2/lib/launchy/command_line.rb +48 -0
  150. data/lib/gems/launchy-0.3.2/lib/launchy/gemspec.rb +53 -0
  151. data/lib/gems/launchy-0.3.2/lib/launchy/specification.rb +133 -0
  152. data/lib/gems/launchy-0.3.2/lib/launchy/version.rb +18 -0
  153. data/lib/gems/launchy-0.3.2/lib/launchy.rb +58 -0
  154. data/lib/gems/uuidtools-1.0.3/lib/uuidtools/version.rb +32 -0
  155. data/lib/gems/uuidtools-1.0.3/lib/uuidtools.rb +648 -0
  156. data/lib/gems.rb +13 -0
  157. data/lib/mack-data_mapper/migration_generator/migration_generator.rb +5 -0
  158. data/lib/mack-data_mapper/migration_generator/templates/db/migrations/%=@migration_name%.rb.template +1 -1
  159. data/lib/mack-data_mapper/model_generator/manifest.yml +3 -3
  160. data/lib/mack-data_mapper/model_generator/model_generator.rb +8 -1
  161. data/lib/mack-data_mapper/model_generator/templates/model.rb.template +1 -1
  162. data/lib/mack-data_mapper/model_generator/templates/rspec.rb.template +1 -1
  163. data/lib/mack-data_mapper/model_generator/templates/test_case.rb.template +1 -1
  164. data/lib/mack-data_mapper.rb +3 -2
  165. data/lib/mack-data_mapper_tasks.rb +7 -0
  166. metadata +235 -86
@@ -0,0 +1,75 @@
1
+ require 'json/common'
2
+ require 'json/pure/parser'
3
+ require 'json/pure/generator'
4
+
5
+ module JSON
6
+ begin
7
+ require 'iconv'
8
+ # An iconv instance to convert from UTF8 to UTF16 Big Endian.
9
+ UTF16toUTF8 = Iconv.new('utf-8', 'utf-16be') # :nodoc:
10
+ # An iconv instance to convert from UTF16 Big Endian to UTF8.
11
+ UTF8toUTF16 = Iconv.new('utf-16be', 'utf-8') # :nodoc:
12
+ UTF8toUTF16.iconv('no bom')
13
+ rescue Errno::EINVAL, Iconv::InvalidEncoding
14
+ # Iconv doesn't support big endian utf-16. Let's try to hack this manually
15
+ # into the converters.
16
+ begin
17
+ old_verbose, $VERBSOSE = $VERBOSE, nil
18
+ # An iconv instance to convert from UTF8 to UTF16 Big Endian.
19
+ UTF16toUTF8 = Iconv.new('utf-8', 'utf-16') # :nodoc:
20
+ # An iconv instance to convert from UTF16 Big Endian to UTF8.
21
+ UTF8toUTF16 = Iconv.new('utf-16', 'utf-8') # :nodoc:
22
+ UTF8toUTF16.iconv('no bom')
23
+ if UTF8toUTF16.iconv("\xe2\x82\xac") == "\xac\x20"
24
+ swapper = Class.new do
25
+ def initialize(iconv) # :nodoc:
26
+ @iconv = iconv
27
+ end
28
+
29
+ def iconv(string) # :nodoc:
30
+ result = @iconv.iconv(string)
31
+ JSON.swap!(result)
32
+ end
33
+ end
34
+ UTF8toUTF16 = swapper.new(UTF8toUTF16) # :nodoc:
35
+ end
36
+ if UTF16toUTF8.iconv("\xac\x20") == "\xe2\x82\xac"
37
+ swapper = Class.new do
38
+ def initialize(iconv) # :nodoc:
39
+ @iconv = iconv
40
+ end
41
+
42
+ def iconv(string) # :nodoc:
43
+ string = JSON.swap!(string.dup)
44
+ @iconv.iconv(string)
45
+ end
46
+ end
47
+ UTF16toUTF8 = swapper.new(UTF16toUTF8) # :nodoc:
48
+ end
49
+ rescue Errno::EINVAL, Iconv::InvalidEncoding
50
+ raise MissingUnicodeSupport, "iconv doesn't seem to support UTF-8/UTF-16 conversions"
51
+ ensure
52
+ $VERBOSE = old_verbose
53
+ end
54
+ rescue LoadError
55
+ raise MissingUnicodeSupport,
56
+ "iconv couldn't be loaded, which is required for UTF-8/UTF-16 conversions"
57
+ end
58
+
59
+ # Swap consecutive bytes of _string_ in place.
60
+ def self.swap!(string) # :nodoc:
61
+ 0.upto(string.size / 2) do |i|
62
+ break unless string[2 * i + 1]
63
+ string[2 * i], string[2 * i + 1] = string[2 * i + 1], string[2 * i]
64
+ end
65
+ string
66
+ end
67
+
68
+ # This module holds all the modules/classes that implement JSON's
69
+ # functionality in pure ruby.
70
+ module Pure
71
+ $DEBUG and warn "Using pure library for JSON."
72
+ JSON.parser = Parser
73
+ JSON.generator = Generator
74
+ end
75
+ end
@@ -0,0 +1,9 @@
1
+ module JSON
2
+ # JSON version
3
+ VERSION = '1.1.3'
4
+ VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
+ VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
+ VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
7
+ VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
8
+ VARIANT_BINARY = false
9
+ end
@@ -0,0 +1,235 @@
1
+ require 'json/common'
2
+ # = json - JSON for Ruby
3
+ #
4
+ # == Description
5
+ #
6
+ # This is a implementation of the JSON specification according to RFC 4627
7
+ # (http://www.ietf.org/rfc/rfc4627.txt). Starting from version 1.0.0 on there
8
+ # will be two variants available:
9
+ #
10
+ # * A pure ruby variant, that relies on the iconv and the stringscan
11
+ # extensions, which are both part of the ruby standard library.
12
+ # * The quite a bit faster C extension variant, which is in parts implemented
13
+ # in C and comes with its own unicode conversion functions and a parser
14
+ # generated by the ragel state machine compiler
15
+ # (http://www.cs.queensu.ca/~thurston/ragel).
16
+ #
17
+ # Both variants of the JSON generator escape all non-ASCII an control
18
+ # characters with \uXXXX escape sequences, and support UTF-16 surrogate pairs
19
+ # in order to be able to generate the whole range of unicode code points. This
20
+ # means that generated JSON text is encoded as UTF-8 (because ASCII is a subset
21
+ # of UTF-8) and at the same time avoids decoding problems for receiving
22
+ # endpoints, that don't expect UTF-8 encoded texts. On the negative side this
23
+ # may lead to a bit longer strings than necessarry.
24
+ #
25
+ # All strings, that are to be encoded as JSON strings, should be UTF-8 byte
26
+ # sequences on the Ruby side. To encode raw binary strings, that aren't UTF-8
27
+ # encoded, please use the to_json_raw_object method of String (which produces
28
+ # an object, that contains a byte array) and decode the result on the receiving
29
+ # endpoint.
30
+ #
31
+ # == Author
32
+ #
33
+ # Florian Frank <mailto:flori@ping.de>
34
+ #
35
+ # == License
36
+ #
37
+ # This software is distributed under the same license as Ruby itself, see
38
+ # http://www.ruby-lang.org/en/LICENSE.txt.
39
+ #
40
+ # == Download
41
+ #
42
+ # The latest version of this library can be downloaded at
43
+ #
44
+ # * http://rubyforge.org/frs?group_id=953
45
+ #
46
+ # Online Documentation should be located at
47
+ #
48
+ # * http://json.rubyforge.org
49
+ #
50
+ # == Usage
51
+ #
52
+ # To use JSON you can
53
+ # require 'json'
54
+ # to load the installed variant (either the extension 'json' or the pure
55
+ # variant 'json_pure'). If you have installed the extension variant, you can
56
+ # pick either the extension variant or the pure variant by typing
57
+ # require 'json/ext'
58
+ # or
59
+ # require 'json/pure'
60
+ #
61
+ # You can choose to load a set of common additions to ruby core's objects if
62
+ # you
63
+ # require 'json/add/core'
64
+ #
65
+ # After requiring this you can, e. g., serialise/deserialise Ruby ranges:
66
+ #
67
+ # JSON JSON(1..10) # => 1..10
68
+ #
69
+ # To find out how to add JSON support to other or your own classes, read the
70
+ # Examples section below.
71
+ #
72
+ # To get the best compatibility to rails' JSON implementation, you can
73
+ # require 'json/add/rails'
74
+ #
75
+ # Both of the additions attempt to require 'json' (like above) first, if it has
76
+ # not been required yet.
77
+ #
78
+ # == Speed Comparisons
79
+ #
80
+ # I have created some benchmark results (see the benchmarks subdir of the
81
+ # package) for the JSON-Parser to estimate the speed up in the C extension:
82
+ #
83
+ # JSON::Pure::Parser:: 28.90 calls/second
84
+ # JSON::Ext::Parser:: 505.50 calls/second
85
+ #
86
+ # This is ca. <b>17.5</b> times the speed of the pure Ruby implementation.
87
+ #
88
+ # I have benchmarked the JSON-Generator as well. This generates a few more
89
+ # values, because there are different modes, that also influence the achieved
90
+ # speed:
91
+ #
92
+ # * JSON::Pure::Generator:
93
+ # generate:: 35.06 calls/second
94
+ # pretty_generate:: 34.00 calls/second
95
+ # fast_generate:: 41.06 calls/second
96
+ #
97
+ # * JSON::Ext::Generator:
98
+ # generate:: 492.11 calls/second
99
+ # pretty_generate:: 348.85 calls/second
100
+ # fast_generate:: 541.60 calls/second
101
+ #
102
+ # * Speedup Ext/Pure:
103
+ # generate safe:: 14.0 times
104
+ # generate pretty:: 10.3 times
105
+ # generate fast:: 13.2 times
106
+ #
107
+ # The rails framework includes a generator as well, also it seems to be rather
108
+ # slow: I measured only 23.87 calls/second which is slower than any of my pure
109
+ # generator results. Here a comparison of the different speedups with the Rails
110
+ # measurement as the divisor:
111
+ #
112
+ # * Speedup Pure/Rails:
113
+ # generate safe:: 1.5 times
114
+ # generate pretty:: 1.4 times
115
+ # generate fast:: 1.7 times
116
+ #
117
+ # * Speedup Ext/Rails:
118
+ # generate safe:: 20.6 times
119
+ # generate pretty:: 14.6 times
120
+ # generate fast:: 22.7 times
121
+ #
122
+ # To achieve the fastest JSON text output, you can use the
123
+ # fast_generate/fast_unparse methods. Beware, that this will disable the
124
+ # checking for circular Ruby data structures, which may cause JSON to go into
125
+ # an infinite loop.
126
+ #
127
+ # == Examples
128
+ #
129
+ # To create a JSON text from a ruby data structure, you
130
+ # can call JSON.generate (or JSON.unparse) like that:
131
+ #
132
+ # json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10]
133
+ # # => "[1,2,{\"a\":3.141},false,true,null,\"4..10\"]"
134
+ #
135
+ # To create a valid JSON text you have to make sure, that the output is
136
+ # embedded in either a JSON array [] or a JSON object {}. The easiest way to do
137
+ # this, is by putting your values in a Ruby Array or Hash instance.
138
+ #
139
+ # To get back a ruby data structure from a JSON text, you have to call
140
+ # JSON.parse on it:
141
+ #
142
+ # JSON.parse json
143
+ # # => [1, 2, {"a"=>3.141}, false, true, nil, "4..10"]
144
+ #
145
+ # Note, that the range from the original data structure is a simple
146
+ # string now. The reason for this is, that JSON doesn't support ranges
147
+ # or arbitrary classes. In this case the json library falls back to call
148
+ # Object#to_json, which is the same as #to_s.to_json.
149
+ #
150
+ # It's possible to add JSON support serialization to arbitrary classes by
151
+ # simply implementing a more specialized version of the #to_json method, that
152
+ # should return a JSON object (a hash converted to JSON with #to_json) like
153
+ # this (don't forget the *a for all the arguments):
154
+ #
155
+ # class Range
156
+ # def to_json(*a)
157
+ # {
158
+ # 'json_class' => self.class.name, # = 'Range'
159
+ # 'data' => [ first, last, exclude_end? ]
160
+ # }.to_json(*a)
161
+ # end
162
+ # end
163
+ #
164
+ # The hash key 'json_class' is the class, that will be asked to deserialise the
165
+ # JSON representation later. In this case it's 'Range', but any namespace of
166
+ # the form 'A::B' or '::A::B' will do. All other keys are arbitrary and can be
167
+ # used to store the necessary data to configure the object to be deserialised.
168
+ #
169
+ # If a the key 'json_class' is found in a JSON object, the JSON parser checks
170
+ # if the given class responds to the json_create class method. If so, it is
171
+ # called with the JSON object converted to a Ruby hash. So a range can
172
+ # be deserialised by implementing Range.json_create like this:
173
+ #
174
+ # class Range
175
+ # def self.json_create(o)
176
+ # new(*o['data'])
177
+ # end
178
+ # end
179
+ #
180
+ # Now it possible to serialise/deserialise ranges as well:
181
+ #
182
+ # json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10]
183
+ # # => "[1,2,{\"a\":3.141},false,true,null,{\"json_class\":\"Range\",\"data\":[4,10,false]}]"
184
+ # JSON.parse json
185
+ # # => [1, 2, {"a"=>3.141}, false, true, nil, 4..10]
186
+ #
187
+ # JSON.generate always creates the shortest possible string representation of a
188
+ # ruby data structure in one line. This good for data storage or network
189
+ # protocols, but not so good for humans to read. Fortunately there's also
190
+ # JSON.pretty_generate (or JSON.pretty_generate) that creates a more
191
+ # readable output:
192
+ #
193
+ # puts JSON.pretty_generate([1, 2, {"a"=>3.141}, false, true, nil, 4..10])
194
+ # [
195
+ # 1,
196
+ # 2,
197
+ # {
198
+ # "a": 3.141
199
+ # },
200
+ # false,
201
+ # true,
202
+ # null,
203
+ # {
204
+ # "json_class": "Range",
205
+ # "data": [
206
+ # 4,
207
+ # 10,
208
+ # false
209
+ # ]
210
+ # }
211
+ # ]
212
+ #
213
+ # There are also the methods Kernel#j for unparse, and Kernel#jj for
214
+ # pretty_unparse output to the console, that work analogous to Core Ruby's p
215
+ # and the pp library's pp methods.
216
+ #
217
+ # The script tools/server.rb contains a small example if you want to test, how
218
+ # receiving a JSON object from a webrick server in your browser with the
219
+ # javasript prototype library (http://www.prototypejs.org) works.
220
+ #
221
+ module JSON
222
+ require 'json/version'
223
+
224
+ if VARIANT_BINARY
225
+ require 'json/ext'
226
+ else
227
+ begin
228
+ require 'json/ext'
229
+ rescue LoadError
230
+ require 'json/pure'
231
+ end
232
+ end
233
+
234
+ JSON_LOADED = true
235
+ end
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'launchy'
5
+ rescue LoadError
6
+ path = File.expand_path(File.join(File.dirname(__FILE__),"..","lib"))
7
+ raise if $:.include? path
8
+ $: << path
9
+ retry
10
+ end
11
+
12
+ Launchy.command_line.run(ARGV)
@@ -0,0 +1,163 @@
1
+ require 'rbconfig'
2
+
3
+ module Launchy
4
+ class Application
5
+
6
+ KNOWN_OS_FAMILIES = [ :windows, :darwin, :nix, :cygwin ]
7
+
8
+ class << self
9
+ def inherited(sub_class)
10
+ application_classes << sub_class
11
+ end
12
+ def application_classes
13
+ @application_classes ||= []
14
+ end
15
+
16
+ def find_application_class_for(*args)
17
+ Launchy.log "#{self.name} : finding application classes for [#{args.join(' ')}]"
18
+ application_classes.find do |klass|
19
+ Launchy.log "#{self.name} : Trying #{klass.name}"
20
+ if klass.handle?(*args) then
21
+ true
22
+ else
23
+ false
24
+ end
25
+ end
26
+ end
27
+
28
+ # find an executable in the available paths
29
+ # mkrf did such a good job on this I had to borrow it.
30
+ def find_executable(bin,*paths)
31
+ paths = ENV['PATH'].split(File::PATH_SEPARATOR) if paths.empty?
32
+ paths.each do |path|
33
+ file = File.join(path,bin)
34
+ if File.executable?(file) then
35
+ Launchy.log "#{self.name} : found executable #{file}"
36
+ return file
37
+ end
38
+ end
39
+ Launchy.log "#{self.name} : Unable to find `#{bin}' in #{paths.join(', ')}"
40
+ return nil
41
+ end
42
+
43
+ # return the current 'host_os' string from ruby's configuration
44
+ def my_os
45
+ if ENV['LAUNCHY_HOST_OS'] then
46
+ Launchy.log "#{self.name} : Using LAUNCHY_HOST_OS override of '#{ENV['LAUNCHY_HOST_OS']}'"
47
+ return ENV['LAUNCHY_HOST_OS']
48
+ else
49
+ ::Config::CONFIG['host_os']
50
+ end
51
+ end
52
+
53
+ # detect what the current os is and return :windows, :darwin or :nix
54
+ def my_os_family(test_os = my_os)
55
+ case test_os
56
+ when /mingw/i
57
+ family = :windows
58
+ when /mswin/i
59
+ family = :windows
60
+ when /windows/i
61
+ family = :windows
62
+ when /darwin/i
63
+ family = :darwin
64
+ when /mac os/i
65
+ family = :darwin
66
+ when /solaris/i
67
+ family = :nix
68
+ when /bsd/i
69
+ family = :nix
70
+ when /linux/i
71
+ family = :nix
72
+ when /aix/i
73
+ family = :nix
74
+ when /cygwin/i
75
+ family = :cygwin
76
+ else
77
+ $stderr.puts "Unknown OS familiy for '#{test_os}'. Please report this bug to #{Launchy::SPEC.email}"
78
+ family = :unknown
79
+ end
80
+ end
81
+ end
82
+
83
+
84
+ # Determine the appropriate desktop environment for *nix machine. Currently this is
85
+ # linux centric. The detection is based upon the detection used by xdg-open from
86
+ # http://portland.freedesktop.org/wiki/XdgUtils
87
+ def nix_desktop_environment
88
+ if not @nix_desktop_environment then
89
+ @nix_desktop_environment = :generic
90
+ if ENV["KDE_FULL_SESSION"] || ENV["KDE_SESSION_UID"] then
91
+ @nix_desktop_environment = :kde
92
+ elsif ENV["GNOME_DESKTOP_SESSION_ID"] then
93
+ @nix_desktop_environment = :gnome
94
+ elsif find_executable("xprop") then
95
+ if %x[ xprop -root _DT_SAVE_MODE | grep ' = \"xfce\"$' ].strip.size > 0 then
96
+ @nix_desktop_environment = :xfce
97
+ end
98
+ end
99
+ Launchy.log "#{self.class.name} : nix_desktop_environment => '#{@nix_desktop_environment}'"
100
+ end
101
+ return @nix_desktop_environment
102
+ end
103
+
104
+ # find an executable in the available paths
105
+ def find_executable(bin,*paths)
106
+ Application.find_executable(bin,*paths)
107
+ end
108
+
109
+ # return the current 'host_os' string from ruby's configuration
110
+ def my_os
111
+ Application.my_os
112
+ end
113
+
114
+ # detect what the current os is and return :windows, :darwin, :nix, or :cygwin
115
+ def my_os_family(test_os = my_os)
116
+ Application.my_os_family(test_os)
117
+ end
118
+
119
+ # returns the list of command line application names for the current os. The list
120
+ # returned should only contain appliations or commands that actually exist on the
121
+ # system. The list members should have their full path to the executable.
122
+ def app_list
123
+ @app_list ||= self.send("#{my_os_family}_app_list")
124
+ end
125
+
126
+ # On darwin a good general default is the 'open' executable.
127
+ def darwin_app_list
128
+ Launchy.log "#{self.class.name} : Using 'open' application on darwin."
129
+ [ find_executable('open') ]
130
+ end
131
+
132
+ # On windows a good general default is the 'start' Command Shell command
133
+ def windows_app_list
134
+ Launchy.log "#{self.class.name} : Using 'start' command on windows."
135
+ %w[ start ]
136
+ end
137
+
138
+ # Cygwin uses the windows start but through an explicit execution of the cmd shell
139
+ def cygwin_app_list
140
+ Launchy.log "#{self.class.name} : Using 'cmd /C start' on windows."
141
+ [ "cmd /C start" ]
142
+ end
143
+
144
+ # run the command
145
+ def run(cmd,*args)
146
+ args.unshift(cmd)
147
+ cmd_line = args.join(' ')
148
+ Launchy.log "#{self.class.name} : Spawning on #{my_os_family} : #{cmd_line}"
149
+
150
+ if my_os_family == :windows then
151
+ system cmd_line
152
+ else
153
+ # fork, and the child process should NOT run any exit handlers
154
+ child_pid = fork do
155
+ cmd_line += " > /dev/null 2>&1"
156
+ system cmd_line
157
+ exit!
158
+ end
159
+ Process.detach(child_pid)
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,85 @@
1
+ require 'launchy/application'
2
+ require 'uri'
3
+
4
+ module Launchy
5
+ class Browser < Application
6
+
7
+ DESKTOP_ENVIRONMENT_BROWSER_LAUNCHERS = {
8
+ :kde => "kfmclient",
9
+ :gnome => "gnome-open",
10
+ :xfce => "exo-open",
11
+ :generic => "htmlview"
12
+ }
13
+
14
+ FALLBACK_BROWSERS = %w[ firefox seamonkey opera mozilla netscape galeon ]
15
+
16
+ class << self
17
+ def run(*args)
18
+ Browser.new.visit(args[0])
19
+ end
20
+
21
+ # return true if this class can handle the given parameter(s)
22
+ def handle?(*args)
23
+ begin
24
+ Launchy.log "#{self.name} : testing if [#{args[0]}] (#{args[0].class}) is a url."
25
+ uri = URI.parse(args[0])
26
+ result = [URI::HTTP, URI::HTTPS, URI::FTP].include?(uri.class)
27
+ rescue Exception => e
28
+ # hmm... why does rcov not see that this is executed ?
29
+ Launchy.log "#{self.name} : not a url, #{e}"
30
+ return false
31
+ end
32
+ end
33
+ end
34
+
35
+ def initialize
36
+ raise "Unable to find browser to launch for os family '#{my_os_family}'." unless browser
37
+ end
38
+
39
+ # Find a list of potential browser applications to run on *nix machines.
40
+ # The order is:
41
+ # 1) What is in ENV['LAUNCHY_BROWSER'] or ENV['BROWSER']
42
+ # 2) xdg-open
43
+ # 3) desktop environment launcher program
44
+ # 4) a list of fallback browsers
45
+ def nix_app_list
46
+ if not @nix_app_list then
47
+ browser_cmds = ['xdg-open']
48
+ browser_cmds << DESKTOP_ENVIRONMENT_BROWSER_LAUNCHERS[nix_desktop_environment]
49
+ browser_cmds << FALLBACK_BROWSERS
50
+ browser_cmds.flatten!
51
+ browser_cmds.delete_if { |b| b.nil? || (b.strip.size == 0) }
52
+ Launchy.log "#{self.class.name} : Initial *Nix Browser List: #{browser_cmds.join(', ')}"
53
+ @nix_app_list = browser_cmds.collect { |bin| find_executable(bin) }.find_all { |x| not x.nil? }
54
+ Launchy.log "#{self.class.name} : Filtered *Nix Browser List: #{@nix_app_list.join(', ')}"
55
+ end
56
+ @nix_app_list
57
+ end
58
+
59
+ # return the full command line path to the browser or nil
60
+ def browser
61
+ if not @browser then
62
+ if ENV['LAUNCHY_BROWSER'] and File.exists?(ENV['LAUNCHY_BROWSER']) then
63
+ Launchy.log "#{self.class.name} : Using LAUNCHY_BROWSER environment variable : #{ENV['LAUNCHY_BROWSER']}"
64
+ @browser = ENV['LAUNCHY_BROWSER']
65
+ elsif ENV['BROWSER'] and File.exists?(ENV['BROWSER']) then
66
+ Launchy.log "#{self.class.name} : Using BROWSER environment variable : #{ENV['BROWSER']}"
67
+ @browser = ENV['BROWSER']
68
+ elsif app_list.size > 0 then
69
+ @browser = app_list.first
70
+ Launchy.log "#{self.class.name} : Using application list : #{@browser}"
71
+ else
72
+ msg = "Unable to launch. No Browser application found."
73
+ Launchy.log "#{self.class.name} : #{msg}"
74
+ $stderr.puts msg
75
+ end
76
+ end
77
+ return @browser
78
+ end
79
+
80
+ # launch the browser at the appointed url
81
+ def visit(url)
82
+ run(browser,url)
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,48 @@
1
+ require 'optparse'
2
+
3
+ module Launchy
4
+ class CommandLine
5
+
6
+ def parser
7
+ @parser ||= OptionParser.new do |op|
8
+ op.banner = "Usage: launchy [options] url"
9
+ op.separator ""
10
+ op.on("-d", "--debug", "Force debug, output lots of information.",
11
+ "This sets the LAUNCHY_DEBUG environment variable to 'true'.") do |d|
12
+ ENV["LAUNCHY_DEBUG"] = 'true'
13
+ end
14
+
15
+ op.on("-h", "--help", "Print this message") do |h|
16
+ puts op.to_s
17
+ exit 0
18
+ end
19
+
20
+ op.on("-v", "--version", "Output the version of Launchy") do |v|
21
+ puts "Launchy version #{Launchy::VERSION}"
22
+ exit 0
23
+ end
24
+
25
+ op.on("-o", "--host-os HOST_OS","Force the behavior of a particular host os.",
26
+ "This sets the LAUNCHY_HOST_OS environment variable.") do |os|
27
+ ENV["LAUNCHY_HOST_OS"] = os
28
+ end
29
+
30
+ op.on("-b", "--browser BROWSER", "Force launchy to use a particular browser.",
31
+ "This sets the LAUNCHY_BROWSER environment variable.") do |browser|
32
+ ENV["LAUNCHY_BROWSER"] = browser
33
+ end
34
+ end
35
+ end
36
+
37
+ def run(argv = ARGV)
38
+ begin
39
+ parser.parse!(argv)
40
+ Launchy.open(*argv)
41
+ rescue ::OptionParser::ParseError => pe
42
+ $stderr.puts "#{parser.programn_name}: #{pe}"
43
+ $stderr.puts "Try `#{parser.program_name} --help' for more information."
44
+ exit 1
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ require 'launchy/specification'
3
+ require 'launchy/version'
4
+ require 'rake'
5
+
6
+ # The Gem Specification plus some extras for launchy.
7
+ module Launchy
8
+ SPEC = Launchy::Specification.new do |spec|
9
+ spec.name = "launchy"
10
+ spec.version = Launchy::VERSION
11
+ spec.rubyforge_project = "copiousfreetime"
12
+ spec.author = "Jeremy Hinegardner"
13
+ spec.email = "jeremy@hinegardner.org"
14
+ spec.homepage = "http://copiousfreetime.rubyforge.org/launchy/"
15
+
16
+ spec.summary = "A helper to launch apps from within ruby programs."
17
+ spec.description = <<-DESC
18
+ Launchy is helper class for launching cross-platform applications in a
19
+ fire and forget manner.
20
+
21
+ There are application concepts (browser, email client, etc) that are common
22
+ across all platforms, and they may be launched differently on each
23
+ platform. Launchy is here to make a common approach to launching
24
+ external application from within ruby programs.
25
+
26
+ DESC
27
+
28
+ spec.extra_rdoc_files = FileList["CHANGES", "LICENSE", "README"]
29
+ spec.has_rdoc = true
30
+ spec.rdoc_main = "README"
31
+ spec.rdoc_options = [ "--line-numbers" , "--inline-source" ]
32
+
33
+ spec.test_files = FileList["spec/**/*.rb", "test/**/*.rb"]
34
+ spec.files = spec.test_files + spec.extra_rdoc_files +
35
+ FileList["lib/**/*.rb", "resources/**/*"]
36
+
37
+ spec.executable = spec.name
38
+
39
+ spec.platform = Gem::Platform::RUBY
40
+ spec.required_ruby_version = ">= 1.8.5"
41
+
42
+ spec.local_rdoc_dir = "doc/rdoc"
43
+ spec.remote_rdoc_dir = ""
44
+ spec.local_coverage_dir = "doc/coverage"
45
+ spec.remote_coverage_dir= "coverage"
46
+
47
+ spec.remote_user = "jjh"
48
+ spec.remote_site_dir = "#{spec.name}/"
49
+
50
+ end
51
+ end
52
+
53
+