railz_lite 0.1.1

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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +13 -0
  5. data/CODE_OF_CONDUCT.md +84 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +43 -0
  9. data/Rakefile +12 -0
  10. data/bin/console +15 -0
  11. data/bin/setup +8 -0
  12. data/exe/railz_lite +4 -0
  13. data/exe/railz_lite.rb~ +3 -0
  14. data/lib/railz_lite.rb +10 -0
  15. data/lib/railz_lite/cli.rb +17 -0
  16. data/lib/railz_lite/controllers/controller_base.rb +101 -0
  17. data/lib/railz_lite/controllers/flash.rb +22 -0
  18. data/lib/railz_lite/controllers/router.rb +68 -0
  19. data/lib/railz_lite/controllers/session.rb +30 -0
  20. data/lib/railz_lite/controllers/show_exceptions.rb +56 -0
  21. data/lib/railz_lite/controllers/static.rb +66 -0
  22. data/lib/railz_lite/controllers/templates/rescue.html.erb +53 -0
  23. data/lib/railz_lite/controllers/templates/rescue.html.erb~ +0 -0
  24. data/lib/railz_lite/generators/project.rb +33 -0
  25. data/lib/railz_lite/generators/project.rb~ +33 -0
  26. data/lib/railz_lite/generators/templates/application_controller.rb~ +0 -0
  27. data/lib/railz_lite/generators/templates/routes.rb +0 -0
  28. data/lib/railz_lite/generators/templates/server.rb +27 -0
  29. data/lib/railz_lite/models/associatable.rb +79 -0
  30. data/lib/railz_lite/models/associatable.rb~ +79 -0
  31. data/lib/railz_lite/models/associatable2.rb +35 -0
  32. data/lib/railz_lite/models/associatable2.rb~ +35 -0
  33. data/lib/railz_lite/models/attr_accessor_object.rb +13 -0
  34. data/lib/railz_lite/models/db_connection.rb +60 -0
  35. data/lib/railz_lite/models/searchable.rb +21 -0
  36. data/lib/railz_lite/models/searchable.rb~ +21 -0
  37. data/lib/railz_lite/models/sql_object.rb +109 -0
  38. data/lib/railz_lite/models/validatable.rb +15 -0
  39. data/lib/railz_lite/version.rb +5 -0
  40. data/railz_lite.gemspec +46 -0
  41. metadata +215 -0
@@ -0,0 +1,35 @@
1
+ require_relative 'associatable'
2
+
3
+ module Associatable
4
+ def has_one_through(name, through_name, source_name)
5
+ define_method(name) do
6
+ through_options = self.class.assoc_options[through_name]
7
+ source_options =
8
+ through_options.model_class.assoc_options[source_name]
9
+
10
+ through_table = through_options.table_name
11
+ through_pk = through_options.primary_key
12
+ through_fk = through_options.foreign_key
13
+
14
+ source_table = source_options.table_name
15
+ source_pk = source_options.primary_key
16
+ source_fk = source_options.foreign_key
17
+
18
+ key_val = self.send(through_fk)
19
+ results = DBConnection.execute(<<-SQL, key_val)
20
+ SELECT
21
+ #{source_table}.*
22
+ FROM
23
+ #{through_table}
24
+ JOIN
25
+ #{source_table}
26
+ ON
27
+ #{through_table}.#{source_fk} = #{source_table}.#{source_pk}
28
+ WHERE
29
+ #{through_table}.#{through_pk} = ?
30
+ SQL
31
+
32
+ source_options.model_class.parse_all(results).first
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '03_associatable'
2
+
3
+ module Associatable
4
+ def has_one_through(name, through_name, source_name)
5
+ define_method(name) do
6
+ through_options = self.class.assoc_options[through_name]
7
+ source_options =
8
+ through_options.model_class.assoc_options[source_name]
9
+
10
+ through_table = through_options.table_name
11
+ through_pk = through_options.primary_key
12
+ through_fk = through_options.foreign_key
13
+
14
+ source_table = source_options.table_name
15
+ source_pk = source_options.primary_key
16
+ source_fk = source_options.foreign_key
17
+
18
+ key_val = self.send(through_fk)
19
+ results = DBConnection.execute(<<-SQL, key_val)
20
+ SELECT
21
+ #{source_table}.*
22
+ FROM
23
+ #{through_table}
24
+ JOIN
25
+ #{source_table}
26
+ ON
27
+ #{through_table}.#{source_fk} = #{source_table}.#{source_pk}
28
+ WHERE
29
+ #{through_table}.#{through_pk} = ?
30
+ SQL
31
+
32
+ source_options.model_class.parse_all(results).first
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,13 @@
1
+ class AttrAccessorObject
2
+ def self.my_attr_accessor(*names)
3
+ names.each do |name|
4
+ ivar = "@#{name}"
5
+ define_method(name) do
6
+ instance_variable_get(ivar)
7
+ end
8
+ define_method("#{name}=") do |val|
9
+ instance_variable_set(ivar, val)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,60 @@
1
+ require 'sqlite3'
2
+
3
+ PRINT_QUERIES = ENV['PRINT_QUERIES'] == 'true'
4
+ # https://tomafro.net/2010/01/tip-relative-paths-with-file-expand-path
5
+ ROOT_FOLDER = File.join(File.dirname(__FILE__), '..')
6
+ SQL_FILE = File.join(ROOT_FOLDER, 'app.sql')
7
+ DB_FILE = File.join(ROOT_FOLDER, 'app.db')
8
+
9
+ class DBConnection
10
+ def self.open(db_file_name)
11
+ @db = SQLite3::Database.new(db_file_name)
12
+ @db.results_as_hash = true
13
+ @db.type_translation = true
14
+
15
+ @db
16
+ end
17
+
18
+ def self.reset
19
+ commands = [
20
+ "rm '#{DB_FILE}'",
21
+ "cat '#{SQL_FILE}' | sqlite3 '#{DB_FILE}'"
22
+ ]
23
+
24
+ commands.each { |command| `#{command}` }
25
+ DBConnection.open(DB_FILE)
26
+ end
27
+
28
+ def self.instance
29
+ reset if @db.nil?
30
+
31
+ @db
32
+ end
33
+
34
+ def self.execute(*args)
35
+ print_query(*args)
36
+ instance.execute(*args)
37
+ end
38
+
39
+ def self.execute2(*args)
40
+ print_query(*args)
41
+ instance.execute2(*args)
42
+ end
43
+
44
+ def self.last_insert_row_id
45
+ instance.last_insert_row_id
46
+ end
47
+
48
+ private
49
+
50
+ def self.print_query(query, *interpolation_args)
51
+ return unless PRINT_QUERIES
52
+
53
+ puts '--------------------'
54
+ puts query
55
+ unless interpolation_args.empty?
56
+ puts "interpolate: #{interpolation_args.inspect}"
57
+ end
58
+ puts '--------------------'
59
+ end
60
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'db_connection'
2
+ require_relative 'sql_object'
3
+
4
+ module Searchable
5
+ def where(params)
6
+ where_line = params.keys.map { |attr_name| "#{attr_name} = ?" }.join(" AND ")
7
+ results = DBConnection.execute(<<-SQL, *params.values)
8
+ SELECT
9
+ *
10
+ FROM
11
+ #{self.table_name}
12
+ WHERE
13
+ #{where_line}
14
+ SQL
15
+ results.map { |attrs| self.new(attrs) }
16
+ end
17
+ end
18
+
19
+ class SQLObject
20
+ extend Searchable
21
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'db_connection'
2
+ require_relative '01_sql_object'
3
+
4
+ module Searchable
5
+ def where(params)
6
+ where_line = params.keys.map { |attr_name| "#{attr_name} = ?" }.join(" AND ")
7
+ results = DBConnection.execute(<<-SQL, *params.values)
8
+ SELECT
9
+ *
10
+ FROM
11
+ #{self.table_name}
12
+ WHERE
13
+ #{where_line}
14
+ SQL
15
+ results.map { |attrs| self.new(attrs) }
16
+ end
17
+ end
18
+
19
+ class SQLObject
20
+ extend Searchable
21
+ end
@@ -0,0 +1,109 @@
1
+ require_relative 'db_connection'
2
+ require 'active_support/inflector'
3
+ require 'byebug'
4
+
5
+ module RailzLite
6
+ class SQLObject
7
+ def self.columns
8
+ @columns ||= DBConnection.execute2(<<-SQL)
9
+ SELECT
10
+ *
11
+ FROM
12
+ #{table_name}
13
+ SQL
14
+ @columns.first.map(&:to_sym)
15
+ end
16
+
17
+ def self.finalize!
18
+ columns.each do |name|
19
+ define_method(name) do
20
+ attributes[name]
21
+ end
22
+ define_method("#{name}=") do |val|
23
+ attributes[name] = val
24
+ end
25
+ end
26
+ end
27
+
28
+ def self.table_name=(table_name)
29
+ @table_name = table_name
30
+ end
31
+
32
+ def self.table_name
33
+ @table_name || self.name.tableize
34
+ end
35
+
36
+ def self.all
37
+ results = DBConnection.execute(<<-SQL)
38
+ SELECT
39
+ *
40
+ FROM
41
+ #{table_name}
42
+ SQL
43
+ parse_all(results)
44
+ end
45
+
46
+ def self.parse_all(results)
47
+ results.map { |attrs| self.new(attrs) }
48
+ end
49
+
50
+ def self.find(id)
51
+ target = DBConnection.execute(<<-SQL, id)
52
+ SELECT
53
+ *
54
+ FROM
55
+ #{table_name}
56
+ WHERE
57
+ ID = ?
58
+ SQL
59
+
60
+ return nil if target.empty?
61
+ self.new(target.first)
62
+ end
63
+
64
+ def initialize(params = {})
65
+ params.each do |attr_name, val|
66
+ name_sym = attr_name.to_sym
67
+ raise Exception.new "unknown attribute '#{attr_name}'" unless self.class.columns.include?(name_sym)
68
+ send("#{name_sym}=", val)
69
+ end
70
+ end
71
+
72
+ def attributes
73
+ @attributes ||= {}
74
+ end
75
+
76
+ def attribute_values
77
+ self.class.columns.map { |attr| send(attr) }
78
+ end
79
+
80
+ def insert
81
+ DBConnection.execute(<<-SQL, *attribute_values)
82
+ INSERT INTO
83
+ #{self.class.table_name}(#{self.class.columns.join(',')})
84
+ VALUES
85
+ (#{(["?"] * attribute_values.length).join(',')})
86
+ SQL
87
+ self.id = DBConnection.last_insert_row_id
88
+ end
89
+
90
+ def update
91
+ DBConnection.execute(<<-SQL, *attribute_values, self.id)
92
+ UPDATE
93
+ #{self.class.table_name}
94
+ SET
95
+ #{self.class.columns.map { |attr_name| "#{attr_name}=?"}.join(',')}
96
+ WHERE
97
+ id = ?
98
+ SQL
99
+ end
100
+
101
+ def save
102
+ if self.id.nil?
103
+ insert
104
+ else
105
+ update
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,15 @@
1
+ module Validatable
2
+ class Validator
3
+ def validation_callbacks
4
+ @validation_callbacks ||= []
5
+ end
6
+
7
+ def validate(method_name, *args)
8
+ @validation_callbacks << method_name
9
+ end
10
+
11
+ def save
12
+ @validation_callbacks.each { |method| send(:method) }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailzLite
4
+ VERSION = "0.1.1"
5
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/railz_lite/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "railz_lite"
7
+ spec.version = RailzLite::VERSION
8
+ spec.authors = ["bryan lynch"]
9
+ spec.email = ["bml312@nyu.edu"]
10
+
11
+ spec.summary = "Simple, bare-bones web app template inspired by Rails."
12
+ spec.homepage = "https://github.com/bryanqb07/my_rails"
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
15
+
16
+ spec.metadata["allowed_push_host"] = "https://rubygems.org/"
17
+
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = "https://github.com/bryanqb07/my_rails"
20
+ spec.metadata["changelog_uri"] = "https://github.com/bryanqb07/my_rails"
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
26
+ end
27
+ spec.bindir = "exe"
28
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
30
+
31
+ # Uncomment to register a new dependency of your gem
32
+ spec.add_dependency "rack"
33
+ spec.add_dependency "activesupport"
34
+ spec.add_dependency "puma"
35
+ spec.add_dependency "sqlite3"
36
+ spec.add_dependency "thor"
37
+
38
+
39
+ spec.add_development_dependency "byebug"
40
+ spec.add_development_dependency 'rspec', '~> 3.1.0'
41
+ spec.add_development_dependency "rake", "~> 13.0"
42
+ spec.add_development_dependency "rubocop", "~> 1.7"
43
+
44
+ # For more information and examples about making a new gem, checkout our
45
+ # guide at: https://bundler.io/guides/creating_gem.html
46
+ end
metadata ADDED
@@ -0,0 +1,215 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: railz_lite
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - bryan lynch
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-07-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
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: puma
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
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: 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
+ - !ruby/object:Gem::Dependency
70
+ name: thor
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: byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
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: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 3.1.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 3.1.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '13.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '13.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.7'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.7'
139
+ description:
140
+ email:
141
+ - bml312@nyu.edu
142
+ executables:
143
+ - railz_lite
144
+ - railz_lite.rb~
145
+ extensions: []
146
+ extra_rdoc_files: []
147
+ files:
148
+ - ".gitignore"
149
+ - ".rspec"
150
+ - ".rubocop.yml"
151
+ - CODE_OF_CONDUCT.md
152
+ - Gemfile
153
+ - LICENSE.txt
154
+ - README.md
155
+ - Rakefile
156
+ - bin/console
157
+ - bin/setup
158
+ - exe/railz_lite
159
+ - exe/railz_lite.rb~
160
+ - lib/railz_lite.rb
161
+ - lib/railz_lite/cli.rb
162
+ - lib/railz_lite/controllers/controller_base.rb
163
+ - lib/railz_lite/controllers/flash.rb
164
+ - lib/railz_lite/controllers/router.rb
165
+ - lib/railz_lite/controllers/session.rb
166
+ - lib/railz_lite/controllers/show_exceptions.rb
167
+ - lib/railz_lite/controllers/static.rb
168
+ - lib/railz_lite/controllers/templates/rescue.html.erb
169
+ - lib/railz_lite/controllers/templates/rescue.html.erb~
170
+ - lib/railz_lite/generators/project.rb
171
+ - lib/railz_lite/generators/project.rb~
172
+ - lib/railz_lite/generators/templates/application_controller.rb~
173
+ - lib/railz_lite/generators/templates/routes.rb
174
+ - lib/railz_lite/generators/templates/server.rb
175
+ - lib/railz_lite/models/associatable.rb
176
+ - lib/railz_lite/models/associatable.rb~
177
+ - lib/railz_lite/models/associatable2.rb
178
+ - lib/railz_lite/models/associatable2.rb~
179
+ - lib/railz_lite/models/attr_accessor_object.rb
180
+ - lib/railz_lite/models/db_connection.rb
181
+ - lib/railz_lite/models/searchable.rb
182
+ - lib/railz_lite/models/searchable.rb~
183
+ - lib/railz_lite/models/sql_object.rb
184
+ - lib/railz_lite/models/validatable.rb
185
+ - lib/railz_lite/version.rb
186
+ - railz_lite.gemspec
187
+ homepage: https://github.com/bryanqb07/my_rails
188
+ licenses:
189
+ - MIT
190
+ metadata:
191
+ allowed_push_host: https://rubygems.org/
192
+ homepage_uri: https://github.com/bryanqb07/my_rails
193
+ source_code_uri: https://github.com/bryanqb07/my_rails
194
+ changelog_uri: https://github.com/bryanqb07/my_rails
195
+ post_install_message:
196
+ rdoc_options: []
197
+ require_paths:
198
+ - lib
199
+ required_ruby_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: 2.4.0
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ requirements: []
210
+ rubyforge_project:
211
+ rubygems_version: 2.7.6
212
+ signing_key:
213
+ specification_version: 4
214
+ summary: Simple, bare-bones web app template inspired by Rails.
215
+ test_files: []