hquery 1.0.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/CHANGELOG.md +133 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE +21 -0
- data/README.md +700 -0
- data/Rakefile +8 -0
- data/lib/hq/context.rb +65 -0
- data/lib/hq/instance.rb +87 -0
- data/lib/hq/page.rb +33 -0
- data/lib/hq/query.rb +306 -0
- data/lib/hq/relations.rb +134 -0
- data/lib/hq/version.rb +3 -0
- data/lib/hq.rb +91 -0
- data/test.md +1466 -0
- metadata +57 -0
data/lib/hq.rb
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# lib/hq.rb
|
|
3
|
+
|
|
4
|
+
require 'forwardable'
|
|
5
|
+
require 'json'
|
|
6
|
+
require 'date'
|
|
7
|
+
require_relative 'hq/context'
|
|
8
|
+
require_relative 'hq/instance'
|
|
9
|
+
require_relative 'hq/page'
|
|
10
|
+
require_relative 'hq/query'
|
|
11
|
+
require_relative 'hq/relations'
|
|
12
|
+
|
|
13
|
+
module Hq
|
|
14
|
+
class DataFileError < StandardError; end
|
|
15
|
+
class ScopeError < StandardError; end
|
|
16
|
+
class ItemMethodError < StandardError; end
|
|
17
|
+
|
|
18
|
+
class << self
|
|
19
|
+
def configure(data_path: 'data')
|
|
20
|
+
@data_path = data_path
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def load_from(data_dir)
|
|
24
|
+
absolute_dir = File.expand_path(data_dir, Dir.pwd)
|
|
25
|
+
|
|
26
|
+
Dir[File.join(absolute_dir, '**', '*.rb')].sort.each do |file|
|
|
27
|
+
load file # Use load, not require - allows reloading
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def reload_from(data_dir)
|
|
32
|
+
Hq.reload
|
|
33
|
+
load_from(data_dir)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def define(model_name, &block)
|
|
37
|
+
context = DefinitionContext.new(model_name, @data_path || 'data')
|
|
38
|
+
context.instance_eval(&block)
|
|
39
|
+
|
|
40
|
+
@collections ||= {}
|
|
41
|
+
@collections[model_name.to_sym] = {
|
|
42
|
+
data: context.loaded_data,
|
|
43
|
+
scopes: context.scopes,
|
|
44
|
+
relations: context.relations # Make sure this line exists
|
|
45
|
+
}
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def present(model_name, &block)
|
|
49
|
+
presenter_module = Module.new
|
|
50
|
+
presenter_module.module_eval(&block)
|
|
51
|
+
(@presenter_modules ||= {})[model_name.to_sym] = presenter_module
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def presenter_for(model_name)
|
|
55
|
+
(@presenter_modules || {})[model_name.to_sym]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def query(model_name)
|
|
59
|
+
model_name = model_name.to_sym
|
|
60
|
+
collection = @collections[model_name]
|
|
61
|
+
|
|
62
|
+
unless collection
|
|
63
|
+
raise "Collection #{model_name} not defined. Use Hq.define :#{model_name} to define it."
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
Query.new(
|
|
67
|
+
model_name,
|
|
68
|
+
collection[:data],
|
|
69
|
+
collection[:scopes],
|
|
70
|
+
collection[:relations]
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def reload
|
|
75
|
+
@collections = {}
|
|
76
|
+
@presenter_modules = {}
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def defined_models
|
|
80
|
+
(@collections || {}).keys
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def relations_for(model_name)
|
|
84
|
+
(@collections || {}).dig(model_name.to_sym, :relations) || {}
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def hq(model_name)
|
|
90
|
+
Hq.query(model_name)
|
|
91
|
+
end
|