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.
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