core-state 0.0.0 → 0.1.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/lib/core/state/version.rb +1 -1
- data/lib/is/stateful.rb +108 -12
- metadata +10 -10
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 1256eb4ef3acf8b61a7754d8ea30ce644f7fc081132a3d9f107a40deca79ed0a
         | 
| 4 | 
            +
              data.tar.gz: f65aa78f287f521a729723823f04339153d0a80cf8291e82e4a1c791cc57745e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1669bdf575ac48ed4abb7523383d2a8ae39a6f52fd6b08143b3ef48bd89698e9492f9f16ffff1538329a35989ec57bde2db1b77e2d67e1cafc89bd33896788e4
         | 
| 7 | 
            +
              data.tar.gz: 1cda2c4017dccf2c9e9d9c935d48c95d6aeeda0c471f662d5618b723b54d08d921bae78849e3aa5fd7783716402edbc8d8726a5638c83992e318db45be4c2a27
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,23 @@ | |
| 1 | 
            +
            ## [v0.1.3](https://github.com/metabahn/corerb/releases/tag/2021-09-28)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            *released on 2021-09-28*
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              * `fix` [#84](https://github.com/metabahn/corerb/pull/84) Define core-local as a dependency of core-state ([bryanp](https://github.com/bryanp))
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ## [v0.1.1](https://github.com/metabahn/corerb/releases/tag/2021-07-15)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            *released on 2021-07-15*
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              * `fix` [#62](https://github.com/metabahn/corerb/pull/62) Correctly isolate class-level state on access ([bryanp](https://github.com/bryanp))
         | 
| 12 | 
            +
              * `fix` [#55](https://github.com/metabahn/corerb/pull/55) Correctly forward arguments to super initialize ([bryanp](https://github.com/bryanp))
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            ## [v0.1.0](https://github.com/metabahn/corerb/releases/tag/2021-07-07)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            *released on 2021-07-07*
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              * `fix` [#48](https://github.com/metabahn/corerb/pull/48) Correctly copy defined state when a stateful object is copied ([bryanp](https://github.com/bryanp))
         | 
| 19 | 
            +
              * `chg` [#44](https://github.com/metabahn/corerb/pull/44) Drop Ruby 2.6 support from core-state ([bryanp](https://github.com/bryanp))
         | 
| 20 | 
            +
             | 
| 1 21 | 
             
            ## [v0.0.0](https://github.com/metabahn/corerb/releases/tag/2021-05-22)
         | 
| 2 22 |  | 
| 3 23 | 
             
            *released on 2021-05-22*
         | 
    
        data/lib/core/state/version.rb
    CHANGED
    
    
    
        data/lib/is/stateful.rb
    CHANGED
    
    | @@ -1,24 +1,94 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            require "core/extension"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require "refine/object/copy"
         | 
| 4 | 
            +
            require "core/local"
         | 
| 6 5 |  | 
| 7 6 | 
             
            module Is
         | 
| 8 7 | 
             
              # [public] Makes objects stateful.
         | 
| 9 8 | 
             
              #
         | 
| 10 9 | 
             
              module Stateful
         | 
| 10 | 
            +
                # Adding core-copy as a dependency of core-state creates a recursive dependency, so just bundle it.
         | 
| 11 | 
            +
                #
         | 
| 12 | 
            +
                module Copy
         | 
| 13 | 
            +
                  DEFAULT = ::Object.new
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  refine ::Object do
         | 
| 16 | 
            +
                    # [public] Copies the object using `clone`.
         | 
| 17 | 
            +
                    #
         | 
| 18 | 
            +
                    if RbConfig::CONFIG["RUBY_PROGRAM_VERSION"] < "3"
         | 
| 19 | 
            +
                      def copy(freeze: DEFAULT)
         | 
| 20 | 
            +
                        should_freeze = resolve_freeze_argument(freeze)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                        value = clone(freeze: should_freeze)
         | 
| 23 | 
            +
                        value.freeze if should_freeze
         | 
| 24 | 
            +
                        value
         | 
| 25 | 
            +
                      end
         | 
| 26 | 
            +
                    else
         | 
| 27 | 
            +
                      def copy(freeze: DEFAULT)
         | 
| 28 | 
            +
                        clone(freeze: resolve_freeze_argument(freeze))
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    private def resolve_freeze_argument(value)
         | 
| 33 | 
            +
                      case value
         | 
| 34 | 
            +
                      when DEFAULT
         | 
| 35 | 
            +
                        frozen?
         | 
| 36 | 
            +
                      else
         | 
| 37 | 
            +
                        !!value
         | 
| 38 | 
            +
                      end
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  refine Array do
         | 
| 43 | 
            +
                    # [public] Copies the array, along with each value.
         | 
| 44 | 
            +
                    #
         | 
| 45 | 
            +
                    def copy(freeze: DEFAULT)
         | 
| 46 | 
            +
                      unless Stateful.copying?(self)
         | 
| 47 | 
            +
                        Stateful.prevent_recursion(self) do
         | 
| 48 | 
            +
                          array = map { |value|
         | 
| 49 | 
            +
                            value.copy(freeze: freeze)
         | 
| 50 | 
            +
                          }
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                          array.freeze if resolve_freeze_argument(freeze)
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                          array
         | 
| 55 | 
            +
                        end
         | 
| 56 | 
            +
                      end
         | 
| 57 | 
            +
                    end
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  refine Hash do
         | 
| 61 | 
            +
                    # [public] Copies the hash, along with each key and value.
         | 
| 62 | 
            +
                    #
         | 
| 63 | 
            +
                    def copy(freeze: DEFAULT)
         | 
| 64 | 
            +
                      unless Stateful.copying?(self)
         | 
| 65 | 
            +
                        Stateful.prevent_recursion(self) do
         | 
| 66 | 
            +
                          hash = {}
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                          each_pair do |key, value|
         | 
| 69 | 
            +
                            hash[key.copy(freeze: freeze)] = value.copy(freeze: freeze)
         | 
| 70 | 
            +
                          end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                          hash.freeze if resolve_freeze_argument(freeze)
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                          hash
         | 
| 75 | 
            +
                        end
         | 
| 76 | 
            +
                      end
         | 
| 77 | 
            +
                    end
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 11 81 | 
             
                extend Is::Extension
         | 
| 12 82 |  | 
| 13 | 
            -
                using  | 
| 83 | 
            +
                using Copy
         | 
| 14 84 |  | 
| 15 85 | 
             
                ALLOWED_FLAGS = %i[class instance].freeze
         | 
| 16 86 |  | 
| 17 | 
            -
                 | 
| 87 | 
            +
                applies do
         | 
| 18 88 | 
             
                  prepend_defined_state_modules
         | 
| 19 89 | 
             
                end
         | 
| 20 90 |  | 
| 21 | 
            -
                extends : | 
| 91 | 
            +
                extends :definition do
         | 
| 22 92 | 
             
                  # [public] Defines state by name.
         | 
| 23 93 | 
             
                  #
         | 
| 24 94 | 
             
                  # flags - Changes how the state is defined. Possible values include:
         | 
| @@ -62,9 +132,9 @@ module Is | |
| 62 132 | 
             
                      if state[:class]
         | 
| 63 133 | 
             
                        defined_state_class_module.module_eval <<~CODE, __FILE__, __LINE__ + 1
         | 
| 64 134 | 
             
                          #{prefix}def #{method_name}
         | 
| 65 | 
            -
                            unless defined_state_isolations.include?(#{ivar_name})
         | 
| 135 | 
            +
                            unless defined_state_isolations.include?(#{ivar_name.inspect})
         | 
| 66 136 | 
             
                              #{ivar_name} = #{ivar_name}.copy
         | 
| 67 | 
            -
                              defined_state_isolations << #{ivar_name}
         | 
| 137 | 
            +
                              defined_state_isolations << #{ivar_name.inspect}
         | 
| 68 138 | 
             
                            end
         | 
| 69 139 |  | 
| 70 140 | 
             
                            #{ivar_name}
         | 
| @@ -75,9 +145,9 @@ module Is | |
| 75 145 | 
             
                      if state[:instance]
         | 
| 76 146 | 
             
                        defined_state_instance_module.module_eval <<~CODE, __FILE__, __LINE__ + 1
         | 
| 77 147 | 
             
                          #{prefix}def #{method_name}
         | 
| 78 | 
            -
                            unless defined_state_isolations.include?(#{ivar_name})
         | 
| 148 | 
            +
                            unless defined_state_isolations.include?(#{ivar_name.inspect})
         | 
| 79 149 | 
             
                              #{ivar_name} = #{ivar_name}.copy
         | 
| 80 | 
            -
                              defined_state_isolations << #{ivar_name}
         | 
| 150 | 
            +
                              defined_state_isolations << #{ivar_name.inspect}
         | 
| 81 151 | 
             
                            end
         | 
| 82 152 |  | 
| 83 153 | 
             
                            #{ivar_name}
         | 
| @@ -167,8 +237,8 @@ module Is | |
| 167 237 | 
             
                  end
         | 
| 168 238 | 
             
                end
         | 
| 169 239 |  | 
| 170 | 
            -
                extends : | 
| 171 | 
            -
                  def initialize( | 
| 240 | 
            +
                extends :implementation, prepend: true do
         | 
| 241 | 
            +
                  def initialize(...)
         | 
| 172 242 | 
             
                    self.class.send(:defined_state).each_pair do |name, state|
         | 
| 173 243 | 
             
                      if state[:instance]
         | 
| 174 244 | 
             
                        instance_variable_set(name, state[:value])
         | 
| @@ -177,9 +247,15 @@ module Is | |
| 177 247 |  | 
| 178 248 | 
             
                    super
         | 
| 179 249 | 
             
                  end
         | 
| 250 | 
            +
             | 
| 251 | 
            +
                  def initialize_copy(...)
         | 
| 252 | 
            +
                    @__defined_state_isolations = []
         | 
| 253 | 
            +
             | 
| 254 | 
            +
                    super
         | 
| 255 | 
            +
                  end
         | 
| 180 256 | 
             
                end
         | 
| 181 257 |  | 
| 182 | 
            -
                extends : | 
| 258 | 
            +
                extends :definition, :implementation do
         | 
| 183 259 | 
             
                  # [public] Safely mutates state by name, yielding a copy of the current value to the block.
         | 
| 184 260 | 
             
                  #
         | 
| 185 261 | 
             
                  def mutate_state(name, &block)
         | 
| @@ -190,5 +266,25 @@ module Is | |
| 190 266 | 
             
                    @__defined_state_isolations ||= []
         | 
| 191 267 | 
             
                  end
         | 
| 192 268 | 
             
                end
         | 
| 269 | 
            +
             | 
| 270 | 
            +
                class << self
         | 
| 271 | 
            +
                  include Is::Localized
         | 
| 272 | 
            +
             | 
| 273 | 
            +
                  def prevent_recursion(object)
         | 
| 274 | 
            +
                    object_id = object.object_id
         | 
| 275 | 
            +
                    copied_objects[object_id] = true
         | 
| 276 | 
            +
                    yield
         | 
| 277 | 
            +
                  ensure
         | 
| 278 | 
            +
                    copied_objects.delete(object_id)
         | 
| 279 | 
            +
                  end
         | 
| 280 | 
            +
             | 
| 281 | 
            +
                  def copying?(object)
         | 
| 282 | 
            +
                    copied_objects[object.object_id]
         | 
| 283 | 
            +
                  end
         | 
| 284 | 
            +
             | 
| 285 | 
            +
                  def copied_objects
         | 
| 286 | 
            +
                    localized(:__corerb_copied_objects) || localize(:__corerb_copied_objects, {})
         | 
| 287 | 
            +
                  end
         | 
| 288 | 
            +
                end
         | 
| 193 289 | 
             
              end
         | 
| 194 290 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,43 +1,43 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: core-state
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.1.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Bryan Powell
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021- | 
| 11 | 
            +
            date: 2021-09-29 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            -
              name: core- | 
| 14 | 
            +
              name: core-extension
         | 
| 15 15 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 16 | 
             
                requirements:
         | 
| 17 17 | 
             
                - - "~>"
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: '0. | 
| 19 | 
            +
                    version: '0.3'
         | 
| 20 20 | 
             
              type: :runtime
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: '0. | 
| 26 | 
            +
                    version: '0.3'
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            -
              name: core- | 
| 28 | 
            +
              name: core-local
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - "~>"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: '0. | 
| 33 | 
            +
                    version: '0.1'
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - "~>"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: '0. | 
| 40 | 
            +
                    version: '0.1'
         | 
| 41 41 | 
             
            description: Easily manage object state.
         | 
| 42 42 | 
             
            email: bryan@metabahn.com
         | 
| 43 43 | 
             
            executables: []
         | 
| @@ -61,14 +61,14 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 61 61 | 
             
              requirements:
         | 
| 62 62 | 
             
              - - ">="
         | 
| 63 63 | 
             
                - !ruby/object:Gem::Version
         | 
| 64 | 
            -
                  version: 2. | 
| 64 | 
            +
                  version: '2.7'
         | 
| 65 65 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 66 66 | 
             
              requirements:
         | 
| 67 67 | 
             
              - - ">="
         | 
| 68 68 | 
             
                - !ruby/object:Gem::Version
         | 
| 69 69 | 
             
                  version: '0'
         | 
| 70 70 | 
             
            requirements: []
         | 
| 71 | 
            -
            rubygems_version: 3.2. | 
| 71 | 
            +
            rubygems_version: 3.2.22
         | 
| 72 72 | 
             
            signing_key:
         | 
| 73 73 | 
             
            specification_version: 4
         | 
| 74 74 | 
             
            summary: Easily manage object state.
         |