state_machines 0.0.1

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 (79) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.idea/.name +1 -0
  4. data/.idea/.rakeTasks +7 -0
  5. data/.idea/cssxfire.xml +9 -0
  6. data/.idea/encodings.xml +5 -0
  7. data/.idea/misc.xml +5 -0
  8. data/.idea/modules.xml +12 -0
  9. data/.idea/scopes/scope_settings.xml +5 -0
  10. data/.idea/state_machine2.iml +34 -0
  11. data/.idea/vcs.xml +9 -0
  12. data/.idea/workspace.xml +1156 -0
  13. data/.rspec +3 -0
  14. data/.travis.yml +8 -0
  15. data/Gemfile +4 -0
  16. data/LICENSE.txt +23 -0
  17. data/README.md +29 -0
  18. data/Rakefile +1 -0
  19. data/lib/state_machines/assertions.rb +40 -0
  20. data/lib/state_machines/branch.rb +187 -0
  21. data/lib/state_machines/callback.rb +220 -0
  22. data/lib/state_machines/core.rb +25 -0
  23. data/lib/state_machines/core_ext/class/state_machine.rb +5 -0
  24. data/lib/state_machines/core_ext.rb +2 -0
  25. data/lib/state_machines/error.rb +13 -0
  26. data/lib/state_machines/eval_helpers.rb +87 -0
  27. data/lib/state_machines/event.rb +246 -0
  28. data/lib/state_machines/event_collection.rb +141 -0
  29. data/lib/state_machines/extensions.rb +148 -0
  30. data/lib/state_machines/helper_module.rb +17 -0
  31. data/lib/state_machines/integrations/base.rb +100 -0
  32. data/lib/state_machines/integrations.rb +113 -0
  33. data/lib/state_machines/machine.rb +2234 -0
  34. data/lib/state_machines/machine_collection.rb +84 -0
  35. data/lib/state_machines/macro_methods.rb +520 -0
  36. data/lib/state_machines/matcher.rb +123 -0
  37. data/lib/state_machines/matcher_helpers.rb +54 -0
  38. data/lib/state_machines/node_collection.rb +221 -0
  39. data/lib/state_machines/path.rb +120 -0
  40. data/lib/state_machines/path_collection.rb +90 -0
  41. data/lib/state_machines/state.rb +276 -0
  42. data/lib/state_machines/state_collection.rb +112 -0
  43. data/lib/state_machines/state_context.rb +138 -0
  44. data/lib/state_machines/transition.rb +470 -0
  45. data/lib/state_machines/transition_collection.rb +245 -0
  46. data/lib/state_machines/version.rb +3 -0
  47. data/lib/state_machines/yard.rb +8 -0
  48. data/lib/state_machines.rb +3 -0
  49. data/spec/errors/default_spec.rb +14 -0
  50. data/spec/errors/with_message_spec.rb +39 -0
  51. data/spec/helpers/helper_spec.rb +14 -0
  52. data/spec/internal/app/models/auto_shop.rb +31 -0
  53. data/spec/internal/app/models/car.rb +19 -0
  54. data/spec/internal/app/models/model_base.rb +6 -0
  55. data/spec/internal/app/models/motorcycle.rb +9 -0
  56. data/spec/internal/app/models/traffic_light.rb +47 -0
  57. data/spec/internal/app/models/vehicle.rb +123 -0
  58. data/spec/machine_spec.rb +3167 -0
  59. data/spec/matcher_helpers_spec.rb +39 -0
  60. data/spec/matcher_spec.rb +157 -0
  61. data/spec/models/auto_shop_spec.rb +41 -0
  62. data/spec/models/car_spec.rb +90 -0
  63. data/spec/models/motorcycle_spec.rb +44 -0
  64. data/spec/models/traffic_light_spec.rb +56 -0
  65. data/spec/models/vehicle_spec.rb +580 -0
  66. data/spec/node_collection_spec.rb +371 -0
  67. data/spec/path_collection_spec.rb +271 -0
  68. data/spec/path_spec.rb +488 -0
  69. data/spec/spec_helper.rb +6 -0
  70. data/spec/state_collection_spec.rb +352 -0
  71. data/spec/state_context_spec.rb +442 -0
  72. data/spec/state_machine_spec.rb +29 -0
  73. data/spec/state_spec.rb +970 -0
  74. data/spec/support/migration_helpers.rb +50 -0
  75. data/spec/support/models.rb +6 -0
  76. data/spec/transition_collection_spec.rb +2199 -0
  77. data/spec/transition_spec.rb +1558 -0
  78. data/state_machines.gemspec +23 -0
  79. metadata +194 -0
@@ -0,0 +1,113 @@
1
+ module StateMachines
2
+ # An invalid integration was specified
3
+ class IntegrationNotFound < Error
4
+ def initialize(name)
5
+ super(nil, "#{name.inspect} is an invalid integration")
6
+ end
7
+ end
8
+
9
+ # Integrations allow state machines to take advantage of features within the
10
+ # context of a particular library. This is currently most useful with
11
+ # database libraries. For example, the various database integrations allow
12
+ # state machines to hook into features like:
13
+ # * Saving
14
+ # * Transactions
15
+ # * Observers
16
+ # * Scopes
17
+ # * Callbacks
18
+ # * Validation errors
19
+ #
20
+ # This type of integration allows the user to work with state machines in a
21
+ # fashion similar to other object models in their application.
22
+ #
23
+ # The integration interface is loosely defined by various unimplemented
24
+ # methods in the StateMachines::Machine class. See that class or the various
25
+ # built-in integrations for more information about how to define additional
26
+ # integrations.
27
+ module Integrations
28
+ # Attempts to find an integration that matches the given class. This will
29
+ # look through all of the built-in integrations under the StateMachines::Integrations
30
+ # namespace and find one that successfully matches the class.
31
+ #
32
+ # == Examples
33
+ #
34
+ # class Vehicle
35
+ # end
36
+ #
37
+ # class ActiveModelVehicle
38
+ # include ActiveModel::Observing
39
+ # include ActiveModel::Validations
40
+ # end
41
+ #
42
+ # class ActiveRecordVehicle < ActiveRecord::Base
43
+ # end
44
+ #
45
+ # class DataMapperVehicle
46
+ # include DataMapper::Resource
47
+ # end
48
+ #
49
+ # class MongoidVehicle
50
+ # include Mongoid::Document
51
+ # end
52
+ #
53
+ # class MongoMapperVehicle
54
+ # include MongoMapper::Document
55
+ # end
56
+ #
57
+ # class SequelVehicle < Sequel::Model
58
+ # end
59
+ #
60
+ # StateMachines::Integrations.match(Vehicle) # => nil
61
+ # StateMachines::Integrations.match(ActiveModelVehicle) # => StateMachines::Integrations::ActiveModel
62
+ # StateMachines::Integrations.match(ActiveRecordVehicle) # => StateMachines::Integrations::ActiveRecord
63
+ # StateMachines::Integrations.match(DataMapperVehicle) # => StateMachines::Integrations::DataMapper
64
+ # StateMachines::Integrations.match(MongoidVehicle) # => StateMachines::Integrations::Mongoid
65
+ # StateMachines::Integrations.match(MongoMapperVehicle) # => StateMachines::Integrations::MongoMapper
66
+ # StateMachines::Integrations.match(SequelVehicle) # => StateMachines::Integrations::Sequel
67
+ def self.match(klass)
68
+ all.detect {|integration| integration.matches?(klass)}
69
+ end
70
+
71
+ # Attempts to find an integration that matches the given list of ancestors.
72
+ # This will look through all of the built-in integrations under the StateMachines::Integrations
73
+ # namespace and find one that successfully matches one of the ancestors.
74
+ #
75
+ # == Examples
76
+ #
77
+ # StateMachines::Integrations.match([]) # => nil
78
+ # StateMachines::Integrations.match(['ActiveRecord::Base') # => StateMachines::Integrations::ActiveModel
79
+ def self.match_ancestors(ancestors)
80
+ all.detect {|integration| integration.matches_ancestors?(ancestors)}
81
+ end
82
+
83
+ # Finds an integration with the given name. If the integration cannot be
84
+ # found, then a NameError exception will be raised.
85
+ #
86
+ # == Examples
87
+ #
88
+ # StateMachines::Integrations.find_by_name(:active_record) # => StateMachines::Integrations::ActiveRecord
89
+ # StateMachines::Integrations.find_by_name(:active_model) # => StateMachines::Integrations::ActiveModel
90
+ # StateMachines::Integrations.find_by_name(:data_mapper) # => StateMachines::Integrations::DataMapper
91
+ # StateMachines::Integrations.find_by_name(:mongoid) # => StateMachines::Integrations::Mongoid
92
+ # StateMachines::Integrations.find_by_name(:mongo_mapper) # => StateMachines::Integrations::MongoMapper
93
+ # StateMachines::Integrations.find_by_name(:sequel) # => StateMachines::Integrations::Sequel
94
+ # StateMachines::Integrations.find_by_name(:invalid) # => StateMachines::IntegrationNotFound: :invalid is an invalid integration
95
+ def self.find_by_name(name)
96
+ all.detect {|integration| integration.integration_name == name} || raise(IntegrationNotFound.new(name))
97
+ end
98
+
99
+ # Gets a list of all of the available integrations for use. This will
100
+ # always list the ActiveModel integration last.
101
+ #
102
+ # == Example
103
+ #
104
+ # StateMachines::Integrations.all
105
+ # # => [StateMachines::Integrations::ActiveRecord, StateMachines::Integrations::DataMapper
106
+ # # StateMachines::Integrations::Mongoid, StateMachines::Integrations::MongoMapper,
107
+ # # StateMachines::Integrations::Sequel, StateMachines::Integrations::ActiveModel]
108
+ def self.all
109
+ constants = self.constants.map {|c| c.to_s}.select {|c| c }.sort
110
+ constants.map {|c| const_get(c)}
111
+ end
112
+ end
113
+ end