local_model 0.1.0 → 0.1.6

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: d1f1bc15ddc521bde62f5f54c0a2d1afd83fce6cb48f6d219a2f51ab10bcca5a
4
- data.tar.gz: 68bba359571444d2642144a08f8048eaa6dc0576968a92a896dc8e52b1258f49
3
+ metadata.gz: 1e2e9ec418cbe408265a42042295c4bc6a7a48aa3235529bb0f4e8f3ab2a32d1
4
+ data.tar.gz: 61b515ff1fcb5794737a67fff0c13d70f6062cc8a952167920e828e61d2ce70e
5
5
  SHA512:
6
- metadata.gz: 9ad5e42e5270c50e4e05d8ef678fb59885efd9fbd15acbd5e2ce76c4f47ad46ab63e8aef0259257db6fa36b510853bf78e72c097d2319a5a6ab33ecd2dfdbe81
7
- data.tar.gz: d43a6e529cd6670cbbac2711db14af646d68f0fb40616d86c0347d9491f4acf7d3063ab0fca191f42cf1848cca1801d87d87d7b0347695abcaace0a143dad347
6
+ metadata.gz: e1960d07ccc9f2ce66f394279449985c446a4d4faf613aac69b5be56dfad9ecabc9e1c857508e52d87e4b5d756c2317eab46fbf551a81de69756b60cbd18fd39
7
+ data.tar.gz: e5c4ea1b2c503f5a2e5ffcb9cce1976a388df2d57eb56606a550704891e8a53035929ff71654aebf07a6bd070436dd92ac8e946d6d211a32dd3e864dd01db97e
data/Gemfile CHANGED
@@ -5,7 +5,6 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
5
5
  # Specify your gem's dependencies in local_model.gemspec
6
6
  gemspec
7
7
 
8
- gem "require_all", "~> 3.0"
9
8
 
10
9
  gem "pry", "~> 0.14.1", group: :development
11
10
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- local_model (0.1.0)
4
+ local_model (0.1.5)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -18,7 +18,6 @@ GEM
18
18
  rake (13.0.3)
19
19
  reline (0.2.5)
20
20
  io-console (~> 0.5)
21
- require_all (3.0.0)
22
21
  rspec (3.10.0)
23
22
  rspec-core (~> 3.10.0)
24
23
  rspec-expectations (~> 3.10.0)
@@ -42,7 +41,6 @@ DEPENDENCIES
42
41
  local_model!
43
42
  pry (~> 0.14.1)
44
43
  rake (~> 13.0)
45
- require_all (~> 3.0)
46
44
  rspec (~> 3.10)
47
45
 
48
46
  BUNDLED WITH
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,7 +1,6 @@
1
- require 'pry'
2
1
  require_relative "./local_model/version"
3
2
  require 'csv'
4
- require 'require_all'
3
+ require_relative './local_model/sandbox'
5
4
  require_relative './local_model/adapters/boolean_adapter'
6
5
  require_relative './local_model/adapters/datetime_adapter'
7
6
  require_relative './local_model/adapters/float_adapter'
@@ -17,6 +16,21 @@ module LocalModel
17
16
  class Error < StandardError; end
18
17
 
19
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
20
34
 
21
35
  def self.path
22
36
  @@path
@@ -28,9 +42,10 @@ module LocalModel
28
42
  yield(configuration)
29
43
  end
30
44
  @@path = configuration.path
45
+ @@namespace = configuration.namespace
31
46
  Dir.mkdir(configuration.path) unless Dir.exist?(configuration.path)
32
47
  if configuration.cleanup_on_start
33
- Dir.foreach do |f|
48
+ Dir.foreach(configuration.path) do |f|
34
49
  fn = File.join(configuration.path, f)
35
50
  File.delete(fn) if f != '.' && f != '..'
36
51
  end
@@ -39,11 +54,12 @@ module LocalModel
39
54
 
40
55
  class Configuration
41
56
 
42
- attr_accessor :path, :cleanup_on_start
57
+ attr_accessor :path, :cleanup_on_start, :namespace
43
58
 
44
59
  def initialize
45
60
  @path = "#{Dir.pwd}/tmp"
46
61
  @cleanup_on_start = false
62
+ @namespace = nil
47
63
  end
48
64
  end
49
65
  end
@@ -5,37 +5,108 @@ class LocalModel::Model
5
5
  # yield(SchemaBuilder.new(self))
6
6
  end
7
7
 
8
- def self.belongs_to(association)
8
+ def self.belongs_to(association, class_name: nil, foreign_key: nil)
9
+ if class_name.nil?
10
+ association_class_name = LocalModel::Functions.snake_to_camel(association)
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
+
9
23
  define_method association do
10
- id = self.send("#{association}_id")
11
- association_class_name = LocalModel::Functions.snake_to_camel(association).capitalize
12
24
  association_class = Object.const_get(association_class_name)
25
+ id = self.send(keyname)
13
26
  association_class.find(id)
14
27
  end
15
28
 
16
29
  define_method "#{association}=" do |association_obj|
17
- self.send("#{association}_id=", association_obj.id)
30
+ self.send("#{keyname}=", association_obj.id)
31
+ end
32
+ end
33
+
34
+ def self.has_many(association, through: nil, class_name: nil, foreign_key: nil)
35
+ if class_name.nil?
36
+ association_classname = namespace_classname(get_classname_from_association(association))
37
+ else
38
+ association_classname = namespace_classname(class_name)
39
+ end
40
+
41
+
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
45
+ define_method association do
46
+ association_class = Object.const_get(association_classname)
47
+ association_class.where(belongs_to_id_sym => self.id)
48
+ end
49
+ else
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
52
+ define_method association do
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))}
55
+ end
56
+ end
57
+ end
58
+
59
+ def self.has_one(association, through: nil, class_name: nil, foreign_key: nil)
60
+ if class_name.nil?
61
+ association_classname = LocalModel::Functions.snake_to_camel(association)
62
+ association_classname[0] = association_classname[0].upcase
63
+ association_classname = namespace_classname(association_classname)
64
+ else
65
+ association_classname = namespace_classname(class_name)
66
+ end
67
+
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
18
82
  end
19
83
  end
20
84
 
21
- def self.has_many(association)
85
+ def self.get_classname_from_association(association)
22
86
  association_portions = association.to_s.split('_')
23
87
  association_portions_last = association_portions.last
24
88
  singular_association_last = LocalModel::Functions.singularize(association_portions_last)
25
89
  singularized_association = association_portions[0...-1] + [singular_association_last]
26
90
  singularized_snakecase = singularized_association.join('_')
27
- association_classname = LocalModel::Functions.snake_to_camel(singularized_snakecase).capitalize
28
- current_class_id_methodname = "#{LocalModel::Functions.camel_to_snake(self.to_s)}_id"
29
- belongs_to_id_sym = current_class_id_methodname.to_sym
30
-
31
- define_method association do
32
- association_class = Object.const_get(association_classname)
33
- association_class.where(belongs_to_id_sym => self.id)
34
- end
35
-
91
+ classname = LocalModel::Functions.snake_to_camel(singularized_snakecase)
92
+ classname[0] = classname[0].upcase
93
+ classname
94
+ end
95
+ private_class_method :get_classname_from_association
36
96
 
97
+ def self.denamespace_classname(classname)
98
+ return classname.to_s.split("::").last
37
99
  end
100
+ private_class_method :denamespace_classname
38
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
39
110
 
40
111
  def self.storage_path
41
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.0"
2
+ VERSION = "0.1.6"
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.0
4
+ version: 0.1.6
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-10 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