fx 0.3.0 → 0.3.1

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.
@@ -23,6 +23,19 @@ module Fx
23
23
  # config.adapter = Fx::Adapters::Postgres.new
24
24
  # end
25
25
  class Postgres
26
+ # Creates an instance of the F(x) Postgres adapter.
27
+ #
28
+ # This is the default adapter for F(x). Configuring it via
29
+ # {Fx.configure} is not required, but the example below shows how one
30
+ # would explicitly set it.
31
+ #
32
+ # @param [#connection] connectable An object that returns the connection
33
+ # for F(x) to use. Defaults to `ActiveRecord::Base`.
34
+ #
35
+ # @example
36
+ # Fx.configure do |config|
37
+ # config.adapter = Fx::Adapters::Postgres.new
38
+ # end
26
39
  def initialize(connectable = ActiveRecord::Base)
27
40
  @connectable = connectable
28
41
  end
@@ -1,6 +1,8 @@
1
1
  module Fx
2
2
  # @api private
3
3
  class Function
4
+ include Comparable
5
+
4
6
  attr_reader :name, :definition
5
7
  delegate :<=>, to: :name
6
8
 
@@ -36,6 +36,7 @@ module Fx
36
36
  "version or sql_definition must be specified",
37
37
  )
38
38
  end
39
+ sql_definition = sql_definition.strip_heredoc if sql_definition
39
40
  sql_definition ||= Fx::Definition.new(name: name, version: version).to_sql
40
41
 
41
42
  Fx.database.create_function(sql_definition)
@@ -49,8 +50,8 @@ module Fx
49
50
  # the `version` argument to {#create_function}.
50
51
  # @return The database response from executing the drop statement.
51
52
  #
52
- # @example Drop a function, rolling back to version 3 on rollback
53
- # drop_function(:uppercase_users_name, on: :users, revert_to_version: 3)
53
+ # @example Drop a function, rolling back to version 2 on rollback
54
+ # drop_function(:uppercase_users_name, revert_to_version: 2)
54
55
  #
55
56
  def drop_function(name, revert_to_version: nil)
56
57
  Fx.database.drop_function(name)
@@ -93,6 +94,7 @@ module Fx
93
94
  )
94
95
  end
95
96
 
97
+ sql_definition = sql_definition.strip_heredoc if sql_definition
96
98
  sql_definition ||= Fx::Definition.new(
97
99
  name: name,
98
100
  version: version,
@@ -39,6 +39,7 @@ module Fx
39
39
  version = 1
40
40
  end
41
41
 
42
+ sql_definition = sql_definition.strip_heredoc if sql_definition
42
43
  sql_definition ||= Fx::Definition.new(
43
44
  name: name,
44
45
  version: version,
@@ -116,6 +117,7 @@ module Fx
116
117
  raise ArgumentError, "on is required"
117
118
  end
118
119
 
120
+ sql_definition = sql_definition.strip_heredoc if sql_definition
119
121
  sql_definition ||= Fx::Definition.new(
120
122
  name: name,
121
123
  version: version,
@@ -1,6 +1,8 @@
1
1
  module Fx
2
2
  # @api private
3
3
  class Trigger
4
+ include Comparable
5
+
4
6
  attr_reader :name, :definition
5
7
  delegate :<=>, to: :name
6
8
 
@@ -1,4 +1,4 @@
1
1
  module Fx
2
2
  # @api private
3
- VERSION = "0.3.0"
3
+ VERSION = "0.3.1"
4
4
  end
@@ -23,7 +23,8 @@ RSpec.configure do |config|
23
23
  Dir.chdir("spec/dummy") do
24
24
  ActiveRecord::Base.connection.disconnect!
25
25
  system <<-CMD
26
- rake db:drop db:create &&
26
+ echo &&
27
+ rake db:environment:set db:drop db:create &&
27
28
  git add -A &&
28
29
  git reset --hard HEAD 1>/dev/null &&
29
30
  rm -rf .git/ 1>/dev/null
@@ -4,3 +4,10 @@
4
4
  require File.expand_path('../config/application', __FILE__)
5
5
 
6
6
  Rails.application.load_tasks
7
+
8
+ unless Rake::Task.task_defined?('db:environment:set')
9
+ desc 'dummy task for rails versions where this task does not exist'
10
+ task 'db:environment:set' do
11
+ # no-op
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ module Fx
4
+ module Adapters
5
+ describe Postgres::Functions, :db do
6
+ describe ".all" do
7
+ it "returns `Function` objects" do
8
+ connection = ActiveRecord::Base.connection
9
+ connection.execute <<-EOS.strip_heredoc
10
+ CREATE OR REPLACE FUNCTION test()
11
+ RETURNS text AS $$
12
+ BEGIN
13
+ RETURN 'test';
14
+ END;
15
+ $$ LANGUAGE plpgsql;
16
+ EOS
17
+
18
+ functions = Postgres::Functions.new(connection).all
19
+
20
+ first = functions.first
21
+ expect(functions.size).to eq 1
22
+ expect(first.name).to eq "test"
23
+ expect(first.definition).to eq <<-EOS.strip_heredoc
24
+ CREATE OR REPLACE FUNCTION public.test()
25
+ RETURNS text
26
+ LANGUAGE plpgsql
27
+ AS $function$
28
+ BEGIN
29
+ RETURN 'test';
30
+ END;
31
+ $function$
32
+ EOS
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ module Fx
4
+ module Adapters
5
+ describe Postgres::Triggers, :db do
6
+ describe ".all" do
7
+ it "returns `Trigger` objects" do
8
+ connection = ActiveRecord::Base.connection
9
+ connection.execute <<-EOS.strip_heredoc
10
+ CREATE TABLE users (
11
+ id int PRIMARY KEY,
12
+ name varchar(256),
13
+ upper_name varchar(256)
14
+ );
15
+ EOS
16
+ connection.execute <<-EOS.strip_heredoc
17
+ CREATE OR REPLACE FUNCTION uppercase_users_name()
18
+ RETURNS trigger AS $$
19
+ BEGIN
20
+ NEW.upper_name = UPPER(NEW.name);
21
+ RETURN NEW;
22
+ END;
23
+ $$ LANGUAGE plpgsql;
24
+ EOS
25
+ connection.execute <<-EOS.strip_heredoc
26
+ CREATE TRIGGER uppercase_users_name
27
+ BEFORE INSERT ON users
28
+ FOR EACH ROW
29
+ EXECUTE PROCEDURE uppercase_users_name();
30
+ EOS
31
+
32
+ triggers = Postgres::Triggers.new(connection).all
33
+
34
+ first = triggers.first
35
+ expect(triggers.size).to eq 1
36
+ expect(first.name).to eq "uppercase_users_name"
37
+ expect(first.definition).to eq <<-EOS.strip_heredoc.strip
38
+ CREATE TRIGGER uppercase_users_name BEFORE INSERT ON users FOR EACH ROW EXECUTE PROCEDURE uppercase_users_name()
39
+ EOS
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,55 @@
1
+ require "spec_helper"
2
+ require "fx/function"
3
+
4
+ module Fx
5
+ describe Function do
6
+ describe "#<=>" do
7
+ it "delegates to `name`" do
8
+ function_a = Function.new(
9
+ "name" => "name_a",
10
+ "definition" => "some defintion",
11
+ )
12
+ function_b = Function.new(
13
+ "name" => "name_b",
14
+ "definition" => "some defintion",
15
+ )
16
+ function_c = Function.new(
17
+ "name" => "name_c",
18
+ "definition" => "some defintion",
19
+ )
20
+
21
+ expect(function_b).to be_between(function_a, function_c)
22
+ end
23
+ end
24
+
25
+ describe "#==" do
26
+ it "compares `name` and `definition`" do
27
+ function_a = Function.new(
28
+ "name" => "name_a",
29
+ "definition" => "some defintion",
30
+ )
31
+ function_b = Function.new(
32
+ "name" => "name_b",
33
+ "definition" => "some other defintion",
34
+ )
35
+
36
+ expect(function_a).not_to eq(function_b)
37
+ end
38
+ end
39
+
40
+ describe "#to_schema" do
41
+ it "returns a schema compatible version of the function" do
42
+ function = Function.new(
43
+ "name" => "uppercase_users_name",
44
+ "definition" => "CREATE OR REPLACE TRIGGER uppercase_users_name ...",
45
+ )
46
+
47
+ expect(function.to_schema).to eq <<-EOS
48
+ create_function :uppercase_users_name, sql_definition: <<-\SQL
49
+ CREATE OR REPLACE TRIGGER uppercase_users_name ...
50
+ SQL
51
+ EOS
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,55 @@
1
+ require "spec_helper"
2
+ require "fx/trigger"
3
+
4
+ module Fx
5
+ describe Trigger do
6
+ describe "#<=>" do
7
+ it "delegates to `name`" do
8
+ trigger_a = Trigger.new(
9
+ "name" => "name_a",
10
+ "definition" => "some defintion",
11
+ )
12
+ trigger_b = Trigger.new(
13
+ "name" => "name_b",
14
+ "definition" => "some defintion",
15
+ )
16
+ trigger_c = Trigger.new(
17
+ "name" => "name_c",
18
+ "definition" => "some defintion",
19
+ )
20
+
21
+ expect(trigger_b).to be_between(trigger_a, trigger_c)
22
+ end
23
+ end
24
+
25
+ describe "#==" do
26
+ it "compares `name` and `definition`" do
27
+ trigger_a = Trigger.new(
28
+ "name" => "name_a",
29
+ "definition" => "some defintion",
30
+ )
31
+ trigger_b = Trigger.new(
32
+ "name" => "name_b",
33
+ "definition" => "some other defintion",
34
+ )
35
+
36
+ expect(trigger_a).not_to eq(trigger_b)
37
+ end
38
+ end
39
+
40
+ describe "#to_schema" do
41
+ it "returns a schema compatible version of the trigger" do
42
+ trigger = Trigger.new(
43
+ "name" => "uppercase_users_name",
44
+ "definition" => "CREATE TRIGGER uppercase_users_name ...",
45
+ )
46
+
47
+ expect(trigger.to_schema).to eq <<-EOS
48
+ create_trigger :uppercase_users_name, sql_definition: <<-\SQL
49
+ CREATE TRIGGER uppercase_users_name ...
50
+ SQL
51
+ EOS
52
+ end
53
+ end
54
+ end
55
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Teo Ljungberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-18 00:00:00.000000000 Z
11
+ date: 2018-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: appraisal
@@ -188,7 +188,9 @@ extensions: []
188
188
  extra_rdoc_files: []
189
189
  files:
190
190
  - ".gitignore"
191
+ - ".hound.yml"
191
192
  - ".rspec"
193
+ - ".rubocop.yml"
192
194
  - ".ruby-version"
193
195
  - ".travis.yml"
194
196
  - ".yardopts"
@@ -212,6 +214,8 @@ files:
212
214
  - gemfiles/rails42.gemfile.lock
213
215
  - gemfiles/rails50.gemfile
214
216
  - gemfiles/rails50.gemfile.lock
217
+ - gemfiles/rails_edge.gemfile
218
+ - gemfiles/rails_edge.gemfile.lock
215
219
  - lib/fx.rb
216
220
  - lib/fx/adapters/postgres.rb
217
221
  - lib/fx/adapters/postgres/connection.rb
@@ -259,15 +263,19 @@ files:
259
263
  - spec/features/functions/revert_spec.rb
260
264
  - spec/features/triggers/migrations_spec.rb
261
265
  - spec/features/triggers/revert_spec.rb
266
+ - spec/fx/adapters/postgres/functions_spec.rb
267
+ - spec/fx/adapters/postgres/triggers_spec.rb
262
268
  - spec/fx/adapters/postgres_spec.rb
263
269
  - spec/fx/command_recorder/arguments_spec.rb
264
270
  - spec/fx/command_recorder_spec.rb
265
271
  - spec/fx/configuration_spec.rb
266
272
  - spec/fx/definition_spec.rb
273
+ - spec/fx/function_spec.rb
267
274
  - spec/fx/schema_dumper/function_spec.rb
268
275
  - spec/fx/schema_dumper/trigger_spec.rb
269
276
  - spec/fx/statements/function_spec.rb
270
277
  - spec/fx/statements/trigger_spec.rb
278
+ - spec/fx/trigger_spec.rb
271
279
  - spec/generators/fx/function/function_generator_spec.rb
272
280
  - spec/generators/fx/trigger/trigger_generator_spec.rb
273
281
  - spec/spec_helper.rb
@@ -294,7 +302,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
294
302
  version: '0'
295
303
  requirements: []
296
304
  rubyforge_project:
297
- rubygems_version: 2.5.1
305
+ rubygems_version: 2.5.2.1
298
306
  signing_key:
299
307
  specification_version: 4
300
308
  summary: Support for database functions and triggers in Rails migrations
@@ -317,15 +325,19 @@ test_files:
317
325
  - spec/features/functions/revert_spec.rb
318
326
  - spec/features/triggers/migrations_spec.rb
319
327
  - spec/features/triggers/revert_spec.rb
328
+ - spec/fx/adapters/postgres/functions_spec.rb
329
+ - spec/fx/adapters/postgres/triggers_spec.rb
320
330
  - spec/fx/adapters/postgres_spec.rb
321
331
  - spec/fx/command_recorder/arguments_spec.rb
322
332
  - spec/fx/command_recorder_spec.rb
323
333
  - spec/fx/configuration_spec.rb
324
334
  - spec/fx/definition_spec.rb
335
+ - spec/fx/function_spec.rb
325
336
  - spec/fx/schema_dumper/function_spec.rb
326
337
  - spec/fx/schema_dumper/trigger_spec.rb
327
338
  - spec/fx/statements/function_spec.rb
328
339
  - spec/fx/statements/trigger_spec.rb
340
+ - spec/fx/trigger_spec.rb
329
341
  - spec/generators/fx/function/function_generator_spec.rb
330
342
  - spec/generators/fx/trigger/trigger_generator_spec.rb
331
343
  - spec/spec_helper.rb