mobx-ruby 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3d45741d8a2ca071d283af6c8c0eaa78ff53d57b
4
+ data.tar.gz: 3cac40f2f61b4f760ec19291abb4167044ab662b
5
+ SHA512:
6
+ metadata.gz: 5c3a42e7ba6a872ab0057f7e7c66d2b9261404d1221dacde483bf02ae13139bc17dc67818f96026ad0262b9c51dbc259794f5f16f8a1522e9ad6e388bed500b5
7
+ data.tar.gz: e61b4e7b441738eb2c3fe43c515287da7128133786fab71dcbb4fdc8464f205f831a0453d48a068c2e4826d4a13041be437a7ba470ad209fe40c10a6a9b19536
data/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright 2017 Michał Matyas
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # Mobx-ruby
2
+
3
+ An implementation of MobX written in Ruby.
4
+
5
+ **THIS IS JUST A FUN PROJECT!!** It is *not* production ready.
6
+
7
+ ## API
8
+
9
+ ```
10
+ ## Observables in classes
11
+
12
+ class ExampleClass
13
+ include Mobx::Extension
14
+ observable :foo, 123
15
+ end
16
+
17
+ example = ExampleClass.new
18
+
19
+ ## Autorun
20
+
21
+ runner = Mobx.autorun do
22
+ puts "Hello: #{example.foo}"
23
+ end
24
+
25
+ example.foo = 456
26
+ # > Hello: 456
27
+ example.foo = 789
28
+ # > Hello: 789
29
+
30
+ ## Actions (transactions)
31
+
32
+ Mobx.action do
33
+ example.foo = 123
34
+ example.foo = 999
35
+ example.foo = 1337
36
+ end
37
+ # > Hello: 1337
38
+
39
+ ## Disposing of autoruns
40
+
41
+ runner.dispose
42
+
43
+ ## Reactions
44
+
45
+ Mobx.reaction -> { example.foo } do
46
+ puts "This doesn't look like anything to me"
47
+ end
48
+ # > This doesn't look like anything to me
49
+
50
+ example.foo = 333
51
+ # > This doesn't look like anything to me
52
+ ```
53
+
54
+ ## TODO
55
+
56
+ - observables are not infectious (observing an array or object will not trigger reactions, not sure how to handle this yet)
57
+ - naming conventions, I was experimenting too much and I'm not happy with the results
data/lib/mobx.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'mobx/autorun'
2
+ require 'mobx/transaction'
3
+ require 'mobx/observable'
4
+ require 'mobx/computed'
5
+ require 'mobx/extension'
6
+ require 'mobx/utils'
7
+
8
+ module Mobx
9
+ extend Mobx::Utils
10
+ extend Mobx::Extension::InstanceMethods
11
+
12
+ def self.init
13
+ Thread.current['mobx'] ||= {
14
+ autorun: [],
15
+ transaction: nil
16
+ }
17
+ end
18
+ end
@@ -0,0 +1,31 @@
1
+ module Mobx
2
+ class Autorun
3
+ attr_reader :observables, :disposed
4
+
5
+ def initialize(block)
6
+ @block = block
7
+ @observables = []
8
+ @disposed = false
9
+ end
10
+
11
+ def call
12
+ @block.call unless disposed
13
+ end
14
+
15
+ def register_observable(observable)
16
+ raise 'Trying to register a disposed Autorun' if disposed
17
+ unless @observables.include?(observable)
18
+ @observables << observable
19
+ @observables.uniq!
20
+
21
+ observable.register_observer(self)
22
+ end
23
+ end
24
+
25
+ def dispose
26
+ @observables.each { |observable| observable.dispose(self) }
27
+ @observables = []
28
+ @disposed = true
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ module Mobx
2
+ class Computed
3
+ attr_reader :value
4
+
5
+ def initialize(block)
6
+ @disposer = Mobx.autorun { @value = block.call }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,44 @@
1
+ module Mobx
2
+ module Extension
3
+ module ClassMethods
4
+ def observable(attr_name, value=nil)
5
+ define_method(attr_name) do
6
+ @__mobx_observables ||= {}
7
+ @__mobx_observables[attr_name] ||= Mobx::Observable.new(value)
8
+ @__mobx_observables[attr_name].get
9
+ end
10
+
11
+ define_method("#{attr_name}=") do |value|
12
+ @__mobx_observables ||= {}
13
+ if @__mobx_observables.has_key?(attr_name)
14
+ @__mobx_observables[attr_name].set(value)
15
+ else
16
+ @__mobx_observables[attr_name] = Mobx::Observable.new(value)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ module InstanceMethods
22
+ def autorun(&block)
23
+ reaction(block, &block)
24
+ end
25
+
26
+ def reaction(react_when, &block)
27
+ autorun = Mobx::Autorun.new(block)
28
+ Mobx.wrapped :autorun, autorun, &react_when
29
+ autorun
30
+ end
31
+
32
+ def action(&block)
33
+ Mobx::Transaction.call(block)
34
+ end
35
+
36
+ alias_method :transaction, :action
37
+ end
38
+
39
+ def self.included(base)
40
+ base.send :include, InstanceMethods
41
+ base.send :extend, ClassMethods
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,51 @@
1
+ require 'pry'
2
+ module Mobx
3
+ class Observable
4
+ attr_reader :observers
5
+
6
+ def initialize(value)
7
+ @value = value
8
+ @observers = []
9
+ end
10
+
11
+ def get
12
+ register_autorun_observers
13
+ @value
14
+ end
15
+
16
+ alias_method :value, :get
17
+
18
+ def set(value)
19
+ register_autorun_observers
20
+
21
+ if !(@value === value)
22
+ @value = value
23
+
24
+ if Mobx.in?(:transaction)
25
+ Mobx.state(:transaction).schedule_observers(@observers)
26
+ else
27
+ @observers.each { |observer| observer.call }
28
+ end
29
+ end
30
+ @value
31
+ end
32
+
33
+ def dispose(observer)
34
+ @observers.delete(observer)
35
+ end
36
+
37
+ def register_observer(observer)
38
+ unless @observers.include?(observer)
39
+ @observers << observer
40
+ @observers.uniq!
41
+ observer.register_observable(self)
42
+ end
43
+ end
44
+
45
+ protected
46
+ def register_autorun_observers
47
+ return unless Mobx.in?(:autorun)
48
+ Mobx.state(:autorun).each { |observer| register_observer(observer) }
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,34 @@
1
+ module Mobx
2
+ class Transaction
3
+ attr_reader :scheduled
4
+
5
+ def initialize(block)
6
+ @block = block
7
+ @scheduled = []
8
+ end
9
+
10
+ def self.call(block)
11
+ transaction = self.new(block)
12
+ transaction.call
13
+ end
14
+
15
+ def call
16
+ Mobx.wrappedOnce(:transaction, self, &@block)
17
+
18
+ unless Mobx.in?(:transaction)
19
+ @scheduled.each(&:call)
20
+ @scheduled = []
21
+ end
22
+ self
23
+ end
24
+
25
+ def schedule_observers(observers)
26
+ observers.each { |observer| schedule_observer(observer) }
27
+ end
28
+
29
+ def schedule_observer(observer)
30
+ @scheduled << observer
31
+ @scheduled.uniq!
32
+ end
33
+ end
34
+ end
data/lib/mobx/utils.rb ADDED
@@ -0,0 +1,29 @@
1
+ module Mobx
2
+ module Utils
3
+ def in?(name)
4
+ return false if Thread.current['mobx'][name].nil?
5
+
6
+ if Thread.current['mobx'][name].respond_to?(:empty?)
7
+ !Thread.current['mobx'][name].empty?
8
+ else
9
+ true
10
+ end
11
+ end
12
+
13
+ def wrapped(name, object, &block)
14
+ Thread.current['mobx'][name] << object
15
+ block.call
16
+ Thread.current['mobx'][name].pop
17
+ end
18
+
19
+ def wrappedOnce(name, object, &block)
20
+ Thread.current['mobx'][name] ||= object
21
+ block.call
22
+ Thread.current['mobx'][name] = nil
23
+ end
24
+
25
+ def state(name)
26
+ Thread.current['mobx'][name]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ module Mobx
2
+ VERSION = '1.0.0'
3
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mobx-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Michał Matyas
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ description: An implementation of Mobx state management library
56
+ email: michal@higher.lv
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - LICENSE
62
+ - README.md
63
+ - lib/mobx.rb
64
+ - lib/mobx/autorun.rb
65
+ - lib/mobx/computed.rb
66
+ - lib/mobx/extension.rb
67
+ - lib/mobx/observable.rb
68
+ - lib/mobx/transaction.rb
69
+ - lib/mobx/utils.rb
70
+ - lib/mobx/version.rb
71
+ homepage: https://github.com/d4rky-pl/mobx-ruby
72
+ licenses:
73
+ - MIT
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.6.8
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Mobx implementation in Ruby
95
+ test_files: []