actn-db 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ module Actn
2
+ module DB
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
data/lib/actn/paths.rb ADDED
@@ -0,0 +1,38 @@
1
+ require "actn/core_ext/kernel"
2
+ require 'pathname'
3
+
4
+ module Actn
5
+
6
+ PROCFILE = "Procfile"
7
+
8
+ module Paths
9
+
10
+ def self.included base
11
+ base.extend self
12
+ end
13
+
14
+ def root
15
+ @@root ||= find_root_with_flag(PROCFILE, Dir.pwd).to_s
16
+ end
17
+
18
+ private
19
+
20
+ # i steal this from rails
21
+ def find_root_with_flag(flag, default=nil)
22
+ root_path = self.called_from[0]
23
+
24
+ while root_path && ::File.directory?(root_path) && !::File.exist?("#{root_path}/#{flag}")
25
+ parent = ::File.dirname(root_path)
26
+ root_path = parent != root_path && parent
27
+ end
28
+
29
+ root = ::File.exist?("#{root_path}/#{flag}") ? root_path : default
30
+ raise "Could not find root path for #{self}" unless root
31
+
32
+ RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ ?
33
+ Pathname.new(root).expand_path : Pathname.new(root).realpath
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,54 @@
1
+ require 'minitest_helper'
2
+ require 'actn/db/mod'
3
+
4
+ module Actn
5
+ module DB
6
+ class TestMod < MiniTest::Test
7
+
8
+ class Boy < Mod
9
+ self.table = "boys"
10
+ self.schema = "public"
11
+ data_attr_accessor :team
12
+ end
13
+
14
+ def setup
15
+ DB.exec_func :create_table , 'public', 'boys'
16
+ end
17
+
18
+ def teardown
19
+ DB.exec_func :drop_table , 'public', 'boys'
20
+ end
21
+
22
+ def test_set_crud
23
+
24
+ boy = Boy.create(team: "Hamstead")
25
+ assert boy.persisted?
26
+
27
+ boy.update(team: "Norfolk")
28
+ assert "Norfolk", boy.team
29
+
30
+ same_boy = Boy.find(boy.uuid)
31
+ assert "Norfolk", same_boy.team
32
+
33
+ same_boy.destroy
34
+
35
+ assert 0, Boy.count
36
+
37
+ Boy.delete_all
38
+
39
+ end
40
+
41
+ def test_finders
42
+ boy = Boy.create(team: "Hamstead")
43
+ assert_raises(ArgumentError){ Boy.find_by }
44
+ refute Boy.find_by({})
45
+ refute Boy.find_by({falan: "filan"})
46
+ assert Boy.find_by(team: "Hamstead")
47
+
48
+ end
49
+
50
+
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,49 @@
1
+ require 'minitest_helper'
2
+ require 'actn/db/model'
3
+ require 'actn/db/set'
4
+
5
+ module Actn
6
+ module DB
7
+ class TestModel < MiniTest::Test
8
+
9
+
10
+ def test_validation
11
+ model = Model.create()
12
+ # puts model.inspect
13
+ assert model.errors.any?
14
+ refute model.persisted?
15
+ refute model.destroy
16
+ end
17
+
18
+ def test_model_with_full_schema
19
+ json = '{"name":"ModelName","schema":{"title":"Model Name","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":["firstName","lastName"]},"indexes":[{"cols":{"apikey":"text"},"unique":true}],"hooks":{"after_create":[{"name":"Trace"},{"name":"Trace"}]}}'
20
+ data = Oj.load(json)
21
+
22
+ model = Model.create(data)
23
+ # puts "----"
24
+ # puts model.inspect
25
+ # puts "----"
26
+ assert model.persisted?
27
+
28
+ assert_match /0/, Set['ModelName'.tableize].count
29
+
30
+ assert model.update({"indexes" => [{"cols" => {"first_name" => "text"},"unique" => true}]})
31
+
32
+ model.update(name: "Cannot change")
33
+
34
+ assert_equal "ModelName", model.name
35
+
36
+ samenamedmodel = Model.create(data)
37
+ puts samenamedmodel.errors.inspect
38
+ refute samenamedmodel.persisted?
39
+
40
+ model.destroy
41
+ # puts "DESTRO #{model.destroy.inspect}"
42
+ #
43
+ # puts "ALL #{Set.new('core','models').all}"
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,71 @@
1
+ require 'minitest_helper'
2
+
3
+ module Actn
4
+ module DB
5
+ class TestPgFuncs < MiniTest::Test
6
+
7
+ def setup
8
+ DB.exec_func :create_table , 'public', 'funkytests'
9
+ end
10
+
11
+ def teardown
12
+ DB.exec_func :drop_table , 'public', 'funkytests'
13
+ end
14
+
15
+ # def test_find_model
16
+ # DB.exec_func(:upsert_model, 'public', {name: "Bonzo"}.to_json)
17
+ # assert_match /"name":"Bonzo"/, DB.exec_func(:find_model, "Bonzo")
18
+ # DB.exec_func(:delete_model, 'public', 'Bonzo')
19
+ # end
20
+
21
+ # def test_insert_delete_model
22
+ # foo = DB.exec_func(:upsert_model, 'public', Oj.dump({name: "Foo"}))
23
+ # assert_match /"name":"Foo"/, foo
24
+ # DB.exec_func(:delete_model, 'public', 'Foo')
25
+ # end
26
+
27
+ def test_upsert
28
+ assert_match /"name":"Baz"/, DB.exec_func(:upsert, 'public', 'funkytests', Oj.dump({name: "Baz"}))
29
+ end
30
+
31
+ def test_update
32
+ DB.exec_func(:upsert, 'public', 'funkytests', Oj.dump({name: "Baz"}))
33
+ assert_match /"name":"Baz-Updated"/, DB.exec_func(:update, 'public', 'funkytests', Oj.dump({name: "Baz-Updated"}), Oj.dump({name: "Baz"}))
34
+ end
35
+
36
+ def test_query
37
+ assert_match /0/, DB.exec_func(:query, 'public', 'funkytests', Oj.dump({select: "COUNT(id)"}))
38
+
39
+ 5.times {|i| DB.exec_func(:upsert, 'public', 'funkytests', Oj.dump({name: "Baz #{i}"})) }
40
+
41
+ assert_match /"name":"Baz 0"/, DB.exec_func(:query, 'public', 'funkytests', Oj.dump({select: 'name'}))
42
+ end
43
+
44
+ def test_delete
45
+ DB.exec_func(:delete, 'public', 'funkytests', Oj.dump({}))
46
+ end
47
+
48
+ def test_validate_so_find_model
49
+ mdata = Oj.dump({
50
+ name: "Supporter",
51
+ schema: {
52
+ type: 'object',
53
+ id: "#supporter",
54
+ title: "Supporter",
55
+ description: "Supporter Model",
56
+ properties: {
57
+ first_name: { type: 'string' }
58
+ },
59
+ required: ['first_name']
60
+ }
61
+ })
62
+ DB.exec_func(:upsert, 'core', 'models', mdata)
63
+ assert_match /errors/, DB.exec_func(:validate, 'Supporter', Oj.dump({}))
64
+ DB.exec_func(:delete, 'core', 'models', Oj.dump({name: 'Supporter'}))
65
+ end
66
+
67
+
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,57 @@
1
+ require 'minitest_helper'
2
+ require 'actn/db/set'
3
+
4
+
5
+ module Actn
6
+ module DB
7
+ class TestSet < MiniTest::Test
8
+
9
+ def setup
10
+ DB.exec_func :create_table , 'public', 'kids'
11
+ end
12
+
13
+ def teardown
14
+ DB.exec_func :drop_table , 'public', 'kids'
15
+ end
16
+
17
+ def test_set_crud
18
+
19
+ assert_equal Set['kids'], Set['kids']
20
+
21
+ assert_match /Belgium/, Set['kids'].upsert(age: 12, city: "Belgium", name: random_str)
22
+
23
+ assert_match /Belgium/, Set['kids'].query(where: { age: [ "<" , 24 ] } )
24
+
25
+ assert_match /red/, Set['kids'].update({color: "red"}, {age: 12})
26
+
27
+ assert_match /1/, Set['kids'].count
28
+
29
+ Set['kids'].delete_all
30
+
31
+ end
32
+
33
+ def test_validate_and_upsert
34
+ mdata = Oj.dump({ name: "Supporter", schema: {
35
+ type: 'object',
36
+ id: "#supporter",
37
+ title: "Supporter",
38
+ description: "Supporter Model",
39
+ properties: {
40
+ city: { type: 'string' }
41
+ },
42
+ required: ['city']
43
+ }
44
+ })
45
+ DB.exec_func(:upsert, 'core', 'models', mdata)
46
+
47
+ assert_match /errors/, Set['supporters'].validate_and_upsert(age: 12, name: random_str)
48
+ assert_match /Belgium/, Set['supporters'].validate_and_upsert(age: 12, city: "Belgium", name: random_str)
49
+
50
+ DB.exec_func(:delete, 'core', 'models', Oj.dump({name: 'Supporter'}))
51
+ end
52
+
53
+
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,18 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'actn/db'
3
+
4
+ require 'minitest/autorun'
5
+ require 'minitest/pride'
6
+
7
+ ENV['RACK_ENV'] = "test"
8
+ ENV['DATABASE_URL'] = "postgres://localhost:5432/actn_test"
9
+
10
+ I18n.enforce_available_locales = false
11
+
12
+ class MiniTest::Test
13
+ private
14
+
15
+ def random_str
16
+ (0...8).map { (65 + rand(26)).chr }.join
17
+ end
18
+ end
metadata ADDED
@@ -0,0 +1,208 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: actn-db
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Onur Uyar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-03 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.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-reporters
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: coffee-script
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: em-pg-client
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activemodel
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: oj
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: bcrypt
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description:
140
+ email:
141
+ - me@onuruyar.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - .gitignore
147
+ - .travis.yml
148
+ - Gemfile
149
+ - LICENSE.txt
150
+ - README.md
151
+ - Rakefile
152
+ - actn-db.gemspec
153
+ - db/1_db.sql
154
+ - db/__functions.sql
155
+ - db/__setup.sql
156
+ - db/lib/_0_actn.js
157
+ - db/lib/_1_underscore.js
158
+ - db/lib/_2_jjv.js
159
+ - db/lib/_3_inflections.js
160
+ - db/lib/_4_builder.coffee
161
+ - db/lib/_4_builder.js
162
+ - db/schemas/model.json
163
+ - lib/actn/core_ext/hash.rb
164
+ - lib/actn/core_ext/kernel.rb
165
+ - lib/actn/core_ext/string.rb
166
+ - lib/actn/db.rb
167
+ - lib/actn/db/mod.rb
168
+ - lib/actn/db/model.rb
169
+ - lib/actn/db/pg.rb
170
+ - lib/actn/db/set.rb
171
+ - lib/actn/db/tasks/db.rake
172
+ - lib/actn/db/version.rb
173
+ - lib/actn/paths.rb
174
+ - test/actn/test_mod.rb
175
+ - test/actn/test_model.rb
176
+ - test/actn/test_pg_funcs.rb
177
+ - test/actn/test_set.rb
178
+ - test/minitest_helper.rb
179
+ homepage: https://github.com/hackberry-gh/actn-db
180
+ licenses:
181
+ - MIT
182
+ metadata: {}
183
+ post_install_message:
184
+ rdoc_options: []
185
+ require_paths:
186
+ - lib
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - '>='
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ required_rubygems_version: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - '>='
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ requirements: []
198
+ rubyforge_project:
199
+ rubygems_version: 2.2.2
200
+ signing_key:
201
+ specification_version: 4
202
+ summary: Actn.io DB
203
+ test_files:
204
+ - test/actn/test_mod.rb
205
+ - test/actn/test_model.rb
206
+ - test/actn/test_pg_funcs.rb
207
+ - test/actn/test_set.rb
208
+ - test/minitest_helper.rb