local_model 0.1.2 → 0.1.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9a39edf5e4b5b1dc71f82ff08b04f01c57aa284a0bbb92a93194d70268c803c2
4
- data.tar.gz: 237feb8dc6a943b6aacecdc0ca6774c8b01e1edd7d6e055401c7a24de784ada3
3
+ metadata.gz: 9c10dc1b886abc2bed2a7283a64abf7fd99575e19a2e0599616357001c58e204
4
+ data.tar.gz: a0c8461de603d29117ef0eae3edd3f075a6d68afc89c3ee497c9d22cfe80276a
5
5
  SHA512:
6
- metadata.gz: 962ee92001bc3d6a0a0fbd1b9353f60cc957fe44456f3a62d2b5dcde9e0c88e413b585bb224df64753720ef4956d666c09f26a99cdd2f00fa53c24fc446d9d35
7
- data.tar.gz: 8eac9cb208772976ccabe5efae4345a924662584d2c027e446c303e0a4a7e687546cd73b9507f1c7cdad123ac9b81e5e1a0760f0ecbf19e40990d8c9c267ac31
6
+ metadata.gz: 03a206c0e32ee39ea5e1de95de04bbab6ef56e440274bdc36000516dc7efd90c2b29ea712173a08a839b99ffc3f9158b2648e3feb7920648d3eb8be3b05d108e
7
+ data.tar.gz: 5c58ee8f6cf777d2c0f0ebdd12386a56ab831f96bef339a338afd743cd58ff042416971f9e6646743b2f54387c55c8ece3e8aa6c06e3935e0eca0094d082e741
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- local_model (0.1.1)
4
+ local_model (0.1.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -84,6 +84,36 @@ Does not support yet (notably):
84
84
  - .build, .update, validations, #<< to add many relationships
85
85
  - object equivalence if gotten from source twice
86
86
 
87
+
88
+ ### Namespace Methods
89
+
90
+ ```rb
91
+
92
+ LocalModel.config do |c|
93
+ c.path = "/home/me/data/"
94
+ c.cleanup_on_start = true # delete ALL files in path on startup
95
+ c.namespace = "InMemory" # Expect ALL LocalModels to be namespaced via this string
96
+ end
97
+
98
+ ```
99
+
100
+ ```rb
101
+ # in_memory/pokemon.rb
102
+
103
+ class InMemory::Pokemon < LocalModel::CSV
104
+
105
+ schema do |t|
106
+ t.string :name
107
+ t.string :nickname
108
+ t.integer :hp
109
+ t.string :species
110
+ end
111
+
112
+ end
113
+
114
+
115
+ ```
116
+
87
117
  ## Development
88
118
 
89
119
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/lib/local_model.rb CHANGED
@@ -1,6 +1,6 @@
1
- require 'pry'
2
1
  require_relative "./local_model/version"
3
2
  require 'csv'
3
+ require_relative './local_model/sandbox'
4
4
  require_relative './local_model/adapters/boolean_adapter'
5
5
  require_relative './local_model/adapters/datetime_adapter'
6
6
  require_relative './local_model/adapters/float_adapter'
@@ -16,6 +16,21 @@ module LocalModel
16
16
  class Error < StandardError; end
17
17
 
18
18
  @@path = "#{Dir.pwd}/tmp"
19
+ @@namespace = nil
20
+
21
+ def self.namespaced?
22
+ !!@@namespace
23
+ end
24
+
25
+ def self.namespace
26
+ if @@namespace.nil?
27
+ nil
28
+ elsif @@namespace == :default || @@namespace == "default"
29
+ "LocalModel::Sbx"
30
+ else
31
+ @@namespace
32
+ end
33
+ end
19
34
 
20
35
  def self.path
21
36
  @@path
@@ -27,9 +42,10 @@ module LocalModel
27
42
  yield(configuration)
28
43
  end
29
44
  @@path = configuration.path
45
+ @@namespace = configuration.namespace
30
46
  Dir.mkdir(configuration.path) unless Dir.exist?(configuration.path)
31
47
  if configuration.cleanup_on_start
32
- Dir.foreach do |f|
48
+ Dir.foreach(configuration.path) do |f|
33
49
  fn = File.join(configuration.path, f)
34
50
  File.delete(fn) if f != '.' && f != '..'
35
51
  end
@@ -38,11 +54,12 @@ module LocalModel
38
54
 
39
55
  class Configuration
40
56
 
41
- attr_accessor :path, :cleanup_on_start
57
+ attr_accessor :path, :cleanup_on_start, :namespace
42
58
 
43
59
  def initialize
44
60
  @path = "#{Dir.pwd}/tmp"
45
61
  @cleanup_on_start = false
62
+ @namespace = nil
46
63
  end
47
64
  end
48
65
  end
@@ -11,6 +11,7 @@ class LocalModel::Functions
11
11
  end
12
12
 
13
13
  def self.singularize(word)
14
+ word = word.to_s
14
15
  return PluralizedWords::IRREGULAR_SINGULARIZED_WORDS[word] if PluralizedWords::IRREGULAR_PLURALIZED_WORDS[word]
15
16
  if word[-1] == "i"
16
17
  "#{word[0...-1]}us"
@@ -33,6 +34,7 @@ class LocalModel::Functions
33
34
  end
34
35
 
35
36
  def self.pluralize(word)
37
+ word = word.to_s
36
38
  return PluralizedWords::IRREGULAR_PLURALIZED_WORDS[word] if PluralizedWords::IRREGULAR_PLURALIZED_WORDS[word]
37
39
  if word[-2..-1] == "us"
38
40
  "#{word[0...-2]}i"
@@ -5,57 +5,80 @@ class LocalModel::Model
5
5
  # yield(SchemaBuilder.new(self))
6
6
  end
7
7
 
8
- def self.belongs_to(association)
9
- define_method association do
10
- id = self.send("#{association}_id")
8
+ def self.belongs_to(association, class_name: nil, foreign_key: nil)
9
+ if class_name.nil?
11
10
  association_class_name = LocalModel::Functions.snake_to_camel(association)
12
11
  association_class_name[0] = association_class_name[0].upcase
12
+ association_class_name = namespace_classname(association_class_name)
13
+ else
14
+ association_class_name = namespace_classname(class_name)
15
+ end
16
+
17
+ if foreign_key.nil?
18
+ keyname = "#{association}_id"
19
+ else
20
+ keyname = foreign_key
21
+ end
22
+
23
+ define_method association do
13
24
  association_class = Object.const_get(association_class_name)
25
+ id = self.send(keyname)
14
26
  association_class.find(id)
15
27
  end
16
28
 
17
29
  define_method "#{association}=" do |association_obj|
18
- self.send("#{association}_id=", association_obj.id)
30
+ self.send("#{keyname}=", association_obj.id)
19
31
  end
20
32
  end
21
33
 
22
34
  def self.has_many(association, through: nil, class_name: nil, foreign_key: nil)
23
35
  if class_name.nil?
24
- association_classname = get_classname_from_association(association)
36
+ association_classname = namespace_classname(get_classname_from_association(association))
25
37
  else
26
- association_classname = class_name
38
+ association_classname = namespace_classname(class_name)
27
39
  end
28
40
 
29
- current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(self.to_s)}_id"
30
- belongs_to_id_sym = current_class_id_methodname.to_sym
31
41
 
32
42
  if through.nil?
43
+ current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(denamespace_classname(self))}_id"
44
+ belongs_to_id_sym = current_class_id_methodname.to_sym
33
45
  define_method association do
34
46
  association_class = Object.const_get(association_classname)
35
47
  association_class.where(belongs_to_id_sym => self.id)
36
48
  end
37
49
  else
38
- through_classname = get_classname_from_association(through)
50
+ current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(LocalModel::Functions.singularize(association))}_id"
51
+ belongs_to_id_sym = current_class_id_methodname.to_sym
39
52
  define_method association do
40
- through_class = Object.const_get(through_classname)
41
- through_class.where(belongs_to_id_sym => self.id).map{|obj| obj.send(LocalModel::Functions.singularize(association))}
53
+ association_class = Object.const_get(association_classname)
54
+ self.send(through).map{|through_obj| association_class.find(through_obj.send(belongs_to_id_sym))}
42
55
  end
43
56
  end
44
57
  end
45
58
 
46
- def self.has_one(association, class_name: nil, foreign_key: nil)
59
+ def self.has_one(association, through: nil, class_name: nil, foreign_key: nil)
47
60
  if class_name.nil?
48
61
  association_classname = LocalModel::Functions.snake_to_camel(association)
49
62
  association_classname[0] = association_classname[0].upcase
63
+ association_classname = namespace_classname(association_classname)
50
64
  else
51
- association_classname = class_name
65
+ association_classname = namespace_classname(class_name)
52
66
  end
53
- current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(self.to_s)}_id"
54
- belongs_to_id_sym = current_class_id_methodname.to_sym
55
67
 
56
- define_method association do
57
- association_class = Object.const_get(association_classname)
58
- association_class.where(belongs_to_id_sym => self.id).first
68
+ if through.nil?
69
+ current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(denamespace_classname(self))}_id"
70
+ belongs_to_id_sym = current_class_id_methodname.to_sym
71
+ define_method association do
72
+ association_class = Object.const_get(association_classname)
73
+ association_class.where(belongs_to_id_sym => self.id).first
74
+ end
75
+ else
76
+ current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(association)}_id"
77
+ belongs_to_id_sym = current_class_id_methodname.to_sym
78
+ define_method association do
79
+ association_class = Object.const_get(association_classname)
80
+ association_class.where(id: self.send(through)&.send(belongs_to_id_sym)).first
81
+ end
59
82
  end
60
83
  end
61
84
 
@@ -71,6 +94,19 @@ class LocalModel::Model
71
94
  end
72
95
  private_class_method :get_classname_from_association
73
96
 
97
+ def self.denamespace_classname(classname)
98
+ return classname.to_s.split("::").last
99
+ end
100
+ private_class_method :denamespace_classname
101
+
102
+ def self.namespace_classname(classname)
103
+ if LocalModel.namespaced?
104
+ "#{LocalModel.namespace}::#{classname}"
105
+ else
106
+ classname
107
+ end
108
+ end
109
+ private_class_method :namespace_classname
74
110
 
75
111
  def self.storage_path
76
112
  slash = LocalModel.path == '/' ? '' : '/'
@@ -0,0 +1,4 @@
1
+ module LocalModel::Sbx
2
+
3
+
4
+ end
@@ -1,3 +1,3 @@
1
1
  module LocalModel
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.7"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: local_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Shute
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-11 00:00:00.000000000 Z
11
+ date: 2021-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -82,6 +82,7 @@ files:
82
82
  - lib/local_model/helpers/functions.rb
83
83
  - lib/local_model/helpers/pluralized_words.rb
84
84
  - lib/local_model/model.rb
85
+ - lib/local_model/sandbox.rb
85
86
  - lib/local_model/version.rb
86
87
  - local_model.gemspec
87
88
  homepage: https://github.com/micahshute/local_model