knod 0.4.4 → 0.5.2

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: 0aa8c1ca4784eef7af2d7afab95fbf2634afb88c
4
- data.tar.gz: 6450fb88e95343069844311dff084f1aed35e683
3
+ metadata.gz: e2b09d9944cc92075dfcc5bc5b55a264cccfaeba
4
+ data.tar.gz: 10cb27f04c4dd70c79866183b3de3b0515c13d0f
5
5
  SHA512:
6
- metadata.gz: 50e212594ba72892d5bfda8f1f14bf158626f4d1a4c250c89e9e04104e2748f871648e268d41a66a4beb8193ce929f865d74d9b2ba80bf2dc7136aa6609de25a
7
- data.tar.gz: c73274b7ae160a2c71e2001b923a414ceeab91e2359739b2a187ecb120e7849cf4faebecdc26458fb0a892f6ab272bba4fdc5db3bbace40047ea9031f4486f53
6
+ metadata.gz: 1dc82b814c22560847fd189f48d83cd8a39873eb84d4d860267057e33aaedb4d33471ff606343a0d0ea6b3f9e3fb7b0c4063e8004ccc090c534394c5633d31bb
7
+ data.tar.gz: 1e968e34f546090eb583ce3d03458987c6c5c99d9789a4412c5019ed14f8792c20f9f3bddea4a1e1c7660ba714d4fc58e66b3ae0e7dddfc9e33e1f013c2dd78d
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- knod (0.4.4)
4
+ knod (0.5.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -19,7 +19,7 @@ Gem::Specification.new do |gem|
19
19
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
20
  gem.require_paths = ['lib']
21
21
 
22
- gem.required_ruby_version = '>= 1.9.3'
22
+ gem.required_ruby_version = '>= 2.1'
23
23
 
24
24
  gem.add_development_dependency "rake", '~> 10'
25
25
  end
@@ -3,6 +3,7 @@ require 'uri'
3
3
  require 'fileutils'
4
4
  require 'json'
5
5
  require 'knod/request'
6
+ require 'knod/patch_merge'
6
7
  require 'knod/server'
7
8
  require 'knod/version'
8
9
 
@@ -0,0 +1,21 @@
1
+ module HashWithPatchMerge
2
+ refine Hash do
3
+ def patch_merge(other_hash, &block)
4
+ dup.patch_merge!(other_hash, &block)
5
+ end
6
+
7
+ def patch_merge!(other_hash, &block)
8
+ other_hash.each_pair do |k,v|
9
+ tv = self[k]
10
+ if tv.is_a?(Hash) && v.is_a?(Hash)
11
+ self[k] = tv.patch_merge(v, &block)
12
+ else
13
+ self[k] = block && tv ? block.call(k, tv, v) : v
14
+ self.delete(k) if self[k].nil?
15
+ end
16
+ end
17
+ self
18
+ end
19
+ end
20
+ end
21
+
@@ -1,5 +1,6 @@
1
1
  module Knod
2
2
  class Server
3
+ using HashWithPatchMerge
3
4
  attr_reader :server, :socket, :request
4
5
 
5
6
  DEFAULT_PORT = 4444
@@ -63,6 +64,17 @@ module Knod
63
64
  end
64
65
  end
65
66
 
67
+ def do_PATCH
68
+ write_to_path(requested_path) do |path|
69
+ if File.file?(path)
70
+ merged_data = merge_json(File.read(path), request.body)
71
+ File.write(path, merged_data)
72
+ else
73
+ File.write(path, request.body)
74
+ end
75
+ end
76
+ end
77
+
66
78
  def do_POST
67
79
  path = requested_path
68
80
  FileUtils.mkdir_p(path)
@@ -85,6 +97,12 @@ module Knod
85
97
  respond(200, "\"Success\"")
86
98
  end
87
99
 
100
+ def merge_json(file, request_body)
101
+ file = JSON.parse(file)
102
+ request_body = JSON.parse(request_body)
103
+ file.patch_merge(request_body).to_json
104
+ end
105
+
88
106
  def log(message)
89
107
  STDERR.puts message if @logging
90
108
  end
@@ -1,3 +1,3 @@
1
1
  module Knod
2
- VERSION = '0.4.4'
2
+ VERSION = '0.5.2'
3
3
  end
@@ -134,6 +134,38 @@ describe Knod, "a tiny http server" do
134
134
  end
135
135
  end
136
136
 
137
+ describe 'PATCH' do
138
+ let(:directory) {'index'}
139
+ let(:path) {"#{directory}/13.json"}
140
+ let(:existing_data) {{base: 3, nested: {a: 1, c: 3}}}
141
+ let(:patch_data) {{nested: {a: nil, b: 2}}}
142
+
143
+ before do
144
+ FileUtils.mkdir_p(directory)
145
+ File.write(path, existing_data.to_json)
146
+ end
147
+
148
+ it 'creates the file if it does not exist' do
149
+ File.delete(path)
150
+ connection.patch path, patch_data
151
+ File.file?(path).must_equal true
152
+ end
153
+
154
+ it 'responds with 200 on success' do
155
+ response = connection.patch path, patch_data
156
+ response.code.must_equal '200'
157
+ end
158
+
159
+ it 'merges the request data with existing data' do
160
+ connection.patch path, patch_data
161
+ parse_json_file(path).must_equal({:base=>3, :nested=>{:c=>3, :b=>2}})
162
+ end
163
+
164
+ after do
165
+ FileUtils.remove_entry(directory, true)
166
+ end
167
+ end
168
+
137
169
  describe 'error handling' do
138
170
  before do
139
171
  def $knod.do_HEAD
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knod
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Moser
@@ -41,6 +41,7 @@ files:
41
41
  - bin/knod
42
42
  - knod.gemspec
43
43
  - lib/knod.rb
44
+ - lib/knod/patch_merge.rb
44
45
  - lib/knod/request.rb
45
46
  - lib/knod/server.rb
46
47
  - lib/knod/version.rb
@@ -58,7 +59,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
58
59
  requirements:
59
60
  - - ">="
60
61
  - !ruby/object:Gem::Version
61
- version: 1.9.3
62
+ version: '2.1'
62
63
  required_rubygems_version: !ruby/object:Gem::Requirement
63
64
  requirements:
64
65
  - - ">="