vayacondios-server 0.2.11 → 0.3.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.
Files changed (142) hide show
  1. data/.gitignore +3 -1
  2. data/.travis.yml +2 -0
  3. data/Gemfile +15 -9
  4. data/LICENSE.md +2 -6
  5. data/Procfile +1 -1
  6. data/README.md +656 -111
  7. data/Rakefile +89 -6
  8. data/bin/vcd +10 -0
  9. data/bin/vcd-server +8 -0
  10. data/config/database.yml +6 -0
  11. data/config/spec.example.yml +18 -0
  12. data/config/vayacondios.example.yml +15 -0
  13. data/config/vcd-server.rb +37 -0
  14. data/examples/configuration.rb +56 -0
  15. data/examples/event_stream.rb +19 -0
  16. data/examples/simple.rb +61 -0
  17. data/features/event.feature +319 -0
  18. data/features/events.feature +208 -0
  19. data/features/stash.feature +840 -0
  20. data/features/stashes.feature +492 -0
  21. data/features/step_definitions/stash_steps.rb +113 -0
  22. data/features/stream.feature +30 -0
  23. data/features/support/em.rb +14 -0
  24. data/features/support/env.rb +13 -0
  25. data/lib/vayacondios/configuration.rb +63 -0
  26. data/lib/vayacondios/server/api.rb +126 -0
  27. data/lib/vayacondios/server/api_options.rb +56 -0
  28. data/lib/vayacondios/server/configuration.rb +23 -0
  29. data/lib/vayacondios/server/driver.rb +71 -0
  30. data/lib/vayacondios/server/drivers/mongo.rb +126 -0
  31. data/lib/vayacondios/server/handlers/document_handler.rb +81 -0
  32. data/lib/vayacondios/server/handlers/event_handler.rb +31 -26
  33. data/lib/vayacondios/server/handlers/events_handler.rb +31 -0
  34. data/lib/vayacondios/server/handlers/stash_handler.rb +69 -0
  35. data/lib/vayacondios/server/handlers/stashes_handler.rb +49 -0
  36. data/lib/vayacondios/server/handlers/stream_handler.rb +39 -0
  37. data/lib/vayacondios/server/models/document.rb +87 -0
  38. data/lib/vayacondios/server/models/event.rb +198 -0
  39. data/lib/vayacondios/server/models/stash.rb +100 -0
  40. data/lib/vayacondios/server.rb +35 -0
  41. data/lib/vayacondios-server.rb +19 -13
  42. data/lib/vayacondios.rb +22 -0
  43. data/pom.xml +124 -4
  44. data/spec/configuration_spec.rb +41 -0
  45. data/spec/server/api_options_spec.rb +32 -0
  46. data/spec/server/api_spec.rb +279 -0
  47. data/spec/server/configuration_spec.rb +27 -0
  48. data/spec/server/drivers/mongo_spec.rb +107 -0
  49. data/spec/server/handlers/event_handler_spec.rb +62 -0
  50. data/spec/server/handlers/events_handler_spec.rb +51 -0
  51. data/spec/server/handlers/stash_handler_spec.rb +68 -0
  52. data/spec/server/handlers/stashes_handler_spec.rb +50 -0
  53. data/spec/server/handlers/stream_handler_spec.rb +5 -0
  54. data/spec/server/models/document_spec.rb +9 -0
  55. data/spec/server/models/event_spec.rb +185 -0
  56. data/spec/server/models/stash_spec.rb +95 -0
  57. data/spec/spec_helper.rb +23 -3
  58. data/spec/support/database_helper.rb +42 -0
  59. data/spec/support/log_helper.rb +19 -0
  60. data/spec/support/shared_context_for_events.rb +22 -0
  61. data/spec/support/shared_context_for_stashes.rb +24 -0
  62. data/spec/support/shared_examples_for_handlers.rb +32 -0
  63. data/src/main/java/com/infochimps/vayacondios/BaseClient.java +342 -0
  64. data/src/main/java/com/infochimps/vayacondios/HTTPClient.java +426 -0
  65. data/src/main/java/com/infochimps/vayacondios/VayacondiosClient.java +487 -65
  66. data/src/main/java/com/infochimps/vayacondios/test/IntegrationTest.java +3 -0
  67. data/src/test/java/com/infochimps/vayacondios/BaseClientTest.java +50 -0
  68. data/src/test/java/com/infochimps/vayacondios/HTTPClientIT.java +267 -0
  69. data/vayacondios-server.gemspec +9 -9
  70. metadata +127 -122
  71. checksums.yaml +0 -15
  72. data/.rspec +0 -2
  73. data/.yardopts +0 -10
  74. data/Guardfile +0 -41
  75. data/app/http_shim.rb +0 -71
  76. data/bin/vcd.sh +0 -27
  77. data/config/http_shim.rb +0 -43
  78. data/config/vayacondios.example.yaml +0 -7
  79. data/config/vayacondios.yaml +0 -7
  80. data/examples/java/ItemSetTest.java +0 -76
  81. data/lib/tasks/publish.rake +0 -23
  82. data/lib/tasks/spec.rake +0 -11
  83. data/lib/tasks/yard.rake +0 -2
  84. data/lib/vayacondios/client/config.rb +0 -7
  85. data/lib/vayacondios/client/configliere.rb +0 -38
  86. data/lib/vayacondios/client/cube_client.rb +0 -39
  87. data/lib/vayacondios/client/http_client.rb +0 -49
  88. data/lib/vayacondios/client/itemset.rb +0 -130
  89. data/lib/vayacondios/client/legacy_switch.rb +0 -43
  90. data/lib/vayacondios/client/notifier.rb +0 -123
  91. data/lib/vayacondios/client/zabbix_client.rb +0 -148
  92. data/lib/vayacondios/legacy_switch.rb +0 -43
  93. data/lib/vayacondios/server/errors/bad_request.rb +0 -6
  94. data/lib/vayacondios/server/errors/not_found.rb +0 -6
  95. data/lib/vayacondios/server/handlers/config_handler.rb +0 -32
  96. data/lib/vayacondios/server/handlers/itemset_handler.rb +0 -60
  97. data/lib/vayacondios/server/legacy_switch.rb +0 -43
  98. data/lib/vayacondios/server/model/config_document.rb +0 -89
  99. data/lib/vayacondios/server/model/document.rb +0 -25
  100. data/lib/vayacondios/server/model/event_document.rb +0 -94
  101. data/lib/vayacondios/server/model/itemset_document.rb +0 -126
  102. data/lib/vayacondios/server/rack/extract_methods.rb +0 -35
  103. data/lib/vayacondios/server/rack/jsonize.rb +0 -43
  104. data/lib/vayacondios/server/rack/params.rb +0 -50
  105. data/lib/vayacondios/server/rack/path.rb +0 -23
  106. data/lib/vayacondios/server/rack/path_validation.rb +0 -22
  107. data/lib/vayacondios/version.rb +0 -3
  108. data/lib/vayacondios-client.rb +0 -22
  109. data/scripts/hadoop_monitor/configurable.rb +0 -66
  110. data/scripts/hadoop_monitor/hadoop_attempt_scraper.rb +0 -45
  111. data/scripts/hadoop_monitor/hadoop_client.rb +0 -273
  112. data/scripts/hadoop_monitor/hadoop_monitor.rb +0 -101
  113. data/scripts/hadoop_monitor/hadoopable.rb +0 -65
  114. data/scripts/hadoop_monitor/machine_monitor.rb +0 -115
  115. data/scripts/s3_cataloger/buckets +0 -33
  116. data/scripts/s3_cataloger/foreach_bucket +0 -88
  117. data/scripts/s3_cataloger/parse_ls.py +0 -391
  118. data/spec/client/itemset_legacy_spec.rb +0 -55
  119. data/spec/client/itemset_spec.rb +0 -60
  120. data/spec/client/notifier_spec.rb +0 -120
  121. data/spec/server/config_spec.rb +0 -113
  122. data/spec/server/event_spec.rb +0 -103
  123. data/spec/server/itemset_legacy_spec.rb +0 -320
  124. data/spec/server/itemset_spec.rb +0 -317
  125. data/spec/server/rack/extract_methods_spec.rb +0 -60
  126. data/spec/server/rack/path_spec.rb +0 -36
  127. data/spec/server/rack/path_validation_spec.rb +0 -22
  128. data/spec/server/server_spec.rb +0 -20
  129. data/spec/support/mongo_cleaner.rb +0 -32
  130. data/src/main/java/ItemSetTest.java +0 -76
  131. data/src/main/java/com/infochimps/util/CurrentClass.java +0 -26
  132. data/src/main/java/com/infochimps/util/DebugUtil.java +0 -38
  133. data/src/main/java/com/infochimps/util/HttpHelper.java +0 -181
  134. data/src/main/java/com/infochimps/vayacondios/ItemSets.java +0 -373
  135. data/src/main/java/com/infochimps/vayacondios/LinkToVCD.java +0 -18
  136. data/src/main/java/com/infochimps/vayacondios/MemoryVCDShim.java +0 -84
  137. data/src/main/java/com/infochimps/vayacondios/Organization.java +0 -62
  138. data/src/main/java/com/infochimps/vayacondios/PathBuilder.java +0 -13
  139. data/src/main/java/com/infochimps/vayacondios/StandardVCDLink.java +0 -218
  140. data/src/main/java/com/infochimps/vayacondios/VCDIntegrationTest.java +0 -108
  141. data/src/test/java/com/infochimps/vayacondios/TestVayacondiosInMemory.java +0 -78
  142. data/vayacondios-client.gemspec +0 -25
@@ -1,43 +0,0 @@
1
- require 'gorillib/logger/log'
2
-
3
- class Vayacondios
4
- # Are we operating on JSON Hashes (Vayacondios) or on JSON arrays
5
- # (Vayacondios Legacy)? These classes determine which to use.
6
-
7
- class StandardContentsHandler
8
- def wrap_contents(contents) {contents: contents} end
9
- def extract_contents(document) document['contents'] end
10
- def extract_response(document) document['contents'] end
11
- def proper_request(document) true end
12
- end
13
-
14
- class LegacyContentsHandler
15
- def wrap_contents(contents) contents end
16
- def extract_contents(document) document end
17
- def extract_response(document) document end
18
- def proper_request(document) true end
19
- end
20
-
21
- @@legacy_switch = nil
22
-
23
- def self.legacy_switch
24
- if @@legacy_switch.nil?
25
- legacy_mode_on = Settings[:vayacondios][:legacy]
26
- @@legacy_switch = get_legacy_switch(legacy_mode_on)
27
- Log.info("using #{legacy_mode_on ? 'legacy' : 'standard'} mode")
28
- end
29
- @@legacy_switch
30
- end
31
-
32
- def self.force_legacy_mode on
33
- Log.info("forcing #{on ? 'legacy' : 'standard'} mode")
34
- @@legacy_switch = get_legacy_switch on
35
- end
36
-
37
- private
38
-
39
- def self.get_legacy_switch on
40
- (on ? LegacyContentsHandler : StandardContentsHandler).new
41
- end
42
- end
43
-
@@ -1,6 +0,0 @@
1
- class Vayacondios
2
- module Error
3
- class BadRequest < Exception
4
- end
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- class Vayacondios
2
- module Error
3
- class NotFound < Exception
4
- end
5
- end
6
- end
@@ -1,32 +0,0 @@
1
- # Vayacondios::ConfigHandler
2
- #
3
- # This handler will accept requests to update config for an organization. All
4
- # updates will merge with an existing document.
5
-
6
- class Vayacondios
7
-
8
- class ConfigHandler
9
-
10
- def initialize(mongodb)
11
- @mongo = mongodb
12
- end
13
-
14
- def update(document, options={})
15
- raise Vayacondios::Error::BadRequest.new unless options[:topic] && options[:id]
16
- raise Vayacondios::Error::BadRequest.new if /\W/ =~ options[:id]
17
-
18
- existing_document = ConfigDocument.find(@mongo, options)
19
- if existing_document
20
- existing_document.update(document)
21
- else
22
- existing_document = ConfigDocument.create(@mongo, document, options)
23
- end
24
- end
25
-
26
- def self.find(mongodb, options)
27
- existing_document = ConfigDocument.find(mongodb, options)
28
- raise Vayacondios::Error::NotFound.new unless existing_document
29
- existing_document
30
- end
31
- end
32
- end
@@ -1,60 +0,0 @@
1
- # Vayacondios::ItemsetHandler
2
- #
3
- # This handler will accept requests to handle arrays for an organization.
4
- # These arrays can only contain numbers and strings.
5
- # GET requests are idempotent
6
- # POST requests are forbidden
7
- # PUT requests will clobber an existing array
8
- # DELETE requests require an array of objects to remove
9
-
10
- class Vayacondios
11
-
12
- class ItemsetHandler
13
-
14
- def initialize(mongodb)
15
- @mongo = mongodb
16
- end
17
-
18
- def update(document, options={})
19
- validate_options options
20
-
21
- existing_document = ItemsetDocument.find(@mongo, options)
22
- if existing_document
23
- existing_document.update(document)
24
- else
25
- existing_document = ItemsetDocument.create(@mongo, document, options)
26
- end
27
- end
28
-
29
- def patch(document, options={})
30
- validate_options options
31
-
32
- existing_document = ItemsetDocument.find(@mongo, options)
33
- if existing_document
34
- existing_document.patch(document)
35
- else
36
- existing_document = ItemsetDocument.create(@mongo, document, options)
37
- end
38
- end
39
-
40
- def destroy(document, options={})
41
- validate_options options
42
-
43
- existing_document = ItemsetDocument.find(@mongo, options)
44
- existing_document.destroy(document)
45
- end
46
-
47
- def self.find(mongodb, options)
48
- existing_document = ItemsetDocument.find(mongodb, options)
49
- raise Error::NotFound.new unless existing_document
50
- existing_document
51
- end
52
-
53
- protected
54
-
55
- def validate_options(options)
56
- raise Error::BadRequest.new unless options[:topic] && options[:id]
57
- raise Error::BadRequest.new if /\W/ =~ options[:id]
58
- end
59
- end
60
- end
@@ -1,43 +0,0 @@
1
- require 'gorillib/logger/log'
2
-
3
- class Vayacondios
4
- # Are we operating on JSON Hashes (Vayacondios) or on JSON arrays
5
- # (Vayacondios Legacy)? These classes determine which to use.
6
-
7
- class StandardContentsHandler
8
- def wrap_contents(contents) {contents: contents} end
9
- def extract_contents(document) document['contents'] end
10
- def extract_response(document) document['contents'] end
11
- def proper_request(document) true end
12
- end
13
-
14
- class LegacyContentsHandler
15
- def wrap_contents(contents) contents end
16
- def extract_contents(document) document end
17
- def extract_response(document) document end
18
- def proper_request(document) true end
19
- end
20
-
21
- @@legacy_switch = nil
22
-
23
- def self.legacy_switch
24
- if @@legacy_switch.nil?
25
- legacy_mode_on = Settings[:vayacondios][:legacy]
26
- @@legacy_switch = get_legacy_switch(legacy_mode_on)
27
- Log.info("using #{legacy_mode_on ? 'legacy' : 'standard'} mode")
28
- end
29
- @@legacy_switch
30
- end
31
-
32
- def self.force_legacy_mode on
33
- Log.info("forcing #{on ? 'legacy' : 'standard'} mode")
34
- @@legacy_switch = get_legacy_switch on
35
- end
36
-
37
- private
38
-
39
- def self.get_legacy_switch on
40
- (on ? LegacyContentsHandler : StandardContentsHandler).new
41
- end
42
- end
43
-
@@ -1,89 +0,0 @@
1
- require 'vayacondios/server/model/document'
2
-
3
- # The configuration model
4
- #
5
- # Configuration documents are key-value pairs, represented in JSON. A document
6
- # consists of a primary key called the topic (_id in mongodb). It belongs to a
7
- # collection named "#{organization_name}.config"
8
- #
9
- # Note: mongodb is passed in beacuse Goliath makes Thread lookups will not
10
- # work while Goliath is in a streaming context.
11
-
12
- class Vayacondios::ConfigDocument < Vayacondios::Document
13
- attr_reader :organization, :topic, :body, :id
14
-
15
- def initialize(mongodb, options = {})
16
- super options
17
- @mongo = mongodb
18
- options = sanitize_options(options)
19
- @id = options[:id]
20
-
21
- @body = nil
22
- @field = options[:field] ||= options[:id]
23
- @mongo = mongodb
24
-
25
- collection_name = [organization.to_s, 'config'].join('.')
26
- @collection = @mongo.collection(collection_name)
27
- end
28
-
29
- def self.create(mongodb, document, options={})
30
- self.new(mongodb, options).update(document)
31
- end
32
-
33
- def self.find(mongodb, options={})
34
- self.new(mongodb, options).find
35
- end
36
-
37
- def find
38
- result = @collection.find_one({_id: @topic})
39
-
40
- if result.present?
41
- result.delete("_id")
42
- @body = result
43
- # @body = @field.split('.').inject(result){|acc, attr| acc = acc[attr]} if @field.present?
44
- self
45
- else
46
- nil
47
- end
48
- end
49
-
50
- def update(document)
51
- raise Vayacondios::Error::BadRequest.new if !document.is_a?(Hash)
52
-
53
- # Merge ourselves
54
- document = body.deep_merge(document) if body
55
-
56
- fields = document
57
- # fields = {@field => document} if @field.present?
58
-
59
- @body = document
60
- @collection.update({:_id => @topic}, {'$set' => fields}, {upsert: true})
61
-
62
- self
63
- end
64
-
65
- def destroy(document)
66
- super
67
- end
68
-
69
- protected
70
-
71
- def sanitize_options(options)
72
- options = options.symbolize_keys
73
-
74
- topic = options[:topic]
75
-
76
- if (topic.is_a?(Hash) && topic["$oid"].present?)
77
- topic = BSON::ObjectId(topic["$oid"])
78
- elsif topic.is_a?(String)
79
- topic = topic.gsub(/\W/,'')
80
- if topic.to_s.match(/^[a-f0-9]{24}$/)
81
- topic = BSON::ObjectId(topic)
82
- end
83
- end
84
-
85
- field = options[:field].gsub(/\W/, '') if options[:field].present?
86
-
87
- options.merge(topic: topic, field: field)
88
- end
89
- end
@@ -1,25 +0,0 @@
1
- class Vayacondios::Document < Hash
2
- attr_accessor :organization, :topic
3
-
4
- def initialize(options = {})
5
- options = options.symbolize_keys
6
- @organization = options[:organization]
7
- @topic = options[:topic]
8
- end
9
-
10
- def self.create
11
- raise NotImplementedError.new("#{self.name} must be overriden by a subclass.")
12
- end
13
-
14
- def self.update
15
- raise NotImplementedError.new("#{self.name} must be overriden by a subclass.")
16
- end
17
-
18
- def self.find
19
- raise NotImplementedError.new("#{self.name} must be overriden by a subclass.")
20
- end
21
-
22
- def destroy
23
- raise NotImplementedError.new("#{self.name} must be overriden by a subclass.")
24
- end
25
- end
@@ -1,94 +0,0 @@
1
- require 'vayacondios/server/model/document'
2
-
3
- # The event model
4
- #
5
- # Event documents are key-value pairs, represented in JSON. A document
6
- # consists of a primary key called the topic (_id in mongodb). It belongs to a
7
- # collection named "#{organization_name}.#{topic}.events"
8
- #
9
- # Note: mongodb is passed in beacuse Goliath makes Thread lookups will not
10
- # work while Goliath is in a streaming context.
11
-
12
- class Vayacondios::EventDocument < Vayacondios::Document
13
- attr_reader :organization, :topic, :body
14
-
15
- def initialize(mongodb, options = {})
16
- super options
17
- @mongo = mongodb
18
- options = sanitize_options(options)
19
-
20
- @body = nil
21
- @id = format_id(options[:id])
22
- @mongo = mongodb
23
-
24
- collection_name = [organization, topic, 'events'].join('.')
25
- @collection = @mongo.collection(collection_name)
26
- end
27
-
28
- def self.create(mongodb, document, options={})
29
- self.new(mongodb, options).update(document)
30
- end
31
-
32
- def self.find(mongodb, options={})
33
- self.new(mongodb, options).find
34
- end
35
-
36
- def find
37
- result = @collection.find_one({_id: @id})
38
- if result.present?
39
- result.delete("_id")
40
- result['_timestamp'] = result.delete("t")
41
- result.merge! result.delete("d") if result["d"].present?
42
- @body = result
43
- self
44
- else
45
- nil
46
- end
47
- end
48
-
49
- def update(document)
50
- document = to_mongo(document)
51
-
52
- @body = document[:d]
53
- if @id
54
- @collection.update({:_id => @id}, document, {upsert: true})
55
- else
56
- @collection.insert(document)
57
- end
58
-
59
- self
60
- end
61
-
62
- def destroy(document)
63
- super
64
- end
65
-
66
- protected
67
-
68
- def sanitize_options(options)
69
- options = options.symbolize_keys
70
-
71
- topic = options[:topic].gsub(/\W+/, '_')
72
- id = format_id options[:id]
73
-
74
- options.merge!(topic: topic, id: id)
75
- end
76
-
77
- def format_id(id)
78
- if (id.is_a?(Hash) && id["$oid"].present?)
79
- id = BSON::ObjectId(id["$oid"])
80
- else
81
- id = id.to_s.gsub(/\W/,'')
82
- id = BSON::ObjectId(id) if id.match(/^[a-f0-9]{24}$/)
83
- end
84
- id
85
- end
86
-
87
- def to_mongo(document)
88
- {}.tap do |result|
89
- result[:d] = document.dup
90
- result[:_id] = @id if @id
91
- result[:t] = document.delete(:_timestamp) || Time.now
92
- end
93
- end
94
- end
@@ -1,126 +0,0 @@
1
- require 'vayacondios/server/model/document'
2
- require 'vayacondios/server/legacy_switch'
3
-
4
- # The configuration model
5
- #
6
- # Configuration documents are key-value pairs, represented in JSON. A document
7
- # consists of a primary key called the topic (_id in mongodb). It belongs to a
8
- # collection named "#{organization_name}.config"
9
- #
10
- # Note: mongodb is passed in beacuse Goliath makes Thread lookups will not
11
- # work while Goliath is in a streaming context.
12
-
13
- class Vayacondios::ItemsetDocument < Vayacondios::Document
14
- attr_reader :organization, :topic, :id
15
-
16
- def initialize(mongodb, options = {})
17
- super options
18
- @mongo = mongodb
19
- options = sanitize_options(options)
20
- @id = options[:id]
21
-
22
- @body = nil
23
- @mongo = mongodb
24
-
25
- @handler = Vayacondios.legacy_switch
26
-
27
- collection_name = [organization.to_s, topic, 'itemset'].join('.')
28
- @collection = @mongo.collection(collection_name)
29
- end
30
-
31
- def self.create(mongodb, document, options={})
32
- self.new(mongodb, options).update(document)
33
- end
34
-
35
- def self.find(mongodb, options={})
36
- self.new(mongodb, options).find
37
- end
38
-
39
- def body
40
- @handler.wrap_contents(@body)
41
- end
42
-
43
- def find
44
- result = @collection.find_one({_id: @id})
45
-
46
- if result
47
- result.delete("_id")
48
- @body = result["d"]
49
- self
50
- else
51
- nil
52
- end
53
- end
54
-
55
- def update(document)
56
- raise Vayacondios::Error::BadRequest.new unless @handler.proper_request(document)
57
-
58
- @body = extract_contents(document)
59
-
60
-
61
- @collection.update({:_id => @id}, {:_id => @id, 'd' => @body }, {upsert: true})
62
-
63
- self
64
- end
65
-
66
- def patch(document)
67
- raise Vayacondios::Error::BadRequest.new unless @handler.proper_request(document)
68
-
69
- # Merge ourselves
70
- if @body
71
- @body = @body + extract_contents(document)
72
- else
73
- @body = extract_contents(document)
74
- end
75
-
76
- @collection.update({:_id => @id}, {
77
- '$addToSet' => {
78
- 'd' => {
79
- '$each'=> extract_contents(document)
80
- }
81
- }
82
- }, {upsert: true})
83
-
84
- self
85
- end
86
-
87
- def destroy(document)
88
- raise Vayacondios::Error::BadRequest.new unless @handler.proper_request(document)
89
-
90
- @body -= extract_contents(document)
91
-
92
- @collection.update({:_id => @id}, {
93
- '$pullAll' => {
94
- 'd' => extract_contents(document)
95
- }
96
- })
97
-
98
- self
99
- end
100
-
101
- protected
102
-
103
- def extract_contents(document)
104
- puts "doc = #{document}. contents = #{result = @handler.extract_contents(document)}"
105
- result
106
- end
107
-
108
- def sanitize_options(options)
109
- options = options.symbolize_keys
110
-
111
- topic = options[:topic]
112
-
113
- if (topic.is_a?(Hash) && topic["$oid"].present?)
114
- topic = BSON::ObjectId(topic["$oid"])
115
- elsif topic.is_a?(String)
116
- topic = topic.gsub(/\W/,'')
117
- if topic.to_s.match(/^[a-f0-9]{24}$/)
118
- topic = BSON::ObjectId(topic)
119
- end
120
- end
121
-
122
- field = options[:field].gsub(/\W/, '') if options[:field].present?
123
-
124
- options.merge(topic: topic, field: field)
125
- end
126
- end
@@ -1,35 +0,0 @@
1
- class Vayacondios
2
- module Rack
3
- class ExtractMethods
4
- include Goliath::Rack::AsyncMiddleware
5
-
6
- def call(env)
7
- method_name = extract_method(env)
8
- super env.merge(vayacondios_method: method_name)
9
- end
10
-
11
- def extract_method env
12
- return unless env['REQUEST_METHOD']
13
- case env['REQUEST_METHOD'].upcase
14
- when 'PUT' then
15
- if env.has_key? 'HTTP_X_METHOD'
16
- if env['HTTP_X_METHOD'].upcase == 'PATCH'
17
- :patch
18
- elsif env['HTTP_X_METHOD'].upcase == 'DELETE'
19
- :delete
20
- else
21
- :update
22
- end
23
- else
24
- :update
25
- end
26
- when 'GET' then :show
27
- when 'POST' then :create
28
- when 'PATCH' then :patch
29
- when 'DELETE' then :delete
30
- else nil
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,43 +0,0 @@
1
- class Vayacondios
2
- module Rack
3
-
4
- # Sets the `Content-Type` of the request and response to
5
- # `application/json`.
6
- class JSONize
7
- include Goliath::Rack::AsyncMiddleware
8
-
9
- # Sets the `Content-Type` header to `application/json` so
10
- # downstream parameter parsing will work correctly.
11
- #
12
- # @param [Hash] env the request environment
13
- def call(env)
14
- env.logger.debug("Started #{env[Goliath::Request::REQUEST_METHOD]} \"#{env[Goliath::Request::REQUEST_PATH]}\" for #{env[Goliath::Request::REMOTE_ADDR]} as JSON")
15
- env['CONTENT_TYPE'] = 'application/json'
16
- super(env)
17
- end
18
-
19
- # Sets the `Content-Type` header to `application/json` and
20
- # serializes the response body to a JSON string.
21
- #
22
- # Will *not* do this if the request was sent to `/status` which
23
- # is expected to just return the string `OK`.
24
- #
25
- # As per Infomart, the client expects an empty string when there is no body to
26
- # return. This does not conform to proper JSON spec and will be an improper response
27
- # for most other users.
28
- #
29
- # @param [Hash] env the request environment
30
- # @param [Integer] status the HTTP status code of the response
31
- # @param [Hash] headers the HTTP headers of the response
32
- # @param [Object] body the upstream response body
33
- # @return [Array] the response
34
- def post_process(env, status, headers, body)
35
- return [status, headers, body] if env["REQUEST_PATH"] == '/status'
36
- headers['Content-Type'] = 'application/json'
37
- body = body.nil? ? [''] : [MultiJson.encode(body)]
38
- [status, headers, body]
39
- end
40
-
41
- end
42
- end
43
- end
@@ -1,50 +0,0 @@
1
- class Vayacondios
2
- module Rack
3
-
4
- # Parses parameters in the request.
5
- #
6
- # Will parse parameters from the query string as well as from the
7
- # request body.
8
- #
9
- # Rack gets unhappy when the parameters are anything other than a
10
- # Hash but we want clients to be able to send non-Hash-like
11
- # request bodies. To support this case, the request's params are
12
- # stored into the `_document` key of the params, to be fetched
13
- # later by Vayacondios::HttpServer#document.
14
- class Params < Goliath::Rack::Params
15
-
16
- # Parses the parameters of the request.
17
- #
18
- # @param [Hash] env the request environment
19
- def retrieve_params(env)
20
- params = {}
21
- params.merge!(::Rack::Utils.parse_nested_query(env['QUERY_STRING']))
22
-
23
- if env['rack.input']
24
- post_params = ::Rack::Utils::Multipart.parse_multipart(env)
25
- unless post_params
26
- body = env['rack.input'].read
27
- return params if body.empty?
28
- env['rack.input'].rewind
29
-
30
- post_params = case(env['CONTENT_TYPE'])
31
- when Goliath::Rack::URL_ENCODED then
32
- ::Rack::Utils.parse_nested_query(body)
33
- when Goliath::Rack::JSON_ENCODED then
34
- MultiJson.decode(body)
35
- else
36
- {}
37
- end
38
- if post_params.is_a?(Hash)
39
- params.merge!(post_params)
40
- else
41
- params['_document'] = post_params
42
- end
43
- end
44
- end
45
- params
46
- end
47
-
48
- end
49
- end
50
- end
@@ -1,23 +0,0 @@
1
- class Vayacondios
2
- module Rack
3
- class Path
4
- include Goliath::Rack::AsyncMiddleware
5
-
6
- def call(env)
7
- path_params = parse_path(env[Goliath::Request::REQUEST_PATH])
8
- super env.merge(vayacondios_path: path_params)
9
- end
10
-
11
- def parse_path(path)
12
- path_regex = /^\/v1\/(?<organization>[a-z]\w+)\/(?<type>config|event|itemset)(\/(?<topic>\w+)(\/(?<id>(\w+\/?)+))?)?(\/|\.(?<format>json))?$/i
13
- if (match = path_regex.match(path))
14
- {}.tap do |segments|
15
- match.names.each do |segment|
16
- segments[segment.to_sym] = match[segment]
17
- end
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end