primitive 1.0.0 → 1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +17 -2
- data/lib/primitive/compact_file.rb +60 -0
- data/lib/primitive/repository.rb +18 -0
- data/lib/primitive/version.rb +1 -1
- data/lib/primitive.rb +3 -1
- data/primitive.gemspec +1 -2
- data/sorbet/rbi/gems/rspec-expectations@3.12.3.rbi +8094 -2
- data/sorbet/rbi/gems/rspec@3.12.0.rbi +76 -2
- metadata +5 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 40ee5850f19f0fc29653907baf90b65348998d2af630a1599fcba4b63a55c35f
|
4
|
+
data.tar.gz: fe83bc660e0ed2480d3f3fee6eea8d51d56b20e819eb6f8e29b79dd74b954802
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b31365c588140386e21bd10fe17e6fc472fa6dc74be50a66c6d5cb238d35e02747e4bdd3f4132edf57478641340b25e919a043351afa73b5d206cdb37b7de03
|
7
|
+
data.tar.gz: 3438616f17a12a2cfb3491509e3e65d9c4edb29e585b6df7588d2050eed1cdf3aeeacf31aba41488d615e4cf397a837c9120d5ed5003470f4ebae3c169082a83
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
### 1.0.1
|
2
|
+
|
3
|
+
* Making Sorbet a required runtime dependency. This is highly opionated and specific to the desired caller use-cases and may not be suitable for all callers.
|
4
|
+
* Adding Repository interface.
|
5
|
+
* Adding CompactFile as a quick example for implementing a basic repository.
|
6
|
+
|
1
7
|
### 1.0.0
|
2
8
|
|
3
9
|
* `Primitive::Entity` added as the first primitive building block.
|
data/README.md
CHANGED
@@ -20,10 +20,10 @@ bundle add primitive
|
|
20
20
|
|
21
21
|
### Primitive::Entity
|
22
22
|
|
23
|
-
Base class for objects identified by a string value (ID). Extension
|
23
|
+
Base class for objects identified by a string value (ID). Extension examples:
|
24
24
|
|
25
25
|
```ruby
|
26
|
-
class Team < Primitive
|
26
|
+
class Team < Primitive::Entity
|
27
27
|
attr_reader :name
|
28
28
|
|
29
29
|
def initialize(id:, name:)
|
@@ -32,6 +32,17 @@ class Team < Primitive
|
|
32
32
|
@name = name
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
# Not allowing direct manipulation of ID in the case it is controlled by the repository.
|
37
|
+
class Player < Primitive::Entity
|
38
|
+
attr_reader :name
|
39
|
+
|
40
|
+
def initialize(name:)
|
41
|
+
super()
|
42
|
+
|
43
|
+
@name = name
|
44
|
+
end
|
45
|
+
end
|
35
46
|
```
|
36
47
|
|
37
48
|
Several features are now provided by its base-class via the ID attribute:
|
@@ -41,6 +52,10 @@ Several features are now provided by its base-class via the ID attribute:
|
|
41
52
|
* Sorting: `#<=>`
|
42
53
|
* Outputting: `#to_s`
|
43
54
|
|
55
|
+
### Primitive::Repository
|
56
|
+
|
57
|
+
An interface that describes how a repository should function for loading/saving entities. A concrete example (albeit simple) is the `Primitive::CompactFile` class which leverages YAML for serialization. Note that ID, in this case, is representative of the file path.
|
58
|
+
|
44
59
|
## Contributing
|
45
60
|
|
46
61
|
### Development Environment Configuration
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative 'repository'
|
5
|
+
|
6
|
+
module Primitive
|
7
|
+
# Knows how to load and save an Entity from/to local disk to a single file.
|
8
|
+
# YAML serialization will be used so in order to safely deserialize, the list of
|
9
|
+
# permitted classes that can be serialized must be specified.
|
10
|
+
class CompactFile
|
11
|
+
extend T::Sig
|
12
|
+
include Repository
|
13
|
+
|
14
|
+
sig { returns(T::Array[T::Class[T.anything]]) }
|
15
|
+
attr_reader :permitted_classes
|
16
|
+
|
17
|
+
sig { params(permitted_classes: T::Array[T::Class[T.anything]]).void }
|
18
|
+
def initialize(permitted_classes: [Primitive::Entity])
|
19
|
+
@permitted_classes = permitted_classes
|
20
|
+
end
|
21
|
+
|
22
|
+
sig { override.params(entity: Primitive::Entity, id: T.nilable(String)).returns(String) }
|
23
|
+
def save(entity, id = nil)
|
24
|
+
raise ArgumentError, 'id is required' unless id
|
25
|
+
|
26
|
+
FileUtils.mkdir_p(File.dirname(id))
|
27
|
+
|
28
|
+
entity.send('id=', id)
|
29
|
+
|
30
|
+
File.write(id, serialize(entity))
|
31
|
+
|
32
|
+
id
|
33
|
+
end
|
34
|
+
|
35
|
+
sig { override.params(id: String).returns(Primitive::Entity) }
|
36
|
+
def retrieve(id)
|
37
|
+
deserialize(File.read(id)).tap do |entity|
|
38
|
+
entity.send('id=', id)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
sig { overridable.params(entity: Primitive::Entity).returns(String) }
|
45
|
+
def serialize(entity)
|
46
|
+
StringIO.new.tap do |io|
|
47
|
+
YAML.dump(entity, io)
|
48
|
+
end.string
|
49
|
+
end
|
50
|
+
|
51
|
+
sig { overridable.params(string: String).returns(Primitive::Entity) }
|
52
|
+
def deserialize(string)
|
53
|
+
YAML.load(
|
54
|
+
string,
|
55
|
+
permitted_classes:,
|
56
|
+
aliases: true
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Primitive
|
5
|
+
# Defines what a repository class should implement.
|
6
|
+
module Repository
|
7
|
+
extend T::Sig
|
8
|
+
extend T::Helpers
|
9
|
+
|
10
|
+
interface!
|
11
|
+
|
12
|
+
sig { abstract.params(entity: Primitive::Entity, id: T.nilable(String)).returns(String) }
|
13
|
+
def save(entity, id = nil); end
|
14
|
+
|
15
|
+
sig { abstract.params(id: String).returns(Primitive::Entity) }
|
16
|
+
def retrieve(id); end
|
17
|
+
end
|
18
|
+
end
|
data/lib/primitive/version.rb
CHANGED
data/lib/primitive.rb
CHANGED
data/primitive.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
|
27
27
|
s.required_ruby_version = '>= 2.7.6'
|
28
28
|
|
29
|
-
s.add_runtime_dependency('sorbet-runtime
|
29
|
+
s.add_runtime_dependency('sorbet-runtime')
|
30
30
|
|
31
31
|
s.add_development_dependency('bundler-audit')
|
32
32
|
s.add_development_dependency('guard-rspec')
|
@@ -40,6 +40,5 @@ Gem::Specification.new do |s|
|
|
40
40
|
s.add_development_dependency('simplecov')
|
41
41
|
s.add_development_dependency('simplecov-console')
|
42
42
|
s.add_development_dependency('sorbet')
|
43
|
-
s.add_development_dependency('sorbet-runtime')
|
44
43
|
s.add_development_dependency('tapioca')
|
45
44
|
end
|