poros 0.3.1 → 0.5.0

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: 016c361abb81a9dfe8c7a338515754ded79a4fd70518ed23964765ec098bc5e5
4
- data.tar.gz: 50679f5bdc6b51afb5e612aa7c93d9de67b469a05ad1baf971d694a5d157e478
3
+ metadata.gz: c7e3b46d74b70a0f801c765e6bc38fe972456e18085b27d409a58cc9753383b3
4
+ data.tar.gz: 540803ca53b42bbf081b0d3abb4d169625d5e9621dbfdd8d44b68b23c756e46c
5
5
  SHA512:
6
- metadata.gz: 397fa97afdc11207acb52d695988bf8045b46dc84d37c938649625e50e8555893b03d755487615aaeb291cb0a2dc7b59ac4ca17629f3b42602f481023a01d815
7
- data.tar.gz: 69a8f43db77401244d12ca66cb0a0d8f527309c335b0e38b6e41347764c8569942b9ffe662f96581dd1ae28b1b97d2dd73cc7b72ec5016ff97b8bf736beb5874
6
+ metadata.gz: 9abc0878efeae1d62cceff5d4ff677736342a36e5268ce2a58c6334d5ebe48ff605eda0bab95fd302168d328f4739074d31bf076d65a2821b1ba6a9d5380d7a0
7
+ data.tar.gz: 0a037b68fa58a9c25f09a5aff82c7edb290459a373ab06e1f19e152313091fac343117a11b5d012c43b28e3222e92ec7f3dca0fd094ca8d83c9c674dd74a7b15
data/.travis.yml CHANGED
@@ -1,10 +1,14 @@
1
1
  sudo: false
2
2
  language: ruby
3
- rvm:
4
- - 2.1.10
5
- - 2.2.9
6
- - 2.3.6
7
- - 2.4.3
8
- - 2.5.1
9
- - ruby-head
10
- before_install: gem install bundler
3
+ matrix:
4
+ include:
5
+ - rvm: 2.1
6
+ gemfile: bundler1.gemfile
7
+ - rvm: 2.2
8
+ gemfile: bundler1.gemfile
9
+ - rvm: 2.3
10
+ - rvm: 2.4
11
+ - rvm: 2.5
12
+ - rvm: 2.6
13
+ - rvm: 2.7
14
+ - rvm: ruby-head
data/README.md CHANGED
@@ -48,6 +48,28 @@ other_widget = Widget.find('uuid')
48
48
  many_widgets = Widget.where(order: 1, name: /regex/)
49
49
  ```
50
50
 
51
+ If you want to use an attribute that's actually a class like `Date` you will
52
+ need to specifically allow it. This is a safety feature of YAML and will help
53
+ protect your code base from malicious users.
54
+
55
+ ```ruby
56
+
57
+ Poros::Config.configure do |config|
58
+ config[:permitted_classes] << Date
59
+ end
60
+
61
+ class Person
62
+ include Poros
63
+
64
+ poro_attr :name, :birthday
65
+
66
+ def initialize(name: '', birthday: Date.today)
67
+ @name = name
68
+ @birthday = birthday
69
+ end
70
+ end
71
+ ```
72
+
51
73
  `#initialize` must use keyword arguments and contain at least all the
52
74
  attributes defined in `poro_attr`. In the future I may define this function for
53
75
  you but for right now I'm not sure I want to go that direction.
@@ -58,9 +80,9 @@ you but for right now I'm not sure I want to go that direction.
58
80
  speed up searching but if your index gets really big the initial load of a
59
81
  model will take quite a long time.
60
82
 
61
- `self.data_directory` you can re-define this method if you don't want it to
62
- save to the default of `./db/#{self}`. If you do re-define it you _must_
63
- seperate each model into it's own folder or it will have _lots_ of issues.
83
+ `self.data_directory` you can redefine this method if you don't want it to
84
+ save to the default of `./db/#{self}`. If you do redefine it you _must_
85
+ seperate each model into its own folder or it will have _lots_ of issues.
64
86
 
65
87
  `.where` acts a bit like ActiveRecord and it takes exact matches, regexs, arrays, or
66
88
  lambdas in any combination.
data/bundler1.gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ gem "bundler", "~> 1.0"
6
+ gem "rake"
7
+ gem "minitest", "~> 5.0"
@@ -25,10 +25,13 @@ module Poros
25
25
  end
26
26
 
27
27
  def find(uuid)
28
- attrs = YAML.load(File.read(file_path(uuid)))
28
+ attrs = YAML.safe_load(
29
+ File.read(file_path(uuid)),
30
+ permitted_classes: Poros::Config.configuration[:permitted_classes],
31
+ )
29
32
  attrs.delete(:uuid)
30
33
 
31
- object = new(attrs)
34
+ object = new(**attrs)
32
35
  object.uuid = uuid
33
36
  object
34
37
  end
@@ -53,7 +56,10 @@ module Poros
53
56
  def all
54
57
  Dir.glob(File.join(data_directory, '*.yml')).map { |file|
55
58
  next if file == index_file
56
- data = YAML.load(File.read(file))
59
+ data = YAML.safe_load(
60
+ File.read(file),
61
+ permitted_classes: Poros::Config.configuration[:permitted_classes],
62
+ )
57
63
  find(data[:uuid])
58
64
  }.compact
59
65
  end
@@ -65,7 +71,12 @@ module Poros
65
71
  def index_data
66
72
  return @index_data if defined? @index_data
67
73
 
68
- data = File.exist?(index_file) ? YAML.load(File.read(index_file)) : {}
74
+ data = File.exist?(index_file) ?
75
+ YAML.safe_load(
76
+ File.read(index_file),
77
+ permitted_classes: Poros::Config.configuration[:permitted_classes],
78
+ ) : {}
79
+
69
80
  # Make sure we always have every index as a key
70
81
  poro_indexes.each do |index|
71
82
  data[index] = {} unless data.has_key?(index)
@@ -0,0 +1,13 @@
1
+ module Poros
2
+ module Config
3
+ def self.configuration
4
+ @configuration ||= {
5
+ permitted_classes: [Symbol],
6
+ }
7
+ end
8
+
9
+ def self.configure
10
+ yield(configuration)
11
+ end
12
+ end
13
+ end
data/lib/poros/query.rb CHANGED
@@ -41,7 +41,10 @@ module Poros
41
41
  if table_scan.size > 0
42
42
  scanned_results = Dir.glob(File.join(@object.data_directory, '*.yml')).map { |file|
43
43
  next if file == @object.index_file
44
- data = YAML.load(File.read(file))
44
+ data = YAML.safe_load(
45
+ File.read(file),
46
+ permitted_classes: Poros::Config.configuration[:permitted_classes],
47
+ )
45
48
  data[:uuid] if table_scan.all? { |key, value|
46
49
  case value
47
50
  when Regexp
data/lib/poros/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Poros
2
- VERSION = "0.3.1"
2
+ VERSION = "0.5.0"
3
3
  end
data/lib/poros.rb CHANGED
@@ -1,12 +1,16 @@
1
1
  require 'yaml'
2
2
  require 'securerandom'
3
3
 
4
+ require 'poros/config'
5
+
4
6
  require 'poros/query'
5
7
  require 'poros/instance_methods'
6
8
  require 'poros/class_methods'
7
9
  require 'poros/relations'
8
10
 
9
11
  module Poros
12
+ include Poros::Config
13
+
10
14
  include Poros::InstanceMethods
11
15
  include Poros::ClassMethods
12
16
  include Poros::Relations
data/poros.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.summary = 'Persist and query your objects'
11
11
  spec.description = 'Persist your objects and query them in an active record like way'
12
12
  spec.authors = ["Sean Ross Earle"]
13
- spec.email = ["sean.earle@oeQuacki.com"]
13
+ spec.email = ["sean.r.earle@gmail.com"]
14
14
  spec.homepage = "https://github.com/HellRok/Poros"
15
15
  spec.license = "MIT"
16
16
 
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.16"
25
- spec.add_development_dependency "rake", "~> 10.0"
26
- spec.add_development_dependency "minitest", "~> 5.0"
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "minitest"
27
27
  end
metadata CHANGED
@@ -1,11 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: poros
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Ross Earle
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
10
  date: 2018-04-22 00:00:00.000000000 Z
@@ -14,47 +13,47 @@ dependencies:
14
13
  name: bundler
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '1.16'
18
+ version: '0'
20
19
  type: :development
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
- - - "~>"
23
+ - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: '1.16'
25
+ version: '0'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: rake
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
- - - "~>"
30
+ - - ">="
32
31
  - !ruby/object:Gem::Version
33
- version: '10.0'
32
+ version: '0'
34
33
  type: :development
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
- - - "~>"
37
+ - - ">="
39
38
  - !ruby/object:Gem::Version
40
- version: '10.0'
39
+ version: '0'
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: minitest
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
- - - "~>"
44
+ - - ">="
46
45
  - !ruby/object:Gem::Version
47
- version: '5.0'
46
+ version: '0'
48
47
  type: :development
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
- - - "~>"
51
+ - - ">="
53
52
  - !ruby/object:Gem::Version
54
- version: '5.0'
53
+ version: '0'
55
54
  description: Persist your objects and query them in an active record like way
56
55
  email:
57
- - sean.earle@oeQuacki.com
56
+ - sean.r.earle@gmail.com
58
57
  executables: []
59
58
  extensions: []
60
59
  extra_rdoc_files: []
@@ -65,8 +64,10 @@ files:
65
64
  - LICENSE.txt
66
65
  - README.md
67
66
  - Rakefile
67
+ - bundler1.gemfile
68
68
  - lib/poros.rb
69
69
  - lib/poros/class_methods.rb
70
+ - lib/poros/config.rb
70
71
  - lib/poros/info.rb
71
72
  - lib/poros/instance_methods.rb
72
73
  - lib/poros/query.rb
@@ -77,7 +78,6 @@ homepage: https://github.com/HellRok/Poros
77
78
  licenses:
78
79
  - MIT
79
80
  metadata: {}
80
- post_install_message:
81
81
  rdoc_options: []
82
82
  require_paths:
83
83
  - lib
@@ -92,9 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
94
  requirements: []
95
- rubyforge_project:
96
- rubygems_version: 2.7.6
97
- signing_key:
95
+ rubygems_version: 4.0.3
98
96
  specification_version: 4
99
97
  summary: Persist and query your objects
100
98
  test_files: []