peel 0.1.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 +7 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +37 -0
- data/LICENSE.txt +21 -0
- data/README.md +74 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/dev_journal/Day_0.md +109 -0
- data/dev_journal/Day_1.md +181 -0
- data/dev_journal/Day_2.md +59 -0
- data/dev_journal/Day_3.md +138 -0
- data/dev_journal/Day_4.md +195 -0
- data/dev_journal/Day_5..md +366 -0
- data/lib/peel.rb +22 -0
- data/lib/peel/modelable.rb +52 -0
- data/lib/peel/repository.rb +14 -0
- data/lib/peel/version.rb +3 -0
- data/peel.gemspec +31 -0
- metadata +123 -0
data/lib/peel.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "peel/version"
|
2
|
+
require "peel/modelable"
|
3
|
+
require "peel/repository"
|
4
|
+
|
5
|
+
module Peel
|
6
|
+
class << self
|
7
|
+
attr_accessor :configuration
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.configure
|
11
|
+
self.configuration ||= Configuration.new
|
12
|
+
yield(configuration)
|
13
|
+
end
|
14
|
+
|
15
|
+
class Configuration
|
16
|
+
attr_accessor :database_file
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@database_file = ':memory:'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative 'repository'
|
2
|
+
|
3
|
+
module Peel
|
4
|
+
module Modelable
|
5
|
+
def initialize(**args)
|
6
|
+
args.each do |attribute, value|
|
7
|
+
if self.class.columns.include?(attribute)
|
8
|
+
instance_variable_set("@#{attribute.to_s}", value)
|
9
|
+
else
|
10
|
+
raise ArgumentError, "Unknown keyword: #{attribute}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.included(base)
|
16
|
+
base.extend(ClassMethods)
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
def peel_off(table)
|
21
|
+
@name = table.to_s
|
22
|
+
@repository = Repository.new
|
23
|
+
create_accessors
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_accessors
|
27
|
+
columns.each do |column|
|
28
|
+
define_method("#{column}") { instance_variable_get("@#{column}")}
|
29
|
+
define_method("#{column}=") { |value| instance_variable_set("@#{column}", value)}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def find(id)
|
34
|
+
result = @repository.execute(
|
35
|
+
"SELECT * FROM #{@name} WHERE id = ? LIMIT 1",
|
36
|
+
id
|
37
|
+
)
|
38
|
+
if result.empty?
|
39
|
+
{}
|
40
|
+
else
|
41
|
+
result_hash = columns.zip(result.first).to_h
|
42
|
+
new(result_hash)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def columns
|
47
|
+
@repository.execute("PRAGMA table_info(#{@name})")
|
48
|
+
.map { |col| col[1].to_sym }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'sqlite3'
|
2
|
+
|
3
|
+
module Peel
|
4
|
+
class Repository
|
5
|
+
def initialize(database: SQLite3::Database)
|
6
|
+
database_file = Peel.configuration.database_file
|
7
|
+
@database = database.new(database_file)
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute(query, bind_vars=[], *args, &block)
|
11
|
+
@database.execute(query, bind_vars, *args, &block)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/peel/version.rb
ADDED
data/peel.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "peel/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "peel"
|
8
|
+
spec.version = Peel::VERSION
|
9
|
+
spec.authors = ["Thomas Countz"]
|
10
|
+
spec.email = ["thomascountz@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Non-production Ruby implementation of the Active Record Pattern}
|
13
|
+
spec.description = %q{Thought experiment with ORM design, inspired by Gregory Brown's Broken Record project}
|
14
|
+
spec.homepage = "https://github.com/thomascountz/peel"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
# Specify which files should be added to the gem when it is released.
|
18
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
20
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
|
+
end
|
22
|
+
spec.bindir = "exe"
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
+
spec.require_paths = ["lib"]
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
|
30
|
+
spec.add_runtime_dependency "sqlite3"
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: peel
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Thomas Countz
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-10-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sqlite3
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Thought experiment with ORM design, inspired by Gregory Brown's Broken
|
70
|
+
Record project
|
71
|
+
email:
|
72
|
+
- thomascountz@gmail.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- ".gitignore"
|
78
|
+
- ".rspec"
|
79
|
+
- ".travis.yml"
|
80
|
+
- CODE_OF_CONDUCT.md
|
81
|
+
- Gemfile
|
82
|
+
- Gemfile.lock
|
83
|
+
- LICENSE.txt
|
84
|
+
- README.md
|
85
|
+
- Rakefile
|
86
|
+
- bin/console
|
87
|
+
- bin/setup
|
88
|
+
- dev_journal/Day_0.md
|
89
|
+
- dev_journal/Day_1.md
|
90
|
+
- dev_journal/Day_2.md
|
91
|
+
- dev_journal/Day_3.md
|
92
|
+
- dev_journal/Day_4.md
|
93
|
+
- dev_journal/Day_5..md
|
94
|
+
- lib/peel.rb
|
95
|
+
- lib/peel/modelable.rb
|
96
|
+
- lib/peel/repository.rb
|
97
|
+
- lib/peel/version.rb
|
98
|
+
- peel.gemspec
|
99
|
+
homepage: https://github.com/thomascountz/peel
|
100
|
+
licenses:
|
101
|
+
- MIT
|
102
|
+
metadata: {}
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
requirements: []
|
118
|
+
rubyforge_project:
|
119
|
+
rubygems_version: 2.5.2
|
120
|
+
signing_key:
|
121
|
+
specification_version: 4
|
122
|
+
summary: Non-production Ruby implementation of the Active Record Pattern
|
123
|
+
test_files: []
|