msfl 1.2.0 → 1.2.1.dev1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9ef0585bfa75b7826d47d868b90dfbf41db7974
4
- data.tar.gz: efa739290d0c5d8385bcf6c058505d61a3655d42
3
+ metadata.gz: 06a5c190ca1f28269f35a382637758327bb4d601
4
+ data.tar.gz: f0bfb4e6be47d3d69b6b4a568bf70247f30a9fcd
5
5
  SHA512:
6
- metadata.gz: 414df49e29c8205a0e9aa0f1f2cf2d50e7876c730ddbdb2b47e865f42fd7f4734aa5b90002edda0c8dea1a03f4b6d075f4677d36538a168533e976bf19fa49f9
7
- data.tar.gz: 164c713872e391bf2a94a373a852b01ab6b0cea05a41698ea9cec4cf11aebf056dd0f512afe914c31464bb24892e8855898203baa936b2b16827e0a08e281461
6
+ metadata.gz: f55554e68871ad1faf1421d380881229f3ef9092c4d2d37776cb1873e523291cf0915a9a0998b592820738433710f1c8f50fe7a34fa066b597a11575bbc8a6c0
7
+ data.tar.gz: b9c507c62f4dab0cd1312971b7bddc77632c94738e3b0428b36e79fd945d075274360c57bbd75087ca534f9321983ab870943a1b280fa2822173ea2481c5a3b9
@@ -41,6 +41,17 @@ module MSFL
41
41
  MSFL::Datasets::Base.registered_datasets = registered_datasets
42
42
  end
43
43
 
44
+
45
+ # Returns a new instance of the specified dataset.
46
+ #
47
+ # @param dataset_name [Symbol] the name of the dataset to instantiate
48
+ # @return [MSFL::Datasets::Base, Nil] a new instance of the specified dataset, if it can be found, otherwise nil
49
+ def self.dataset_from(dataset_name)
50
+ klass = MSFL::Datasets::Base.registered_datasets[dataset_name]
51
+ dataset = klass.new if klass
52
+ dataset ||= nil
53
+ end
54
+
44
55
  # The descendant class MUST override this method otherwise all field validations will fail
45
56
  #
46
57
  # The method defines an array of symbols, indicating what fields are supported for the Dataset
@@ -50,6 +61,23 @@ module MSFL
50
61
  raise NoMethodError, "Descendants of MSFL::Datasets::Base are required to implement the #fields method"
51
62
  end
52
63
 
64
+ # Returns true if the specified field is valid directly or through a foreign dataset
65
+ #
66
+ # @param field_name [Symbol] the name of the field to check and see if the dataset supports it
67
+ # @return [Bool] true if the field is supported by the dataset
68
+ # @todo write direct test of this
69
+ def has_field?(field_name)
70
+ direct_fields = self.fields
71
+ foreigns.each do |f|
72
+ foreign_dataset = self.class.dataset_from f
73
+ if foreign_dataset
74
+ direct_fields.concat foreign_dataset.fields
75
+ end
76
+ end
77
+ direct_fields.include? field_name
78
+ end
79
+
80
+
53
81
  # The descendant class SHOULD override this method, in future versions of MSFL it is execpted to
54
82
  # become a MUST for descendants to override.
55
83
  #
@@ -73,6 +101,22 @@ module MSFL
73
101
  hash_key_operators
74
102
  end
75
103
 
104
+ # If the dataset supports the operator this method returns true
105
+ #
106
+ # @param operator [Symbol] the operator to check if the dataset supports it
107
+ # @return [Bool] true if the dataset supports the operator
108
+ # @todo write test of this guy
109
+ def has_operator?(operator)
110
+ ops = operators
111
+ foreigns.each do |f|
112
+ foreign_dataset = self.class.dataset_from f
113
+ if foreign_dataset
114
+ ops.concat foreign_dataset.operators
115
+ end
116
+ end
117
+ ops.include? operator
118
+ end
119
+
76
120
  # This method returns the errors argument. The errors argument is unchanged if type conformity validation passes,
77
121
  # otherwise an error is added to errors.
78
122
  #
@@ -12,7 +12,7 @@ module MSFL
12
12
  end
13
13
 
14
14
  def fields
15
- [:make, :model, :year, :value].concat foreigns
15
+ [:make, :model, :year, :value]
16
16
  end
17
17
  end
18
18
  end
@@ -12,7 +12,7 @@ module MSFL
12
12
  end
13
13
 
14
14
  def fields
15
- [:name, :gender, :age].concat foreigns
15
+ [:name, :gender, :age]
16
16
  end
17
17
  end
18
18
  end
data/lib/msfl/sinatra.rb CHANGED
@@ -27,7 +27,7 @@ module MSFL
27
27
  def dataset_from(params)
28
28
  dataset_name = params[:dataset].to_sym unless params[:dataset].nil?
29
29
  dataset_name ||= nil
30
- Datasets::Base.registered_datasets[dataset_name].new if Datasets::Base.registered_datasets.has_key?(dataset_name)
30
+ Datasets::Base.dataset_from dataset_name
31
31
  end
32
32
 
33
33
  # Creates a semantic validator instance that is ready to validate the dataset
@@ -4,7 +4,7 @@ module MSFL
4
4
  module HashKey
5
5
 
6
6
  def valid_hash_key?(key)
7
- valid_hash_keys.include? key
7
+ self.dataset.has_operator?(key) || self.dataset.has_field?(key)
8
8
  end
9
9
 
10
10
  def valid_hash_keys
@@ -30,7 +30,9 @@ module MSFL
30
30
  :gt, # >
31
31
  :gte, # >=
32
32
  :neg, # logical negation
33
-
33
+ :foreign, # Defines a filter on a related item
34
+ :dataset, # A foreign dataset
35
+ :filter, # an explicit filter
34
36
  ]
35
37
  end
36
38
 
@@ -73,10 +73,10 @@ module MSFL
73
73
  # Then make a recursive call to validate on the value so that it and its elements are validated
74
74
  # later I might be able to optimize this by only making the recursive call for Sets and Hashes
75
75
  #
76
- if dataset.operators.include? key
76
+ if dataset.has_operator? key
77
77
  dataset.validate_operator_conforms key, current_field, errors
78
78
  opts[:parent_operator] = key
79
- elsif dataset.fields.include? key
79
+ elsif dataset.has_field? key
80
80
  current_field = key
81
81
  dataset.validate_type_conforms value, current_field, errors
82
82
  dataset.validate_value_conforms value, current_field, errors
data/msfl.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'msfl'
3
- s.version = '1.2.0'
4
- s.date = '2015-05-12'
3
+ s.version = '1.2.1.dev1'
4
+ s.date = '2015-05-20'
5
5
  s.summary = "MSFL in Ruby"
6
6
  s.description = "Serializers, validators, and other tasty goodness for the Mattermark Semantic Filter Language in Ruby."
7
7
  s.authors = ["Courtland Caldwell"]
@@ -1,4 +1,6 @@
1
1
  require 'spec_helper'
2
+ require 'msfl/datasets/car'
3
+ require 'msfl/datasets/person'
2
4
 
3
5
 
4
6
  describe "MSFL::Sinatra" do
@@ -93,5 +95,17 @@ describe "MSFL::Sinatra" do
93
95
  let(:params) { nil }
94
96
 
95
97
  it_behaves_like "an invocation of MSFL::Sinatra.validate"
98
+
99
+ context "when validating a foreign" do
100
+
101
+ context "when the foreign is valid" do
102
+
103
+ let(:params) { { dataset: :car, filter: filter } }
104
+
105
+ let(:filter) { { foreign: { dataset: 'person', filter: { age: { gte: 25 } } } } }
106
+
107
+ it { is_expected.to eq true }
108
+ end
109
+ end
96
110
  end
97
111
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msfl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1.dev1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Courtland Caldwell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-12 00:00:00.000000000 Z
11
+ date: 2015-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -152,9 +152,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
152
  version: '0'
153
153
  required_rubygems_version: !ruby/object:Gem::Requirement
154
154
  requirements:
155
- - - ">="
155
+ - - ">"
156
156
  - !ruby/object:Gem::Version
157
- version: '0'
157
+ version: 1.3.1
158
158
  requirements: []
159
159
  rubyforge_project:
160
160
  rubygems_version: 2.2.2