dddr 2.1.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 348b677b23aa6781f82ed84d35a72e2cbb2873245380194cb2a33d017bd4eb29
4
- data.tar.gz: 174ee9771fcb8633cf1661e96e1b419c78ba7dc98b47f333665c8bbf1b7d4cfa
3
+ metadata.gz: d2f6afaa1eb4dfe12d0b23863245fed79c2bceaa2d4b07a800d6139f25ff4c11
4
+ data.tar.gz: ef76a7d071a37b57ad42872b8ce08acff77ceb613c5d8fbcdbd180ae5066b6c1
5
5
  SHA512:
6
- metadata.gz: 717aa4966cdf9b930d223b48257cef1b0de8a8397017b0d13dab766f662d1a1f91b55baf1e6d6de98a580e1f887d5fb57af5f5050fede90172b18a839e9b9216
7
- data.tar.gz: a3fb0a6b030793c96a688abf6f803dfd9324132d53f479353fbe4edb67f30325110d17d57204dc295606f494eba8492784520fb9c3405c1aacc00d2568996136
6
+ metadata.gz: 86b6bbe5171e50157b17bf4a1ba79852950b331c8e1f13e5219f81363228341cfd7f9166830ced1ef2d0cd93ff6d29580a49f31e50ac35aadcb8e64beedfb978
7
+ data.tar.gz: d11b34ef26630fac36b37ebe45bbc63d768fe7a96db17df10f9cf8e65f68da5dda2b440f1add108a816e00d20ca6cd2df4a314ab4102ebb3b931cbd10d756335
data/.rspec CHANGED
@@ -1,3 +1,3 @@
1
- --format documentation
1
+ --format progress
2
2
  --color
3
3
  --require spec_helper
data/.rspecrc ADDED
@@ -0,0 +1,4 @@
1
+ --color
2
+ --profile
3
+ --progress
4
+
data/lib/dddr/sdbm.rb CHANGED
@@ -31,6 +31,7 @@ module Dddr
31
31
 
32
32
  class RepositoryBase
33
33
  def initialize(entity_class)
34
+ @mutex = Mutex.new
34
35
  @entity_class = entity_class
35
36
  setup_data_directory(entity_class)
36
37
  @serializer = Dddr::Serializer.new(Dddr.configuration.serializer)
@@ -62,31 +63,31 @@ module Dddr
62
63
  def count
63
64
  all.count
64
65
  end
65
-
66
+
66
67
  def to_csv
67
68
  env = Dddr.configuration.env
68
69
  data_dir = Dddr.configuration.data_dir
69
- container = Dddr.configuration.container
70
+ container = Dddr.configuration.container
70
71
  CSV.open("#{data_dir}/#{container}/#{env}/#{self.class.name}.csv", "w") do |csv|
71
72
  csv = all.first&.to_hash&.keys
72
73
  all.each do |entity|
73
74
  csv << entity.to_hash.values
74
- end
75
- end
75
+ end
76
+ end
76
77
  end
77
78
 
78
-
79
-
80
79
  def add(entity)
81
- uid = SecureRandom.uuid
82
- entity.uid = uid
83
- entity.created_at ||= DateTime.now.to_s
84
- entity.last_updated_at ||= entity.created_at
85
-
86
- SDBM.open(@data_dir) do |db|
87
- db[uid] = @serializer.dump(entity.to_hash)
80
+ @mutex.synchronize do
81
+ uid = SecureRandom.uuid
82
+ entity.uid = uid
83
+ entity.created_at ||= DateTime.now.to_s
84
+ entity.last_updated_at ||= entity.created_at
85
+
86
+ SDBM.open(@data_dir) do |db|
87
+ db[uid] = @serializer.dump(entity.to_hash)
88
+ end
89
+ uid
88
90
  end
89
- uid
90
91
  end
91
92
 
92
93
  alias_method :create, :add
@@ -97,11 +98,13 @@ module Dddr
97
98
 
98
99
  def update(entity)
99
100
  return unless entity.uid
100
- entity.last_updated_at = DateTime.now.to_s
101
- SDBM.open(@data_dir) do |db|
102
- db[entity.uid] = @serializer.dump(entity.to_hash)
101
+ @mutex.synchronize do
102
+ entity.last_updated_at = DateTime.now.to_s
103
+ SDBM.open(@data_dir) do |db|
104
+ db[entity.uid] = @serializer.dump(entity.to_hash)
105
+ end
106
+ entity
103
107
  end
104
- entity
105
108
  end
106
109
 
107
110
  alias_method :modify, :update
@@ -112,8 +115,10 @@ module Dddr
112
115
 
113
116
  def delete(entity)
114
117
  return unless entity.uid
115
- SDBM.open(@data_dir) do |db|
116
- db.delete(entity.uid)
118
+ @mutex.synchronize do
119
+ SDBM.open(@data_dir) do |db|
120
+ db.delete(entity.uid)
121
+ end
117
122
  end
118
123
  end
119
124
 
@@ -124,28 +129,32 @@ module Dddr
124
129
  alias_method :wipe, :delete
125
130
 
126
131
  def get(uid)
127
- SDBM.open(@data_dir) do |db|
128
- data = db[uid]
129
- return unless data
132
+ @mutex.synchronize do
133
+ SDBM.open(@data_dir) do |db|
134
+ data = db[uid]
135
+ return unless data
130
136
 
131
- entity = @entity_class.new
132
- entity.from_hash(uid, @serializer.load(data))
133
- entity
137
+ entity = @entity_class.new
138
+ entity.from_hash(uid, @serializer.load(data))
139
+ entity
140
+ end
134
141
  end
135
142
  end
136
143
 
137
144
  alias_method :find, :get
138
145
 
139
146
  def all
140
- result = []
141
- SDBM.open(@data_dir) do |db|
142
- db.each do |key, value|
143
- entity = @entity_class.new
144
- entity.from_hash(key, @serializer.load(value))
145
- result << entity unless entity.deleted
147
+ @mutex.synchronize do
148
+ result = []
149
+ SDBM.open(@data_dir) do |db|
150
+ db.each do |key, value|
151
+ entity = @entity_class.new
152
+ entity.from_hash(key, @serializer.load(value))
153
+ result << entity unless entity.deleted
154
+ end
146
155
  end
156
+ result
147
157
  end
148
- result
149
158
  end
150
159
  end
151
160
 
@@ -159,11 +168,13 @@ module Dddr
159
168
  end
160
169
 
161
170
  def from_hash(uid, data_hash)
162
- self.uid = uid
163
- data_hash&.each do |attribute, value|
164
- attribute = attribute.to_sym
165
- if respond_to?(:"#{attribute}=")
166
- send(:"#{attribute}=", value)
171
+ Mutex.new.synchronize do
172
+ self.uid = uid
173
+ data_hash&.each do |attribute, value|
174
+ attribute = attribute.to_sym
175
+ if respond_to?(:"#{attribute}=")
176
+ send(:"#{attribute}=", value)
177
+ end
167
178
  end
168
179
  end
169
180
  end
data/lib/dddr/sequel.rb CHANGED
@@ -1,6 +1,29 @@
1
+ require "sequel"
2
+
3
+ ::Sequel::Model.plugin :timestamps
4
+
1
5
  module Dddr
2
6
  module Sequel
3
7
  module ClassMethods
8
+ def create_properties(*names)
9
+ names.each do |name|
10
+ name.each do |name|
11
+ attr_accessor name
12
+ end
13
+ end
14
+ end
15
+
16
+ def from_row(row)
17
+ item = new
18
+ item.from_hash(row[:uid], row)
19
+ item
20
+ end
21
+
22
+ def table(name = nil)
23
+ @@table_name = name unless name.nil?
24
+ @@table_name
25
+ end
26
+
4
27
  def queries(&block)
5
28
  @queries_module ||= Module.new
6
29
  @queries_module.module_eval(&block)
@@ -30,63 +53,29 @@ module Dddr
30
53
  end
31
54
 
32
55
  class RepositoryBase
56
+ attr_reader :dataset
57
+
33
58
  def initialize(entity_class)
34
59
  @entity_class = entity_class
35
- setup_data_directory(entity_class)
36
- end
37
-
38
- def setup_data_directory(entity_class)
39
- env = Dddr.configuration.env
40
- data_dir = Dddr.configuration.data_dir
41
- container = Dddr.configuration.container
42
- raise Dddr::Error, "Container name is required" unless container
43
-
44
- # Construct the target directory path
45
- @name = "#{data_dir}/#{container}/#{env}/#{entity_class.name.downcase}"
46
-
47
- begin
48
- # Ensure all directories in the path are created
49
- FileUtils.mkdir_p(@name)
50
-
51
- # Change ownership only if the path starts with "/var/"
52
- if @name.start_with?("/var/")
53
- FileUtils.chown_R(ENV["USER"], nil, @name)
54
- end
55
- rescue Errno::ENOENT => e
56
- # Log or handle the error
57
- raise "Failed to create or access the directory: #{e.message}"
58
- end
60
+ @dataset = Dddr.configuration.db[@entity_class.table]
61
+ @entity_class.create_properties(@dataset.columns)
59
62
  end
60
63
 
61
64
  def count
62
- all.count
65
+ @dataset.count
63
66
  end
64
67
 
65
68
  def add(entity)
66
69
  uid = SecureRandom.uuid
67
70
  entity.uid = uid
68
- entity.created_at ||= DateTime.now.to_s
69
- entity.last_updated_at ||= entity.created_at
70
-
71
- SDBM.open(@name) do |db|
72
- db[uid] = Marshal.dump(entity.to_hash)
73
- end
71
+ @dataset.insert(entity.to_hash)
74
72
  uid
75
73
  end
76
-
77
74
  alias_method :create, :add
78
75
  alias_method :insert, :add
79
- alias_method :put, :add
80
- alias_method :append, :add
81
- alias_method :store, :add
82
76
 
83
77
  def update(entity)
84
- return unless entity.uid
85
- entity.last_updated_at = DateTime.now.to_s
86
- SDBM.open(@name) do |db|
87
- db[entity.uid] = Marshal.dump(entity.to_hash)
88
- end
89
- entity
78
+ @dataset.where(uid: entity.uid).update(entity.to_hash)
90
79
  end
91
80
 
92
81
  alias_method :modify, :update
@@ -96,10 +85,7 @@ module Dddr
96
85
  alias_method :alter, :update
97
86
 
98
87
  def delete(entity)
99
- return unless entity.uid
100
- SDBM.open(@name) do |db|
101
- db.delete(entity.uid)
102
- end
88
+ @dataset.where(uid: entity.uid).delete
103
89
  end
104
90
 
105
91
  alias_method :remove, :delete
@@ -109,28 +95,21 @@ module Dddr
109
95
  alias_method :wipe, :delete
110
96
 
111
97
  def get(uid)
112
- SDBM.open(@name) do |db|
113
- data = db[uid]
114
- return unless data
115
-
116
- entity = @entity_class.new
117
- entity.from_hash(uid, Marshal.load(data))
118
- entity
119
- end
98
+ row = @dataset.where(uid: uid).first
99
+ raise Dddr::Error, "UID is required" unless row
100
+ item = Item.new
101
+ item.from_hash(uid, row)
102
+ item
120
103
  end
121
104
 
122
105
  alias_method :find, :get
123
106
 
124
107
  def all
125
- result = []
126
- SDBM.open(@name) do |db|
127
- db.each do |key, value|
128
- entity = @entity_class.new
129
- entity.from_hash(key, Marshal.load(value))
130
- result << entity unless entity.deleted
131
- end
108
+ @dataset.all.map do |row|
109
+ item = Item.new
110
+ item.from_hash(row[:uid], row)
111
+ item
132
112
  end
133
- result
134
113
  end
135
114
  end
136
115
 
data/lib/dddr/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dddr
4
- VERSION = "2.1.0"
4
+ VERSION = "2.3.0"
5
5
  end
data/lib/dddr.rb CHANGED
@@ -3,12 +3,12 @@
3
3
  require "sdbm"
4
4
  require "securerandom"
5
5
  require "date"
6
- require 'csv'
6
+ require "csv"
7
7
  require "ostruct"
8
8
  require "fileutils"
9
9
  require "oj"
10
10
  require "msgpack"
11
-
11
+ require "thread"
12
12
  require_relative "dddr/sdbm"
13
13
  require_relative "dddr/sequel"
14
14
  require_relative "dddr/version"
@@ -22,8 +22,9 @@ module Dddr
22
22
 
23
23
  class MessagePack
24
24
  def self.load(obj)
25
- ::MessagePack.unpack(obj)
25
+ ::MessagePack.unpack(obj)
26
26
  end
27
+
27
28
  def self.dump(obj)
28
29
  obj.to_msgpack
29
30
  end
@@ -31,15 +32,20 @@ module Dddr
31
32
 
32
33
  class Serializer
33
34
  def initialize(engine)
35
+ @mutex = Mutex.new
34
36
  @engine = engine
35
37
  end
36
38
 
37
39
  def dump(obj)
38
- @engine.dump(obj)
40
+ @mutex.synchronize do
41
+ @engine.dump(obj)
42
+ end
39
43
  end
40
44
 
41
45
  def load(obj)
42
- @engine.load(obj)
46
+ @mutex.synchronize do
47
+ @engine.load(obj)
48
+ end
43
49
  end
44
50
  end
45
51
 
@@ -55,6 +61,12 @@ module Dddr
55
61
  class Error < StandardError; end
56
62
 
57
63
  module Entity
64
+ def self.create_properties(*names)
65
+ names.each do |name|
66
+ attr_accessor name
67
+ end
68
+ end
69
+
58
70
  def self.included(base)
59
71
  if Dddr.configuration.engine == :sdbm
60
72
  Dddr::ENTITIES << base
@@ -63,7 +75,7 @@ module Dddr
63
75
  end
64
76
  if Dddr.configuration.engine == :sequel
65
77
  include Dddr::Sequel
66
- base.extend(Dddr::Sdbm::ClassMethods)
78
+ base.extend(Dddr::Sequel::ClassMethods)
67
79
  end
68
80
  end
69
81
 
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dddr
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delaney Burke
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-12 00:00:00.000000000 Z
11
+ date: 2024-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sdbm
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: '0'
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: '1.0'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: sequel
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '5.32'
33
+ version: '0'
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: '5.32'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: oj
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '3.11'
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '3.11'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: msgpack
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -77,6 +77,7 @@ extensions: []
77
77
  extra_rdoc_files: []
78
78
  files:
79
79
  - ".rspec"
80
+ - ".rspecrc"
80
81
  - ".standard.yml"
81
82
  - CHANGELOG.md
82
83
  - CODE_OF_CONDUCT.md