neo4j-core 5.0.10 → 5.1.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,174 +0,0 @@
1
- module Neo4j
2
- module Core
3
- # Stolen from http://as.rubyonrails.org/classes/HashWithIndifferentAccess.html
4
- # We don't want to depend on active support
5
- class HashWithIndifferentAccess < Hash
6
- # Always returns true, so that <tt>Array#extract_options!</tt> finds members of this class.
7
- def extractable_options?
8
- true
9
- end
10
-
11
- def with_indifferent_access
12
- dup
13
- end
14
-
15
- def nested_under_indifferent_access
16
- self
17
- end
18
-
19
- def initialize(constructor = {})
20
- if constructor.is_a?(Hash)
21
- super()
22
- update(constructor)
23
- else
24
- super(constructor)
25
- end
26
- end
27
-
28
- def default(key = nil)
29
- if key.is_a?(Symbol) && include?(key = key.to_s)
30
- self[key]
31
- else
32
- super
33
- end
34
- end
35
-
36
- def self.new_from_hash_copying_default(hash)
37
- new(hash).tap do |new_hash|
38
- new_hash.default = hash.default
39
- end
40
- end
41
-
42
- alias_method :regular_writer, :[]= unless method_defined?(:regular_writer)
43
- alias_method :regular_update, :update unless method_defined?(:regular_update)
44
-
45
- # Assigns a new value to the hash:
46
- #
47
- # hash = HashWithIndifferentAccess.new
48
- # hash[:key] = "value"
49
- #
50
- def []=(key, value)
51
- regular_writer(convert_key(key), convert_value(value))
52
- end
53
-
54
- alias_method :store, :[]=
55
-
56
- # Updates the instantized hash with values from the second:
57
- #
58
- # hash_1 = HashWithIndifferentAccess.new
59
- # hash_1[:key] = "value"
60
- #
61
- # hash_2 = HashWithIndifferentAccess.new
62
- # hash_2[:key] = "New Value!"
63
- #
64
- # hash_1.update(hash_2) # => {"key"=>"New Value!"}
65
- #
66
- def update(other_hash)
67
- if other_hash.is_a? HashWithIndifferentAccess
68
- super(other_hash)
69
- else
70
- other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) }
71
- self
72
- end
73
- end
74
-
75
- alias_method :merge!, :update
76
-
77
- # Checks the hash for a key matching the argument passed in:
78
- #
79
- # hash = HashWithIndifferentAccess.new
80
- # hash["key"] = "value"
81
- # hash.key? :key # => true
82
- # hash.key? "key" # => true
83
- #
84
- def key?(key)
85
- super(convert_key(key))
86
- end
87
-
88
- alias_method :include?, :key?
89
- alias_method :has_key?, :key?
90
- alias_method :member?, :key?
91
-
92
- # Fetches the value for the specified key, same as doing hash[key]
93
- def fetch(key, *extras)
94
- super(convert_key(key), *extras)
95
- end
96
-
97
- # Returns an array of the values at the specified indices:
98
- #
99
- # hash = HashWithIndifferentAccess.new
100
- # hash[:a] = "x"
101
- # hash[:b] = "y"
102
- # hash.values_at("a", "b") # => ["x", "y"]
103
- #
104
- def values_at(*indices)
105
- indices.collect { |key| self[convert_key(key)] }
106
- end
107
-
108
- # Returns an exact copy of the hash.
109
- def dup
110
- self.class.new(self).tap do |new_hash|
111
- new_hash.default = default
112
- end
113
- end
114
-
115
- # Merges the instantized and the specified hashes together, giving precedence to the values from the second hash.
116
- # Does not overwrite the existing hash.
117
- def merge(hash)
118
- dup.update(hash)
119
- end
120
-
121
- # Performs the opposite of merge, with the keys and values from the first hash taking precedence over the second.
122
- # This overloaded definition prevents returning a regular hash, if reverse_merge is called on a <tt>HashWithDifferentAccess</tt>.
123
- def reverse_merge(other_hash)
124
- super self.class.new_from_hash_copying_default(other_hash)
125
- end
126
-
127
- def reverse_merge!(other_hash)
128
- replace(reverse_merge(other_hash))
129
- end
130
-
131
- # Removes a specified key from the hash.
132
- def delete(key)
133
- super(convert_key(key))
134
- end
135
-
136
- def stringify_keys!
137
- self
138
- end
139
-
140
- def stringify_keys
141
- dup
142
- end
143
- # undef :symbolize_keys!
144
- def symbolize_keys
145
- to_hash.symbolize_keys
146
- end
147
-
148
- def to_options!
149
- self
150
- end
151
-
152
- # Convert to a Hash with String keys.
153
- def to_hash
154
- Hash.new(default).merge!(self)
155
- end
156
-
157
- protected
158
-
159
- def convert_key(key)
160
- key.is_a?(Symbol) ? key.to_s : key
161
- end
162
-
163
- def convert_value(value)
164
- if value.is_a? Hash
165
- value # .nested_under_indifferent_access
166
- elsif value.is_a?(Array)
167
- value.dup.replace(value.map { |e| convert_value(e) })
168
- else
169
- value
170
- end
171
- end
172
- end
173
- end
174
- end
@@ -1,14 +0,0 @@
1
- module Neo4j
2
- module Server
3
- class CypherNodeUncommited
4
- def initialize(db, data)
5
- @db = db
6
- @data = data
7
- end
8
-
9
- def [](key)
10
- @data[key]
11
- end
12
- end
13
- end
14
- end
@@ -1,36 +0,0 @@
1
- module Neo4j
2
- module Tasks
3
- module ConfigServer
4
- def config(source_text, port)
5
- s = set_property(source_text, 'org.neo4j.server.webserver.https.enabled', 'false')
6
- set_property(s, 'org.neo4j.server.webserver.port', port)
7
- end
8
-
9
- def set_property(source_text, property, value)
10
- source_text.gsub(/#{property}\s*=\s*(\w+)/, "#{property}=#{value}")
11
- end
12
-
13
- # Toggles the status of Neo4j 2.2's basic auth
14
- def toggle_auth(status, source_text)
15
- status_string = status == :enable ? 'true' : 'false'
16
- %w(dbms.security.authorization_enabled dbms.security.auth_enabled).each do |key|
17
- source_text = set_property(source_text, key, status_string)
18
- end
19
- source_text
20
- end
21
-
22
- # POSTs to an endpoint with the form required to change a Neo4j password
23
- # @param [String] target_address The server address, with protocol and port, against which the form should be POSTed
24
- # @param [String] old_password The existing password for the "neo4j" user account
25
- # @param [String] new_password The new password you want to use. Shocking, isn't it?
26
- # @return [Hash] The response from the server indicating success/failure.
27
- def change_password(target_address, old_password, new_password)
28
- uri = URI.parse("#{target_address}/user/neo4j/password")
29
- response = Net::HTTP.post_form(uri, 'password' => old_password, 'new_password' => new_password)
30
- JSON.parse(response.body)
31
- end
32
-
33
- extend self
34
- end
35
- end
36
- end
@@ -1,258 +0,0 @@
1
- # :nocov:
2
- # borrowed from architect4r
3
- require 'os'
4
- require 'httparty'
5
- require 'zip'
6
- require 'httparty'
7
- require File.expand_path('../config_server', __FILE__)
8
-
9
- namespace :neo4j do
10
- def file_name
11
- OS::Underlying.windows? ? 'neo4j.zip' : 'neo4j-unix.tar.gz'
12
- end
13
-
14
- def download_url(edition)
15
- "http://dist.neo4j.org/neo4j-#{edition}-#{OS::Underlying.windows? ? 'windows.zip' : 'unix.tar.gz'}"
16
- end
17
-
18
- def download_neo4j_unless_exists(edition)
19
- download_neo4j(edition) unless File.exist?(file_name)
20
- end
21
-
22
- def download_neo4j(edition)
23
- success = false
24
-
25
- File.open(file_name, 'wb') do |file|
26
- file << request_url(download_url(edition))
27
- success = true
28
- end
29
-
30
- file_name
31
- ensure
32
- File.delete(file_name) unless success
33
- end
34
-
35
- def request_url(url)
36
- status = HTTParty.head(url).code
37
- fail "#{edition} is not available to download, try a different version" if status < 200 || status >= 300
38
-
39
- HTTParty.get(url)
40
- end
41
-
42
- def get_environment(args)
43
- args[:environment] || 'development'
44
- end
45
-
46
- def install_location(args)
47
- FileUtils.mkdir_p('db/neo4j')
48
- "db/neo4j/#{get_environment(args)}"
49
- end
50
-
51
- def config_location(args)
52
- "#{install_location(args)}/conf/neo4j-server.properties"
53
- end
54
-
55
- def start_server(command, args)
56
- puts "Starting Neo4j #{get_environment(args)}..."
57
- if OS::Underlying.windows?
58
- start_windows_server(command, args)
59
- else
60
- start_starnix_server(command, args)
61
- end
62
- end
63
-
64
- def system_or_fail(command)
65
- system(command) or fail "Unable to run: #{command}" # rubocop:disable Style/AndOr
66
- end
67
-
68
- def start_windows_server(command, args)
69
- if system_or_fail!('reg query "HKU\\S-1-5-19"').size > 0
70
- system_or_fail("#{install_location(args)}/bin/Neo4j.bat #{command}") # start service
71
- else
72
- puts 'Starting Neo4j directly, not as a service.'
73
- system_or_fail("#{install_location(args)}/bin/Neo4j.bat")
74
- end
75
- end
76
-
77
- def start_starnix_server(command, args)
78
- system_or_fail("#{install_location(args)}/bin/neo4j #{command}")
79
- end
80
-
81
- def get_edition(args)
82
- edition_string = args[:edition]
83
-
84
- edition_string.gsub(/-latest$/) do
85
- require 'open-uri'
86
- puts 'Retrieving latest version...'
87
- latest_version = JSON.parse(open('https://api.github.com/repos/neo4j/neo4j/releases/latest').read)['tag_name']
88
- puts "Latest version is: #{latest_version}"
89
- "-#{latest_version}"
90
- end
91
- end
92
-
93
- desc 'Install Neo4j with auth disabled in v2.2+, example neo4j:install[community-latest,development]'
94
- task :install, :edition, :environment do |_, args|
95
- args.with_default_arguments(edition: 'community-latest', environment: 'development')
96
- edition = get_edition(args)
97
- environment = get_environment(args)
98
- puts "Installing Neo4j-#{edition} environment: #{environment}"
99
-
100
- downloaded_file = download_neo4j_unless_exists edition
101
-
102
- if OS::Underlying.windows?
103
- # Extract and move to neo4j directory
104
- unless File.exist?(install_location(args))
105
- Zip::ZipFile.open(downloaded_file) do |zip_file|
106
- zip_file.each do |f|
107
- f_path = File.join('.', f.name)
108
- FileUtils.mkdir_p(File.dirname(f_path))
109
- begin
110
- zip_file.extract(f, f_path) unless File.exist?(f_path)
111
- rescue
112
- puts "#{f.name} failed to extract."
113
- end
114
- end
115
- end
116
- FileUtils.mv "neo4j-#{edition}", install_location(args)
117
- FileUtils.rm downloaded_file
118
- end
119
-
120
- # Install if running with Admin Privileges
121
- if system_or_fail('reg query "HKU\\S-1-5-19"').size > 0
122
- system_or_fail("\"#{install_location(args)}/bin/neo4j install\"")
123
- puts 'Neo4j Installed as a service.'
124
- end
125
-
126
- else
127
- system_or_fail("tar -xvf #{downloaded_file}")
128
- system_or_fail("mv neo4j-#{edition} #{install_location(args)}")
129
- system_or_fail("rm #{downloaded_file}")
130
- puts 'Neo4j Installed in to neo4j directory.'
131
- end
132
- rake_auth_toggle(args, :disable) unless /-2\.0|1\.[0-9]/.match(args[:edition])
133
- puts "Type 'rake neo4j:start' or 'rake neo4j:start[ENVIRONMENT]' to start it\nType 'neo4j:config[ENVIRONMENT,PORT]' for changing server port, (default 7474)"
134
- end
135
-
136
- desc 'Start the Neo4j Server'
137
- task :start, :environment do |_, args|
138
- start_server('start', args)
139
- end
140
-
141
- desc 'Start the Neo4j Server asynchronously'
142
- task :start_no_wait, :environment do |_, args|
143
- start_server('start-no-wait', args)
144
- end
145
-
146
- desc 'Configure Server, e.g. rake neo4j:config[development,8888]'
147
- task :config, :environment, :port do |_, args|
148
- port = args[:port]
149
- fail 'no port given' unless port
150
- puts "Config Neo4j #{get_environment(args)} for port #{port}"
151
- location = config_location(args)
152
- text = File.read(location)
153
- replace = Neo4j::Tasks::ConfigServer.config(text, port)
154
- File.open(location, 'w') { |file| file.puts replace }
155
- end
156
-
157
- def validate_is_system_admin!
158
- return unless OS::Underlying.windows?
159
- return if system_or_fail("reg query \"HKU\\S-1-5-19\"").size > 0
160
-
161
- fail 'You do not have administrative rights to stop the Neo4j Service'
162
- end
163
-
164
- def run_neo4j_command_or_fail!(args, command)
165
- binary = OS::Underlying.windows? ? 'Neo4j.bat' : 'neo4j'
166
-
167
- system_or_fail("#{install_location(args)}/bin/#{binary} #{command}")
168
- end
169
-
170
- desc 'Stop the Neo4j Server'
171
- task :stop, :environment do |_, args|
172
- puts "Stopping Neo4j #{get_environment(args)}..."
173
- validate_is_system_admin!
174
-
175
- run_neo4j_command_or_fail!(args, :stop)
176
- end
177
-
178
- desc 'Get info the Neo4j Server'
179
- task :info, :environment do |_, args|
180
- puts "Info from Neo4j #{get_environment(args)}..."
181
- validate_is_system_admin!
182
-
183
- run_neo4j_command_or_fail!(args, :info)
184
- end
185
-
186
- desc 'Restart the Neo4j Server'
187
- task :restart, :environment do |_, args|
188
- puts "Restarting Neo4j #{get_environment(args)}..."
189
- validate_is_system_admin!
190
-
191
- run_neo4j_command_or_fail!(args, :restart)
192
- end
193
-
194
- desc 'Reset the Neo4j Server'
195
- task :reset_yes_i_am_sure, :environment do |_, args|
196
- validate_is_system_admin!
197
-
198
- run_neo4j_command_or_fail!(args, :stop)
199
-
200
- # Reset the database
201
- FileUtils.rm_rf("#{install_location(args)}/data/graph.db")
202
- FileUtils.mkdir("#{install_location(args)}/data/graph.db")
203
-
204
- # Remove log files
205
- FileUtils.rm_rf("#{install_location(args)}/data/log")
206
- FileUtils.mkdir("#{install_location(args)}/data/log")
207
-
208
- run_neo4j_command_or_fail!(args, :start)
209
- end
210
-
211
- desc 'Neo4j 2.2: Change connection password'
212
- task :change_password do
213
- puts 'This will change the password for a Neo4j server'
214
- puts 'Enter target IP address or host name without protocal and port, press enter for http://localhost:7474'
215
- address = STDIN.gets.chomp
216
- target_address = address.empty? ? 'http://localhost:7474' : address
217
-
218
- puts 'Input current password. Leave blank if this is a fresh installation of Neo4j.'
219
- password = STDIN.gets.chomp
220
- old_password = password.empty? ? 'neo4j' : password
221
-
222
- puts 'Input new password.'
223
- new_password = STDIN.gets.chomp
224
- fail 'A new password is required' if new_password.empty?
225
-
226
- body = Neo4j::Tasks::ConfigServer.change_password(target_address, old_password, new_password)
227
- if body['errors']
228
- puts "An error was returned: #{body['errors'][0]['message']}"
229
- else
230
- puts 'Password changed successfully! Please update your app to use:'
231
- puts 'username: neo4j'
232
- puts "password: #{new_password}"
233
- end
234
- end
235
-
236
- def rake_auth_toggle(args, status)
237
- location = config_location(args)
238
- text = File.read(location)
239
- replace = Neo4j::Tasks::ConfigServer.toggle_auth(status, text)
240
- File.open(location, 'w') { |file| file.puts replace }
241
- end
242
-
243
- def auth_toggle_complete(status)
244
- puts "Neo4j basic authentication #{status}. Restart server to apply."
245
- end
246
-
247
- desc 'Neo4j 2.2: Enable Auth'
248
- task :enable_auth, :environment do |_, args|
249
- rake_auth_toggle(args, :enable)
250
- auth_toggle_complete('enabled')
251
- end
252
-
253
- desc 'Neo4j 2.2: Disable Auth'
254
- task :disable_auth, :environment do |_, args|
255
- rake_auth_toggle(args, :disable)
256
- auth_toggle_complete('disabled')
257
- end
258
- end