Remove active_record and save models in-memory

Simple inmemory "database" to be independent from active_record.
This commit is contained in:
Benjamin Neff 2017-04-04 03:15:42 +02:00
parent f8e7b2114f
commit b0f6131527
No known key found for this signature in database
GPG key ID: 971464C3F1A90194
15 changed files with 71 additions and 158 deletions

View file

@ -59,12 +59,4 @@ group :development, :test do
# unit tests
gem "rspec-core", "~> 3.5.1"
gem "rspec-rails", "~> 3.5.1"
# test database
gem "sqlite3", "~> 1.3.11"
end
group :development, :production do
# Logging (only for dummy-app, not for the gem)
gem "logging-rails", "0.5.0"
end

View file

@ -120,12 +120,6 @@ GEM
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
little-plugger (1.1.4)
logging (2.2.0)
little-plugger (~> 1.1)
multi_json (~> 1.10)
logging-rails (0.5.0)
logging (>= 1.8)
loofah (2.0.3)
nokogiri (>= 1.5.9)
lumberjack (1.0.11)
@ -139,7 +133,6 @@ GEM
mime-types-data (3.2016.0521)
mini_portile2 (2.1.0)
minitest (5.10.1)
multi_json (1.12.1)
multi_xml (0.6.0)
multipart-post (2.0.0)
nenv (0.3.0)
@ -265,7 +258,6 @@ GEM
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
sqlite3 (1.3.13)
systemu (2.6.5)
terminal-table (1.7.3)
unicode-display_width (~> 1.1.1)
@ -301,7 +293,6 @@ DEPENDENCIES
guard-rspec
guard-rubocop
json-schema-rspec (= 0.0.4)
logging-rails (= 0.5.0)
nyan-cat-formatter
pronto (= 0.8.2)
pronto-rubocop (= 0.8.0)
@ -317,7 +308,6 @@ DEPENDENCIES
spring
spring-commands-rspec
spring-watcher-listen
sqlite3 (~> 1.3.11)
webmock (~> 2.0)
yard

View file

@ -22,5 +22,5 @@ Bundler::GemHelper.install_tasks name: "diaspora_federation"
Rails.application.load_tasks
task test: %w(spec:prepare spec)
task test: :spec
task default: :test

View file

@ -1,8 +0,0 @@
if defined?(RSpec)
namespace :spec do
task prepare_db: %w(db:create db:test:load)
desc "Prepare for rspec"
task prepare: Rails::VERSION::MAJOR == 5 ? %w(db:environment:set prepare_db) : %w(prepare_db)
end
end

View file

@ -17,26 +17,26 @@ Fabricator(:user, class_name: Person) do
end
Fabricator(:post, class_name: Entity) do
on_init { init_with(entity_type: "Post") }
on_init { init_with("Post") }
author { Fabricate(:person) }
end
Fabricator(:comment, class_name: Entity) do
on_init { init_with(entity_type: "Comment") }
on_init { init_with("Comment") }
author { Fabricate(:person) }
end
Fabricator(:poll, class_name: Entity) do
on_init { init_with(entity_type: "Poll") }
on_init { init_with("Poll") }
author { Fabricate(:person) }
end
Fabricator(:event, class_name: Entity) do
on_init { init_with(entity_type: "Event") }
on_init { init_with("Event") }
author { Fabricate(:person) }
end
Fabricator(:conversation, class_name: Entity) do
on_init { init_with(entity_type: "Conversation") }
on_init { init_with("Conversation") }
author { Fabricate(:person) }
end

View file

@ -54,6 +54,7 @@ module DiasporaFederation
stub_request(:get, "http://localhost:3000/hcard/users/#{alice.guid}")
.to_return(status: 200, body: hcard_html)
expect_callback(:save_person_after_webfinger, kind_of(Entities::Person))
person = Discovery::Discovery.new(account).fetch_and_save
expect(person.guid).to eq(alice.guid)
@ -100,6 +101,7 @@ module DiasporaFederation
stub_request(:get, "http://localhost:3000/hcard/users/#{alice.guid}")
.to_return(status: 200, body: hcard_html)
expect_callback(:save_person_after_webfinger, kind_of(Entities::Person))
person = Discovery::Discovery.new(account).fetch_and_save
expect(person.guid).to eq(alice.guid)
@ -116,6 +118,7 @@ module DiasporaFederation
stub_request(:get, "http://localhost:3000/hcard/users/#{alice.guid}")
.to_return(status: 200, body: hcard_html)
expect_callback(:save_person_after_webfinger, kind_of(Entities::Person))
person = Discovery::Discovery.new(account).fetch_and_save
expect(person.guid).to eq(alice.guid)
@ -215,6 +218,7 @@ HTML
stub_request(:get, "http://localhost:3000/hcard/users/#{alice.guid}")
.to_return(status: 200, body: historic_hcard_html)
expect_callback(:save_person_after_webfinger, kind_of(Entities::Person))
person = Discovery::Discovery.new(account).fetch_and_save
expect(person.guid).to eq(alice.guid)

View file

@ -63,16 +63,10 @@ RSpec.configure do |config|
config.example_status_persistence_file_path = "spec/rspec-persistance.txt"
config.infer_spec_type_from_file_location!
config.render_views
config.expect_with :rspec do |expect_config|
expect_config.syntax = :expect
end
config.use_transactional_fixtures = true
config.filter_run_excluding rails: (Rails::VERSION::MAJOR == 5 ? 4 : 5)
# whitelist codeclimate.com so test coverage can be reported

View file

@ -1,5 +1,23 @@
class Entity < ActiveRecord::Base
include ::Diaspora::Guid
class Entity
attr_accessor :author, :guid
attr_reader :entity_type
belongs_to :author, class_name: "Person"
def initialize(entity_type)
@entity_type = entity_type
@guid = UUID.generate(:compact)
end
def save!
Entity.database[entity_type][guid] = self
end
class << self
def find_by(opts)
database[opts[:entity_type]][opts[:guid]]
end
def database
@database ||= Hash.new({})
end
end
end

View file

@ -1,5 +1,9 @@
class Person < ActiveRecord::Base
include ::Diaspora::Guid
class Person
attr_accessor :diaspora_id, :url, :guid, :serialized_public_key, :serialized_private_key
def initialize
@guid = UUID.generate(:compact)
end
def private_key; OpenSSL::PKey::RSA.new(serialized_private_key) end
def public_key; OpenSSL::PKey::RSA.new(serialized_public_key) end
@ -19,4 +23,20 @@ class Person < ActiveRecord::Base
def full_name; "Dummy User" end
def first_name; "Dummy" end
def last_name; "User" end
def save!
Person.database[:diaspora_id][diaspora_id] = self
Person.database[:guid][guid] = self
end
class << self
def find_by(opts)
return database[:diaspora_id][opts[:diaspora_id]] if opts[:diaspora_id]
database[:guid][opts[:guid]]
end
def database
@database ||= {diaspora_id: {}, guid: {}}
end
end
end

View file

@ -1,6 +1,6 @@
require_relative "boot"
require "rails/all"
require "action_controller/railtie"
Bundler.require(*Rails.groups)
require "diaspora_federation/rails"
@ -20,7 +20,7 @@ module Dummy
# config.i18n.default_locale = :de
# Version of your assets, change this if you want to expire all your assets
config.assets.version = "1.0"
# config.assets.version = "1.0"
# autoload files from test/dummy/lib
config.autoload_once_paths += %W(#{config.root}/lib)

View file

@ -14,27 +14,27 @@ Rails.application.configure do
config.action_controller.perform_caching = false
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
# config.action_mailer.raise_delivery_errors = false
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log
# Raise an error on page load if there are pending migrations.
config.active_record.migration_error = :page_load
# config.active_record.migration_error = :page_load
# Debug mode disables concatenation and preprocessing of assets.
# This option may cause significant delays in view rendering with a large
# number of complex assets.
config.assets.debug = true
# config.assets.debug = true
# Asset digests allow you to set far-future HTTP expiration dates on all assets,
# yet still be able to expire them through the digest params.
config.assets.digest = true
# config.assets.digest = true
# Adds additional error checking when serving assets at runtime.
# Checks for improperly declared sprockets dependencies.
# Raises helpful error messages.
config.assets.raise_runtime_errors = true
# config.assets.raise_runtime_errors = true
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true

View file

@ -25,15 +25,15 @@ Rails.application.configure do
config.serve_static_files = false
# Compress JavaScripts and CSS.
config.assets.js_compressor = :uglifier
# config.assets.js_compressor = :uglifier
# config.assets.css_compressor = :sass
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false
# config.assets.compile = false
# Asset digests allow you to set far-future HTTP expiration dates on all assets,
# yet still be able to expire them through the digest params.
config.assets.digest = true
# config.assets.digest = true
# `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
@ -81,5 +81,5 @@ Rails.application.configure do
config.log_formatter = ::Logger::Formatter.new
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
# config.active_record.dump_schema_after_migration = false
end

View file

@ -34,13 +34,13 @@ Rails.application.configure do
# Tell Action Mailer not to deliver emails to the real world.
# The :test delivery method accumulates sent emails in the
# ActionMailer::Base.deliveries array.
config.action_mailer.delivery_method = :test
# config.action_mailer.delivery_method = :test
# Randomize the order test cases are executed.
config.active_support.test_order = :random
# config.active_support.test_order = :random
# Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr
# config.active_support.deprecation = :stderr
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true

View file

@ -53,20 +53,16 @@ DiasporaFederation.configure do |config|
end
end
on :save_person_after_webfinger do |person|
unless Person.exists?(diaspora_id: person.diaspora_id)
Person.new(diaspora_id: person.diaspora_id, guid: person.guid,
serialized_public_key: person.exported_key, url: person.url).save!
end
on :save_person_after_webfinger do
end
on :fetch_private_key do |diaspora_id|
key = Person.where(diaspora_id: diaspora_id).pluck(:serialized_private_key).first
OpenSSL::PKey::RSA.new(key) unless key.nil?
person = Person.find_by(diaspora_id: diaspora_id)
OpenSSL::PKey::RSA.new(person.serialized_private_key) unless person.nil?
end
on :fetch_public_key do |diaspora_id|
key = Person.where(diaspora_id: diaspora_id).pluck(:serialized_public_key).first
key = Person.find_by(diaspora_id: diaspora_id).serialized_public_key
key = DiasporaFederation::Discovery::Discovery.new(diaspora_id).fetch_and_save.exported_key if key.nil?
OpenSSL::PKey::RSA.new(key) unless key.nil?
end

View file

@ -1,93 +0,0 @@
Logging::Rails.configure do |config|
# Configure the Logging framework with the default log levels
Logging.init %w(debug info warn error fatal)
# Objects will be converted to strings using the :inspect method.
Logging.format_as :inspect
# The default layout used by the appenders.
pattern = "[%d] %-5l PID-%p TID-%t %c: %m\n"
layout = Logging.layouts.pattern(pattern: pattern)
# Setup a color scheme called 'bright' than can be used to add color codes
# to the pattern layout. Color schemes should only be used with appenders
# that write to STDOUT or STDERR; inserting terminal color codes into a file
# is generally considered bad form.
Logging.color_scheme(
"bright",
levels: {
info: :green,
warn: :yellow,
error: :red,
fatal: %i(white on_red)
},
date: :blue,
logger: :cyan,
message: :magenta
)
# Configure an appender that will write log events to STDOUT. A colorized
# pattern layout is used to format the log events into strings before
# writing.
if config.log_to.include? "stdout"
Logging.appenders.stdout(
"stdout",
auto_flushing: true,
layout: Logging.layouts.pattern(
pattern: pattern,
color_scheme: "bright"
)
)
end
# Configure an appender that will write log events to a file. The file will
# be rolled on a daily basis, and the past 7 rolled files will be kept.
# Older files will be deleted. The default pattern layout is used when
# formatting log events into strings.
if config.log_to.include? "file"
Logging.appenders.rolling_file(
"file",
filename: config.paths["log"].first,
keep: 7,
age: "daily",
truncate: false,
auto_flushing: true,
layout: layout
)
end
# Setup the root logger with the Rails log level and the desired set of
# appenders. The list of appenders to use should be set in the environment
# specific configuration file.
#
# For example, in a production application you would not want to log to
# STDOUT, but you would want to send an email for "error" and "fatal"
# messages:
#
# => config/environments/production.rb
#
# config.log_to = %w[file email]
#
# In development you would want to log to STDOUT and possibly to a file:
#
# => config/environments/development.rb
#
# config.log_to = %w[stdout file]
#
Logging.logger.root.appenders = config.log_to unless config.log_to.empty?
# Default log-level (development=debug, production=info)
Logging.logger.root.level = config.log_level
# log-levels for SQL and federation debug-logging
Logging.logger[ActiveRecord::Base].level = :debug
Logging.logger["XMLLogger"].level = :debug
end
module ActiveSupport
module Dependencies
def self.logger=(_)
# This was remove in rails 5: https://github.com/rails/rails/commit/798dc5a92537ba4202a1a8e127a5ebdae87bc78d
end
end
end