Class: Yerba::Collection
- Inherits:
-
Object
- Object
- Yerba::Collection
- Includes:
- Enumerable
- Defined in:
- lib/yerba/collection.rb,
ext/yerba/yerba.c
Class Method Summary collapse
-
.find(*args) ⇒ Object
Collection.find(glob, path, condition: nil, select: nil).
-
.get(pattern, path) ⇒ Object
Collection.get(glob, selector) → [Yerba::Scalar|Map|Sequence, …].
Instance Method Summary collapse
- #apply! ⇒ Object
- #each ⇒ Object
- #find(path, condition: nil, select: nil) ⇒ Object
- #find_by ⇒ Object
- #get(path) ⇒ Object
-
#initialize(glob) ⇒ Collection
constructor
A new instance of Collection.
- #pluck ⇒ Object
- #where ⇒ Object
Constructor Details
#initialize(glob) ⇒ Collection
Returns a new instance of Collection.
7 8 9 |
# File 'lib/yerba/collection.rb', line 7 def initialize(glob) @glob = glob end |
Class Method Details
.find(*args) ⇒ Object
Collection.find(glob, path, condition: nil, select: nil)
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 |
# File 'ext/yerba/yerba.c', line 1002
static VALUE collection_s_find(int argc, VALUE *argv, VALUE self) {
(void)self;
VALUE pattern, path, opts;
rb_scan_args(argc, argv, "2:", &pattern, &path, &opts);
const char *condition = NULL;
const char *select = NULL;
if (!NIL_P(opts)) {
VALUE v_condition = rb_hash_aref(opts, ID2SYM(rb_intern("condition")));
VALUE v_select = rb_hash_aref(opts, ID2SYM(rb_intern("select")));
if (!NIL_P(v_condition)) condition = StringValueCStr(v_condition);
if (!NIL_P(v_select)) select = StringValueCStr(v_select);
}
YerbaTypedList result = yerba_glob_find(StringValueCStr(pattern), StringValueCStr(path), condition, select);
if (!result.json) return rb_ary_new();
VALUE json_string = make_utf8_string(result.json);
yerba_string_free(result.json);
return rb_funcall(rb_path2class("JSON"), rb_intern("parse"), 1, json_string);
}
|
.get(pattern, path) ⇒ Object
Collection.get(glob, selector) → [Yerba::Scalar|Map|Sequence, …]
948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 |
# File 'ext/yerba/yerba.c', line 948
static VALUE collection_s_get(VALUE self, VALUE pattern, VALUE path) {
(void) self;
YerbaTypedList result = yerba_glob_get(StringValueCStr(pattern), StringValueCStr(path));
if (!result.json) return rb_ary_new();
VALUE json_string = make_utf8_string(result.json);
yerba_string_free(result.json);
VALUE items = rb_funcall(rb_path2class("JSON"), rb_intern("parse"), 1, json_string);
long length = RARRAY_LEN(items);
VALUE array = rb_ary_new_capa(length);
for (long i = 0; i < length; i++) {
VALUE item = rb_ary_entry(items, i);
VALUE node_type = rb_hash_aref(item, rb_str_new_cstr("node_type"));
VALUE file_path = rb_hash_aref(item, rb_str_new_cstr("file_path"));
VALUE selector = rb_hash_aref(item, rb_str_new_cstr("selector"));
const char *type_str = NIL_P(node_type) ? "" : StringValueCStr(node_type);
if (NIL_P(selector)) continue;
VALUE line = rb_hash_aref(item, rb_str_new_cstr("line"));
VALUE kwargs = rb_hash_new();
rb_hash_aset(kwargs, ID2SYM(rb_intern("selector")), selector);
if (!NIL_P(file_path)) rb_hash_aset(kwargs, ID2SYM(rb_intern("file_path")), file_path);
if (!NIL_P(line)) rb_hash_aset(kwargs, ID2SYM(rb_intern("line")), line);
if (strcmp(type_str, "scalar") == 0) {
VALUE text = rb_hash_aref(item, rb_str_new_cstr("text"));
if (NIL_P(text)) continue;
int type_value = NUM2INT(rb_hash_aref(item, rb_str_new_cstr("type")));
YerbaTypedValue typed_value;
typed_value.text = (char *)StringValueCStr(text);
typed_value.value_type = (YerbaValueType)type_value;
rb_hash_aset(kwargs, ID2SYM(rb_intern("value")), typed_value_to_ruby(typed_value));
VALUE scalar_args[1] = { kwargs };
rb_ary_push(array, rb_funcallv_kw(rb_path2class("Yerba::Scalar"), rb_intern("from"), 1, scalar_args, RB_PASS_KEYWORDS));
} else {
const char *klass_name = strcmp(type_str, "sequence") == 0 ? "Yerba::Sequence" : "Yerba::Map";
VALUE node_args[1] = { kwargs };
rb_ary_push(array, rb_funcallv_kw(rb_path2class(klass_name), rb_intern("from"), 1, node_args, RB_PASS_KEYWORDS));
}
}
return array;
}
|
Instance Method Details
#apply! ⇒ Object
58 59 60 61 62 63 64 |
# File 'lib/yerba/collection.rb', line 58 def apply! each do |document| yield document document.save! end end |
#each ⇒ Object
11 12 13 |
# File 'lib/yerba/collection.rb', line 11 def each Dir.glob(@glob).each { |path| yield Document.new(path) } end |
#find(path, condition: nil, select: nil) ⇒ Object
19 20 21 |
# File 'lib/yerba/collection.rb', line 19 def find(path, condition: nil, select: nil) self.class.find(@glob, path, condition: condition, select: select) end |
#find_by ⇒ Object
23 24 25 26 27 28 29 30 31 32 |
# File 'lib/yerba/collection.rb', line 23 def find_by(...) each do |document| next unless document.sequence? result = document.root.find_by(...) return result if result end nil end |
#get(path) ⇒ Object
15 16 17 |
# File 'lib/yerba/collection.rb', line 15 def get(path) self.class.get(@glob, path) end |
#pluck ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/yerba/collection.rb', line 46 def pluck(...) results = [] each do |document| next unless document.sequence? results.concat(document.root.pluck(...)) end results end |
#where ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/yerba/collection.rb', line 34 def where(...) results = [] each do |document| next unless document.sequence? results.concat(document.root.where(...).to_a) end results end |