General
- address "positional parameter of the overridden method, which has a different name and may affect named argument passing" crystal
1.5.0
warning (for full list see MR) - upgrade supported mysql driver version to
0.14.0
- upgrade supported pg driver version to
0.26.0
- add
jsonb
type support for model and migration generators - replace
phoffer/inflector.cr
inflector library withluckyframework/wordsmith
QueryBuilder
Query.count
returnsInt64
instead ofInt32
Query.offset
acceptsInt32
orInt64
as input instead of onlyInt32
#group
,#select
raise anArgumentError
if block returns anything except array#having
,#reorder
,#order
raisesExpressionBuilder
as a block argument#where
accepts hash with string keys as well- added
#find_or_create_by
,#find_or_create_by!
,#find_or_initialize_by
to create/instantiate a record if nothing was found in the DB - added
#find_by
and#find_by!
as a shortcut for.where().first
and.where().first!
Model
- change default
id
attribute type fromInt32
toInt64
- generate a setter method for a
Int64
attribute that calls#to_i64
onInt32
value - in mapping automatically assign
null: true
ifnull
property is missing and field is primary - enhance type coercion on initializing instance from hash
- change return type of
.ids
toArray(Int64)
Model.count
returnsInt64
instead ofInt32
- add support for
JSON::PullParser
attribute class - model class responds to:
#here
,#select
,#from
,#union
,#distinct
,#order
,#group
,#with
,#merge
,#limit
,#offset
,#lock
,#reorder
,#count
,#max
,#min
,#sum
,#avg
,#group_count
,#group_max
,#group_min
,#group_sum
,#group_avg
,#with_relation
,#includes
,#preload
,#eager_load
,#last
,#last!
,#first
,#first!
,#find_by
,#find_by!
,#pluck
,#exists?
,#increment
,#decrement
,#ids
,#find_records_by_sql
,#find_in_batches
,#find_each
,#join
,#right_join
,#left_join
,#lateral_join
- adds
.create
and.create!
that accepts block - fix a bug when password digest wasn't generated when password was set by passing it to a constructor
- add missing STI initialization to constructors accepting a hash or named tuple
- use
Adapter::Base.coerce_database_value
in constructors accepting a hash or named tuple to coerce values for columns that don't have specified converter - Fix the issue of
Jennifer::Model::OptimisticLocking#reset_lock_version
decreasing lock version column when it's not changed
Validation
- add
jennifer.errors.messages.required
message in locale yaml file Jennifer::Model::Errors#add
acceptsString | Symbol | Proc(Translation, String, String)
formessage
argumentvalidates_inclusion
,validates_exclusion
,validates_format
,validates_length
,validates_uniqueness
,validates_presence
,validates_absence
,validates_numericality
,validates_acceptance
&validates_confirmation
validation macros acceptsmessage
option that allows to specify validation message
Relation
belongs_to
relation macro acceptsrequired
option to validate existence of relation on save
View
- model class responds to:
#here
,#select
,#from
,#union
,#distinct
,#order
,#group
,#with
,#merge
,#limit
,#offset
,#lock
,#reorder
,#count
,#max
,#min
,#sum
,#avg
,#group_count
,#group_max
,#group_min
,#group_sum
,#group_avg
,#with_relation
,#includes
,#preload
,#eager_load
,#last
,#last!
,#first
,#first!
,#find_by
,#find_by!
,#pluck
,#exists?
,#increment
,#decrement
,#ids
,#find_records_by_sql
,#find_in_batches
,#find_each
,#join
,#right_join
,#left_join
,#lateral_join
Adapter
- remove
id
column from theversions
table schema - change default
id
column type fromint
tobigint
- add
Base.coerce_database_value
method to provide interface to perform coercing from default database type used to read column to hash to a desired model attribute type
SqlGenerator
- fix invalid SQL generating for
FROM
clause when string value is given for#from
Record
- now calling a
#foo_bar
method on a record that is missing raisesArgumentError
instead ofKeyError
General
- add crystal 1.2.0 support
QueryBuilder
#pluck
accepts splatted named tuple of desired attribute-type pairs and returns array of such tuples as a records#upsert
passes expression builder as a block argument
Model
- add Optimistic locking support via macro
with_optimistic_lock(column_name = lock_version)
updated_at
andcreated_at
fields aren't override on save if have been set manually- add
upsert
class method to insert multiple models while ignoring conflicts on specified unique fields
Adapter
- fix database connection query arguments building
- each adapter includes
RequestMethods
instead of including it by base adapter class - add a new
upsert
overload that allows passing a collection ofJennifer::Model::Base
- fix
insert_on_duplicates
sql generation for postgres adapter if no unique fields given
SqlGenerator
- any
INSERT
,UPDATE
,SELECT
andDELETE
requests uses quoted tables/columns if they are created byQueryBuilder::ExpressionBuilder
(raw SQL is placed as-is) .select_clause
uses specified query attributes to select and fall back to custom fields only if there is no custom attribute to select
Migration
TableBuilder::ChangeTable
now performsDropForeignKey
,DropIndex
&DropReference
before any column manipulation- fix
TableBuilder::ChangeEnum
to use specified adapter to query effected tables
General
- switch to the
crimson-knight/i18n.cr
~> 0.4.1
Migration
- fix
TableBuilder::ChangeTable#drop_reference
dropping column before reference - add
TableBuilder::DropReference
General
- add crystal
>= 1.0.0
support - fix inconsistent method signatures in multiple places
- add
#to_json
to the following structs:PG::Numeric
,PG::Geo::Point
,PG::Geo::Line
,PG::Geo::Circle
,PG::Geo::LineSegment
,PG::Geo::Box
,PG::Geo::Path
,PG::Geo::Polygon
,Char
,Time::Span
,Slice
,UUID
- add
crystal-mysql: 0.13.0
support - add
crystal-pg: 0.23.2
support
QueryBuilder
- add custom
#to_json
to serialize retrieved collection - add
#where
acceptingHash(Symbol, _)
- add
Criteria#equal
andCriteria#not_equal
as original implementation ofCriteria#==
andCriteria#!=
- add
ExpressionBuilder
#and
,#or
and#xor
methods that accepts array of conditions
Model
Authentication#password
returns given unecrypted value- add
Coercer
module with static methods to localize all coercing logic for different types - add
.coercer
method to return object responding to all coercing methods described inCoercer
mapping
generates.coerce_{{attribute}(value : String)
methods for every field to coerce string value toattribute
's typemapping
generates for every non-string attribute with a setter additional#{{attribute}}=(value : String)
setter- allow all build methods (
.new
,.create
and.update
) to receiveHash(String, String)
and coerce values to expected types - add
.column_name
to return all field names - fix
.field_names
from returning child's properties for parent class - add custom
#to_json
- change converter interface to
.from_db(DB::ResultSet, NamedTuple)
,.from_db(DB::ResultSet, NamedTuple)
and.from_hash(Hash, String | Symbol, NamedTuple)
- change all existing converters to support new required interface
- add
BigDecimalConverter(T)
converter - add
Coercer.coerce(String, (BigDecimal?).class)
- add
time_zone_aware
option forTimeZoneConverter
to specify whether field should respect time zone converting logic - add support of date only and time only string formats for
TimeZoneConverter
- add
time_format
,date_time_format
anddate_format
to customize time, date time and date formats respectively - fix a bug where updated_at is not set in the generated sql query from model.save
NumericToFloat64Converter
,BigDecimalConverter
,TimeZoneConverter
#from_hash
accepts string as field valueBigDecimalConverter#from_hash
accepts integer and float values as field value- fix
Errors#inspect
bug using oldUInt64#to_s
signature - introduce
Timestamp
module that now includeswith_timestamps
macro - reworked how
updated_at
andcreated_at
fields are set before save - now they are set explicitly without utilizing callbacks - add
Resource.where
acceptingHash(Symbol, _)
Validation
- change
Validator#validate
abstract interface to#validate(record, **opts)
- update all built-in validators to reflect new
Validator
interface - make
Validator.with_blank_validation
macro to accept arguments to reference record, field name, value and blank value acceptance
Relation
- remove abstract
#condition_clause
&#condition_clause(a)
declarations fromIRelation
View
- add custom
#to_json
Adapter
- remove abstract
#update
declaration fromBase
BaseSQLGenerator#parse_query
convertsTime
arguments to UTC only ifConfig.time_zone_aware_attributes
set totrue
Mysql#read_column
callssuper
if column isn't a tiny intResultParser#read_column
convert time toConfig.local_time_zone
ifConfig.time_zone_aware_attributes
set totrue
or just change time zone to it otherwise
Config
.reset_config
creates new instance instead of executing#initialize
on existing object- add
Config.time_zone_aware_attributes
to specify whether time zone converting logic should be globally disabled
Migration
- add
precision
andscale
options support fordecimal
data type
Record
- add custom
#to_json
- add custom
#inspect
General
- add crystal 0.35.0 support and drop 0.34.0 support
QueryBuilder
- allow arbitrary
Query
instances as nested queries for CTEs - fix failed
nil
assertion when eager load relations sequence with missing intermediate relation records - add
IModelQuery#find(id)
to retrieve record by primary key - add
IModelQuery#find!(id)
to retrieve record by primary key or raiseJennifer::RecordNotFound
exception ModelQuery(T)#to_a
andModelQuery(T)#find_by_sql
ensureT
has loaded actual table field count before making a request
Model
- change model constructor hash argument type from
Hash(String, Jennifer::DBany)
toHash(String, AttrType)
(same forSymbol
keys) CommonMapping#attribute
uses attribute getterCommonMapping#attribute
raisesJennifer::UnknownAttribute
exception if model has no requested attribute andraise_exception = true
- add
CommonMapping#attribute_before_typecast
which returns given attribute in database format using attribute converter - add
Mapping#{{attribute}}_will_change!
to mark{{attribute}}
as changed one #primary
uses getter- any
Mapping.mapping
invocation createsAttrType
alias to represent union ofJennifer::DBAny
and any arbitrary type from fields definition - change
Mapping#update_columns
argument type toHash(String | Symbol, AttrType)
Mapping#update_columns
raisesJennifer::UnknownAttribute
if key-value pairs include unknown attributeMapping#set_attribute
to acceptAttrType
Mapping#set_attribute
raisesJennifer::UnknownAttribute
exception if model has no requested attributeMapping#update_columns
raisesJennifer::UnknownAttribute
if key-value pairs include unknown fieldMapping#arguments_to_insert
andMapping#arguments_to_save
use#attribute_before_typecast
to collect attributes to store in a database#add_{{relation}}
acceptsAttrType
as a hash value type- rename
EnumConverter
toPgEnumConverter
- add
EnumConverter(T)
to convert string to crystal enum - add
JSONSerializableConverter(T)
to convert JSON field to objects ofT
that support.from_json
and#to_json
methods - add
TimeZoneConverter
to convert time attributes from UTC toJennife::Config.local_time_zone
Adapter
- add
DBFormater
as a proposed default logger formatter - change logging - emit
Log::Metadata
withquery
,args
andtime
keys (as new crystal-db does) - fix missing reconnect to database on connection lost
SqlGenerator
- fix a potential compilation issue that appears in certain edge cases for postgres adapter (#329)
Adapter::BaseSQLGenerator
now produces valid SQL when using multiple recursive CTEs (.with(..., true)
) in a single query
Migration
- rename
TableBuilder::DB_OPTIONS
toTableBuilder::DbOptions
Exceptions
- add
Jennifer::UnknownAttribute
to represent case when unknown attribute is tried to be read/written
General
- add Crystal
0.34.0
support - add
Jennifer::Presentable
with abstract methods declarations (#attribute
,#errors
,#human_attribute_name
,#attribute_metadata
,#class_name
)
QueryBuilder
Query#initialize
now acceptAdapter::Base
as a second (optional) argumentOrderItem
is renamed toOrderExpression
to avoid possible name collisions
Model
- fix an issue with rendering
new_record
anddestroyed
system variables by#to_json
Resource.table_prefix
now returns underscored namespace name (if any) by defaultBase
includesJennifer::Presentable
- add
Translation#class_name
method to return underscored class name - add
Mapping#attribute_metadata
to return attribute metadata by it's name - remove
Base::primary_field_type
- Prevent compile time error with models named
Model
orRecord
View
- fix an issue with rendering
new_record
anddestroyed
system variables by#to_json
- remove
Base::primary_field_type
Adapter
- db connection is established on the first request no on adapter initialization
Adapter.adapter_class
raisesBaseException
if no validConfig.adapter
is specified.command_interface
,.create_database
,.drop_database
,.generate_schema
,.load_schema
,.db_connection
,.connection_string
,.database_exists?
now are instance methodsBase#initialize
now exceptsConfig
instance- respect host in
Jennifer::Postgres::CommandInterface#database_exists?
- escape connection URI segments
Config#logger
now isLog
instead ofLogger
- add read/write adapter segregation
- deprecate
.adapter
&.adapter_class
- remove
.query
,.exec
&.scalar
Config
.reset_config
invokes#initialize
instead of creating new instance
Migration
Base#schema_processor
is no more public apiRunner.create
andRunner.drop
now accept optionAdapter::Base
instance- pass
to_table
inTableBuilder::DropForeignKey#process
- fix
TableBuilder::CreateTable#reference
- now it takes into account given SQL type for the foreign key column - add
#add_reference
,#drop_reference
,#add_timestamps
toTableBuilder::CHangeTable
TableBuilder::CHangeTable#drop_index
also accepts single column name- remove deprecated
TableBuilder::CreateTable#index
overrides
Record
#initialize(DB::ResultSet)
is removed
QueryBuilder
- use adapter's
#read_column
inNestedRelationTree
- add
RelationTree#adapter
- fix
Ordering#order(Hash(String | Symbol, String | Symbol))
Adapter
- fix issue with treating
tinyint
mysql field asboolean
- remove
ResultParser#result_to_array
- add
Mysql#read_column
- add
Base.default_max_bind_vars_count
which returns default maximum count of bind variables that can be used inBase#bulk_insert
(default is 32766) Mysql.default_max_bind_vars_count
andPostgres.default_max_bind_vars_count
returns32766
Base#bulk_insert
doesn't do table lock no more- if variables that should be inserted by
Base#bulk_insert
exceedBase.max_bind_vars
all of them are quoted and put into a query - remove
BaseSQLGenerator::ARRAY_ESCAPE
- move
BaseSQLGenerator::ARGUMENT_ESCAPE_STRING
toQuoting
- move
BaseSQLGenerator
.quote
,.escape_string
,.filter_out
toQuoting
- add correct values quoting for
postgres
adapter - add correct values quoting for
mysql
adapter - now logger writes
BEGIN
instead ofTRANSACTION START
,COMMIT
instead ofTRANSACTION COMMIT
andROLLBACK
instead ofTRANSACTION ROLLBACK
on corresponding transaction commands - add
SchemaProcessor::FkEventActions
enum to validateon_delete
andon_update
action values;String | Symbol
still should be used as an argument type everywhere
Config
- add
max_bind_vars_count
property to present maximum allowed count of bind variables to be used in bulk insert operation - add
MigrationFailureHandler
enum to validatemigration_failure_handler_method
value;Symbol | MigrationFailureHandler
should be used as an argument for it - fix
migration_failure_handler_method
config - make it instance property
General
- add crystal
0.31.1
compatibility - add
[email protected]
support - remove
sam
from mandatory dependencies
Model
- fix bug with primary field presence assertion
View
- fix bug with primary field presence assertion
Adapter
- add
date
SQL data type date_time
field type maps totimestamp
SQL data type (postgres only)
Migration
- add
Runner.pending_migration?
to return whether there is pending (not invoked) migration - add
Base.with_transaction
method to disable automatic transaction wrapping around migration methods - add
Base.with_transaction?
to check whether migration is run under a transaction - remove
var_string
field type - remove
blob
field type for postgres - fix wrong explanation message for
TableBuilder::CreateIndex
- add new
TableBuilder::CreateTable#index
signatures (old ones are deprecated):#index(fields : Array(Symbol), type : Symbol | ::Nil = nil, name : String | ::Nil = nil, lengths : Hash(Symbol, Int32) = {} of Symbol => Int32, orders : Hash(Symbol, Symbol) = {} of Symbol => Symbol)
#index(field : Symbol, type : Symbol | ::Nil = nil, name : String | ::Nil = nil, length : Int32 | ::Nil = nil, order : Symbol | ::Nil = nil)
- make default
varchar
length254
(mysql only) - add foreign key ON UPDATE and ON DELETE support
Base#add_foreign_key
acceptson_delete
andon_update
keyword arguments to specify corresponding actionsTableBuilder::ChangeTable#add_foreign_key
acceptson_delete
andon_update
keyword arguments to specify corresponding actionsTableBuilder::CreateTable#reference
acceptson_delete
andon_update
options to specify corresponding actionsTableBuilder::CreateTable#foreign_key
acceptson_delete
andon_update
keyword arguments to specify corresponding actions
General
- upgrade
TechMagister/i18n.cr
dependency to0.3.1
General
- add
crystal-pg
0.18.0 support - add ameba check to CI
- fix bug with not defined
JSON
Model
- Add
EnumConverter
converter for PostgreENUM
field convert - (pg only) field presenting
ENUM
field should explicitly specifyconverter: Jennifer::Model::EnumConverter
Adapter
Postgre
adapter now doesn't register decoders for each ENUM type in#prepare
Config
- add
allow_outdated_pending_migration
configuration to specify whether outdated pending migration should be silently processed or error should be raised
Migration
- extend
Jennifer::Migration::TableBuilder::Base::AllowedTypes
alias withInt64
type.
General
- by default
db:migrate
task outputs information about executed migrations db:create
command doesn't fail if database already exists
QueryBuilder
- remove redundant
Criteria#similar
which is loaded withpostgres
adapter - add
Query#insert
andQuery#upsert
- add
ExpressionBuilder#values
andValues
to reference toVALUES
statement in upsert .find_by_sql
and.to_a
ofModelQuery(T)
useT.new
instead ofT.build
- add
CommonTableExpression
to present SQL CTE - rename
EagerLoading#with
to#with_relation
#last!
and#last
assigns old limit value back after request instead of additional#reverse_order
call- speed up
Query
allocation by making all query part containers nilable - add 2nd argument to
Query#union
setting union to beUNION ALL
- now
Query#with
presents API for registering common table expression - add
Query#merge
Query#where
yields expression builderQuery
's#join
,#right_join
,#left_join
and#lateral_join
yield expression builders of a main query and joined context- add next SQL functions:
count
,sum
,avg
,min
,max
,coalesce
andconcat_ws
SQL functions round
function now accepts second optional argument specifying precisionFunction
's#operands_to_sql
and#operand_sql
now are publicFunction.define
macro acceptscomment
key to specify function class documentation commentFunction.define
macroarity
argument by default is0
(instead of-1
)- add
ExpressionBuilder#cast
- handle an empty array passed to
Criteria#in
- fix missing
LIMIT
in query generated by#first!
- fix result type of
Executables#exists?
query method toBool
(thanks @skloibi) - add
Executables#explain
Model
Base.new
now callsafter_initialize
hooks and supports STIBase.build
now is alias forBase.new
- properties passed to
Mapping.mapping
now is parsed before main mapping macro is executed #append_{{relation_name}}
methods ofRelationDefinition
now use.new
to build a related objectResource::Supportable
alias is removedResource.search_by_sql
is removed in favour ofResource.all.find_by_sql
- fix bug with ignoring of field converter by a STI child
- fix default constructor for STI child - now it is generated if parent model has only
type
field without default value - allow mapping option
column
that defines a custom column name that is mapped to this field (thank @skloibi) Base#table_name
is moved toResource
Mapping
module now can be included by another module with mapping definitionSTIMapping
now doesn't convert result set to hash and use same logic asMapping
- add
:auto
mapping option to specify whether primary key is autoincrementable
Validation
- change
Validations::Uniqueness
to consider field mappings when validating properties (thank @skloibi) - allow passing multiple fields to
.validates_uniqueness
to validate combination uniqueness (thank @skloibi)
View
- introduce
Mapping
instead ofExperimentalMapping
; new mapping heavily reuseModel::Mapping
- allow specification of property aliases via
column
option (cf. Model) (thank @skloibi) - mapping shares same functionality as
Model
's
Adapter
- remove
Base::ArgType
alias - add
Base#upsert
Postgres::Adapter#data_type_exists?
is renamed to#enum_exists?
- fix bug for dropping foreign key for
postgres
adapter - remove
TableBuilderBuilders
- nowMigration::Base
creates commands by its own - speed-up tables column count fetch at application start-up
- Fix result type of
#exists?
query method toBool
forBase
andPostgres
adapters (thanks @skloibi) - add
Base#explain
abstract method and implementations forMysql
andPostgres
Config
- add
verbose_migrations
to hide or show migration details duringdb:migrate
command invocation
SqlGenerator
- add
.insert_on_duplicate
and.values_expression
toBaseSQLGenerator
as abstract methods and implementations toPostgres
andMysql
- now
BaseSQLGenerator.from_clause
accepts 2 arguments (instead of 2..3) accepting table name as 2nd argument - add
BaseSQLGenerator.with_clause
which generates CTE - add
BaseSQLGenerator.explain
Migration
- add
Base#tinyint
(not all adapter support it) - change next
Base
instance method signature:#foreign_key_exists?(from_table, to_table = nil, column = nil, name : String? = nil)
#add_index(table_name : String | Symbol, field : Symbol, type : Symbol? = nil, name : String? = nil, length : Int32? = nil, order : Symbol? = nil)
(same forTableBuilder::CreateTable#index
andTableBuilder::ChangeTable#add_index
)#drop_index(table : String | Symbol, fields : Array(Symbol) = [] of Symbol, name : String? = nil)
(same forTableBuilder::ChangeTable#drop_index
)#drop_foreign_key(to_table : String | Symbol, column = nil, name = nil)
(same forTableBuilder::ChangeTable#drop_foreign_key
)
- add
TableBuilder::CreateTable#column
as alias toTableBuilder::CreateTable#field
- new signature of
TableBuilder::CreateTable#reference
-#reference(name, type : Symbol = :integer, options : Hash(Symbol, AAllowedTypes) = DB_OPTIONS.new)
Record
- for missing fields
BaseException
exception is raised instead ofKeyError
QueryBuilder
#pluck
,#update
,#db_results
,#results
.#each_result_set
and#find_in_batches
ofQuery
respects#none
(returns empty result if it has being called)- remove deprecated
QueryObject
constructor accepting array of options and#params
Model
- fix mapping issue when all
Generic
s are assumed as unions (#208)
Validation
- allow passing multiple fields to
.validates_uniqueness
to validate combination uniqueness
Adapter
Mysql::SchemaProcessor
now respectsfalse
as column default valuePostgres::SchemaProcessor
now respectsfalse
as column default value
Config
- introduce new configuration
pool_size
which setsmax_idle_pool_size = max_pool_size = initial_pool_size
to the given value; getter#pool_size
returns#max_pool_size
postgres
is no more default adapter
Migration
TableBuilder::Base::AllowedTypes
alias includesFloat64
andJSON::Any
General
- bump
sam
to"~> 0.3.0"
- add sam command
generate:model
to generate model and related migration - move all logic regarding file generating to
Jennifer::Generators
space - add
db:seed
task as a placeholder seeding task db:setup
now invokesdb:seed
afterdb:migrate
QueryBuilder
- add
#and
,#or
and#xor
shortcut methods toExpressionBuilder
Criteria#in
now acceptsSQLNode
as well- add
Statement
module with base abstract functionality needed for query string generating ExpressionBuilder#g
and#group
now has no argument type restrictionGrouping#condition
now can be ofStatement
typeQuery
includesStatement
Query#to_sql
now is#as_sql
,#select_args
-#sql_args
Condition
includesStatement
Executables#update
accepts block expectingHash(Symbol, Statement)
to be returnedExecutables#modify
is removed in favor of new#update
method accepting block- now
LogicOperator
is inherited fromSQLNode
#delete
andexists?
ofExecutables
do nothing when#do_nothing?
istrue
- add
Query#do_nothing?
- add
Query.null
which returnsQuery.new.none
Join
acceptsGrouping
forON
condition
Model
- remove
Base.build_params
,Base.parameter_converter
methods - remove
ParameterConverter
class - fix skipping generating default constructor by
Mapping.mapping
when at least one field has default value and all others are nilable stringified_type
option is removed from theCOLUMNS_METADATA
STIMapping#arguments_to_save
&STIMapping#arguments_to_insert
now respect field converterTranslation
model now is includeable module- all class methods of
Translation
are moved toTranslation::ClassMethods
which is automatically extended by target class usingincluded
macro #lookup_ancestors
and#human_attribute_name
methods ofTranslation
are addedErrors#base
now is type ofTranslation
instead ofBase
- add
Base#persisted?
- now attribute-specific rendering for
Resource#inspect
is generated by.mapping
- add polymorphic relation support for
has_one
,has_many
andbelongs_to
relations - add
:nodoc:
for almost all generated relation methods (except#association
) - add missing relation names for criterion in
Relation::Base
methods - add
Relation::IPolymorphicBelongsTo
,Relation::PolymorphicHasMany
andRelation::PolymorphicHasOne
@new_record
,@destroyed
,@errors
, changeset and relation attributes now is ignored byJSON::Serializable
- add
skip_validation
argument toAuthentication.with_authentication
macro to specify whether validation should be added - add generating predicate method
#{{attribute}}?
for boolean attribute - allow
Jennifer::Model::Base#attribute=
to accept not only defined type but alsoJennifer::DBAny
- rename
Base#update_attributes
toBase#set_attributes
Validation
- all validation macros now accept
:if
key; the value may be bothSymbol
name of a method to be called or expression - replace validation logic generated during a macro call with new validators usage:
Validations::Absence
,Validations::Acceptance
,Validations::Confirmation
,Validations::Exclusion
,Validations::Format
,Validations::Inclusion
,Validations::Length
,Validations::Numericality
,Validations::Presence
,Validations::Uniqueness
- remove
Jennifer::Validator
in favour ofJennifer::Valdiations::Validator
- all validators by default implement singleton pattern
- all validation macros are moved to
Jennifer::Validations::Macros
View
- now attribute-specific rendering for
Resource#inspect
is generated by.mapping
- add generating predicate method
#{{attribute}}?
for boolean attribute
Adapter
- fix output stream for postgres schema dump
- remove legacy postgres insert
- add
Adapter#foreign_key_exists?
- add
Mysql::SchameProcessor
- now
Base#schema_processor
is abstract - add
Postgres::SchemaProcessor#rename_table
SchemaProcessor
now is abstract class- all builder methods are moved from
SchemaProcessor
class toTableBuilderBuilders
module - fix syntax in
SchemaProcessor#drop_foreign_key
- all
_query
arguments inBase
methods are renamed toquery
Base.extract_arguments
is removed.delete
,.exists
and.count
ofBaseSQLGenerator
now returns stringPostgres.bulk_insert
is removedTransaction#with_connection
ensure to release connection- all sqlite3 related code are removed
Config
- fix
migration_failure_handler_method
property from being global - add new property
model_files_path
presenting model directory (is used in a scope of model generating) - fix ignoring
skip_dumping_schema_sql
config
SqlGenerator
.select_clause
now doesn't invoke.from_clause
under the hood.lock_clause
adds whitespaces around lock statement automatically
Migration
- remove
Runner.generate
andRunner::MIGRATION_DATE_FORMAT
TableBuilder::CreateTable#reference
triggers#foreign_key
and acceptspolymorphic
bool argument presenting whether additional type column should be added; for polymorphic reference foreign key isn't added
Exceptions
- 'RecordNotFound' from
QueryBuilder::Query#first!
andQueryBuilder::Query#last!
includes detailed parsed query
General
- add
:nodoc:
to all internal constants and generated methods (implementing standard ORM methods) from the macros
QueryBuilder
Query
isn't extended byIfrit
- add
OrderItem
to describe order direction - add
Criteria#order
,Criteria#asc
andCriteria#desc
to createOrderItem
- add
Condition#eql?
to compare with other condition orSQLNode
(returnsfalse
) - add
Criteria#eql?
,Grouping#eql?
,LogicOperator#eql?
- add
Query#order
andQuery#reorder
with acceptingOrderItem
- now
Query#order
with block to expect aOrderItem
- remove
CriteriaContainer
QueryObject
now is an abstract class- changed wording for the
ArgumentError
in#max
,#min
,#sum
,#avg
methods ofAggregation
to "Cannot be used with grouping" - change
Query#from(_from : String | Query)
signature toQuery#from(from : String | Query)
Model
#save
and#update
will returntrue
when is called on an object with no changed fields (all before callbacks are invoked)- next
Base
methods become abstract:.primary_auto_incrementable?
,.build_params
,#destroy
,#arguments_to_save
,#arguments_to_insert
Base#_extract_attributes
andBase#_sti_extract_attributes
become private- all callback invocation methods become protected
- next
Resource
methods become abstract:.primary
,.field_count
,.field_names
,.columns_tuple
,#to_h
,#to_str_h
Resource
isn't extended byIfrit
- regenerate
.build_params
for STI models Scoping.scope(Symbol,QueryObject)
now checks in runtime whetherT
ofJennifer::QueryBuilder::ModelQuery(T)
responds to method named after the scope
View
Base#_after_initialize_callback
becomes protectedBase#_extract_attributes
becomes private
Adapter
- fix custom port not used when accessing the Postgres database
Migration
TableBuilder::Base
isn't extended byIfrit
- rename
TableBuilder::ChangeTable#new_table_rename
getter to#new_table_name
- fix misuse of local variable in
TableBuilder::ChangeTable#rename_table
TableBuilder::ChangeTable#change_column
has next changes:old_name
argument renamed toname
new_name
argument is replaced with option inoptions
arguemnt hash- raise
ArgumentError
if bothtype
andoptions[:sql_type]
arenil
TableBuilder::ChangeTable#change_column
raisesArgumentError
if bothtype
andoptions[:sql_type]
arenil
TableBuilder::CreateTable#field
data_type
argument renamed totype
TableBuilder::CreateTable#timestamps
creates fields withnull: false
by defaultTableBuilder::CreateTable#add_index
is removed in favour of#index
.pending_versions
,.assert_outdated_pending_migrations
and.default_adapter
methods ofRunner
become privateRunner.config
is removed
General
- adds
Time::Span
to supported types
QueryBuilder
- allows listing any
SQLNode
instance in SELECT clause (like raw SQL or functions) - removes redundant
SQLNode#sql_args_count
- adds
SQLNode#filterable?
function which presents if node has filterable SQL parameter - refactors
Condition#sql_arg
- adds
Function
base abstract class for defining custom SQL functions - adds
lower
,upper
,current_timestamp
,current_date
,current_time
,now
,concat
,abs
,ceil
,floor
,round
- adds
Join#filterable?
andQuery#filterable?
- raise
AmbiguousSQL
when%
symbol is found in the raw SQL (except%s
)
Model
- replaces mapping option
numeric_converter
with newconverter
- adds
NumericToFloat64Converter
andJSONConverter
- now
#to_h
and#to_str_h
use field getter methods - remove
puts
fromJSONConverter#from_db
Adapter
- propagate native
DB::Error
instead of wrapping it intoBadQuery
- manually release a connection when an exception occurs under the transaction
Config
- set default
max_pool_size
to 1 and warn about danger of setting differentmax_pool_size
,max_idle_pool_size
andinitial_pool_size
Migration
- adds
Migration::TableBuilder::CreateForeignKey
&Migration::TableBuilder::DropForeignKey
- adds
Migration::Base#add_foreign_key
&Migration::Base#drop_foreign_key
- adds
Migration::TableBuilder::ChangeTable#add_foreign_key
&Migration::TableBuilder::ChangeTable#drop_foreign_key
Exceptions
- add
AmbiguousSQL
- is raised when forbidden%
symbol is used in the raw SQL
General
- adds support of crystal
0.25.0
- removes
time_zone
dependency - removes requiring
"inflector/string"
- adds cloning to
Time::Location
&Time::Location::Zone
- removes
Ifrit.typed_hash
andIfrit.typed_array
usage - presents "mapping types" which allows reusing common type definition
- now
Primary32
andPrimary64
are mapping types (not aliases ofInt32
andInt64
) - removes
accord
dependency
QueryBuilder
- allows nested eager loading in
ModelQuery(T)#eager_load
andModelQuery(T)#include
- all query eager loading methods are extracted to separate module
QueryBuilder::EagerLoading
which is included inQueryBuilder::IModelQuery
Model
- introduces model virtual attributes
- adds
Mapping.build_params
andParameterConverter
class for convertingHash(String, String)
parameters to acceptable by model - allows to specify table prefix
- all relations are stored in
Base::RELATIONS
- fixes building of sti objects using parent class
- adds
Jennifer::Model::Authentication
module with authentication logic - fixes compile time issue with
IRelation
when app has no belongs-to relation defined - fixes bug with reading
Int64
primary key - adds
#inspect
- adds
numeric_converter
mapping option for numeric postgres field - introduces new
Jennifer::Model::Errors
class replacingAccord::ErrorList
which mimics analogic rails one a lot; - moves
Translation::human_error
method functionality to introducedErrors
instance level - now next
Resource
static methods are abstract:actual_table_field_count
,primary_field_name
,build
,all
,superclass
Resource#inspect
returns simplified version (only class name and object id)Resource.all
now is a macro method- fixes
Model::Translation.lookup_ancestors
from breaking at compilation time - now all built-in validations use attribute getter methods instead of variables
View
- removes
ExperimentalMapping#attributes_hash
,ExperimentalMapping.strict_mapping?
Config
local_time_zone
now is aTime::Location
- local time zone is loaded using
Time::Location.local
as default value
SqlGenerator
- replaces
\n
with whitespace character as query part separator
Migration
- now migration version is taken from file name timestamp
Jennifer::Migration::Base.migrations
returns a hash of version number => migration class instead of array of classes
QueryBuilder
- fixes bug with compiling application without defined any model (as a result no
ModelQuery
class is defined as well) - allows to pass SQL arguments to left hand condition statement
- fixes bug with invalid order direction type interpretation (#124)
Adapter
- adds command interface layer for invoking console tool utilities (e.g. for dumping database schema)
- adds docker command interface
Config
- makes
Config
to realize singleton pattern instead of holding all data as class variables - adds flag to skip dumping database schema after running migrations
- fixes connection port definition (#121)
ifrit/core
pact is required- adds
i18n
lib support - adds
time_zone
lib support
QueryBuilder
- now
#destroy
uses#find_each
- adds
#patch
and#patch!
which invokes#update
on each object - introduced
CriteriaContainer
to resolve issue with usingCriteria
object as a key for@order
hash - all
#as_sql
methods now acceptSQLGenerator
class
Model
- added methods
#update
&#update!
which allows to massassign attributes and store object to the db - added support of localization lib (i18n)
- added methods
::human_attribute_name
,::human_error
and::human
to translate model attribute name, error message and model name - added own
#valid?
and#validate!
methods - they performs validation and trigger callbacks each call - added
#invalid?
- doesn't trigger validation and callbacks - moved all validation error messages to yaml file
- now
%validates_with
accepts oly one class and allows to pass extra arguments to validator class %validate_presence_of
is renamed to%validate_presence
- adds new validation macros:
%validate_absence
,%validates_numericality
,%validates_acceptance
and%validates_confirmation
- introduced own validator class
- adds
after_update
/before_update
callbacks - adds
after_commit
/after_rollback
callbacks - reorganizes the way how callback method names are stored
- now
%mapping
automatically guess is it should be sti or common mapping (should be used in places of%sti_mapping
) - removed
#attributes_hash
- any time object is converted to UTC when is stored and to local when is retrieved from db
View
- any time object is converted to local when is retrieved from db
Config
- adds
::local_time_zone_name
method to set application time zone - adds
::local_time_zone
- returns local time zone object
Adapter
- any time object passed as argument is converted from local time to UTC
postgres
adapter now useINSERT
withRETURNING
- now several adapters could be required at the same time
- all schema manipulation methods now in located in the
SchemaProcessor
- All macro methods were rewritten to new 0.24.1 crystal syntax
Adapter
- removed
Jennifer::Adapter::TICKS_PER_MICROSECOND
- fixes
Jennifer::Adapter::Mysql#table_column_count
bug
Model
- add
Primary32
andPrimary64
shortcuts for primary key mapping (view mapping respects this as well) - add
::create!
&::create
with splatted named tuple arguments - now relation retrieveness is updated for any superclass relations as well
- a relation will be retrieved from db for only persisted record
- move
Jennifer::Mode::build
method to%mapping
macro - allow retrieving and building sti records using base class
- fix
#reload
method for sti record - optimize building sti record from hash
QueryBuilder
- fix
Criteria#not
- add
Criteria#ilike
View
- introduce
View::Materialized
superclass for materialized views - add
COLUMNS_METADATA
constant - add
::columns_tuple
which returnsCOLUMNS_METADATA
- remove
::children_classes
- make
after_initialize
callback respect inheritance - add
::adapter
Exceptions
- add
AbstractMethod
exception which presents expectation of overriding current method by parents (is useful when method can't be real abstract one) - add
UnknownSTIType
SqlGenerator
- rename
#trancate
to#truncate
Migration
- rename
TableBuilder::DropIndex
toTableBuilder::DropIndex
- remove printing out redundant execution information during db drop and create
- remove
Migration::Base::TABLE_NAME
constant - allow to pass
QueryBuilder::Query
as source to theCreateMaterializedView
(postgres only)
Model
- move
Base#build
method without arguments toMapping
module under the%mapping
- added
validates_presence_of
validation macros - fixed callback invocation from parent classes
- add
allow_blank
key tovalidates_inclusion
,validates_exclusion
,validates_format
- add
ValidationMessages
module which includes methods generating validation error messages - add
Primary32
andPrimary64
shortcuts forInt32
andInt64
primary field declarations for model and view - allow use nil usions instead of
null: true
named tuple option
QueryBuilder
#count
method is moved fromExecutables
module to theAggregations
one- changed method signature of
#find_in_batches
- add
#find_each
- works same way as#find_in_batches
but yields each record instead of array - add
#ordered?
method toOrdering
module - switch
Criteria#hash
to useobject_id
as seed - add
Query#eql?
- add
Query#clone
and all related methods - add
Query#except
- creates clone except given clauses - make
IModelQuery
class as new superclass ofModelQuery(T)
; move all methods no depending onT
to the new class
Config
- added
port
configuration ::reset_config
resets to default configurations- added validation for adapter and db
::from_uri
allows to load configuration from uri
Adapter
- added
#query_array
method to request array of arrays of given type - added
#with_table_lock
which allows to lock table (mysql and postgres have different behaviors)
Query
- added
all
andany
statements - refactored logical operators - now they don't group themselves with "()"
- added
ExpressionBuilder#g
(ExpressionBuilder#grouping
) to group some condition - added
XOR
- moved all executable methods to
Executables
module - change behavior of
#distinct
- now it accepts no arguments and just prependDISTINCT
to common select query - added
#find_in_batches
- allows to search over requested collection required only determined amount of records per iteration #find_records_by_sql
- returns array ofRecord
by given SQL string- added
:full_outer
join type - added
#lateral_join
to makeLATERAL JOIN
(for now is supported only by PostgreSQL) - extracted all join methods to
Joining
module - extracted all ordering methods to
Ordering
module - added
#reorder
method allowing to reorder existing query
ModelQuery
- added
#find_by_sql
similar toQuery#find_records_by_sql
Model
- added
::with_table_lock
- added
::adapter
- added
::import
to perform one query import - fixed bug with reloading empty relations
Mapping
- added
inverse_of
option tohas_many
andhas_one
relations to sets owner during relation loading
Exception
BadQuery
now allows to append query body to the main error text
Adapter
- added
#view_exists?(name)
QueryBuilder
-
now
#eager_load
behaves as old variant of#includes
- via joining relations and adding them to theSELECT
statement (breaking changes) -
added
#preload
method which allows to load all listed relations after execution of main request -
new behavior of
#includes
is same as#preload
(breaking changes) -
added
Jennifer::QueryBuilder::QueryObject
which designed to be as a abstract class for query objects forModel::Base
scopes (will be renamed in futher releases) -
all query related objects are clonable
-
now
GROUP
clause is placed right after theWHERE
clause -
aggregation methods is moved to
Jennifer::QueryBuilder::Aggregations
module which is included in theQuery
class -
Query#select
now acceptsCriteria
object,Symbol
(which now will be transformed to correspondingCriteria
), 'String' (which will be transformed toRawSql
), string and symbol tuples, array of criterion and could raise a block withExpressionBuilder
as a current context (Array(Criteria)
is expected to be returned) -
Query#group
got same behavior asQuery#select
-
Query#order
realize same idea as withQuery#select
but with hashes -
added
Criteria#alias
method which allows to alias field in theSELECT
clause -
ExpressionBuilder#star
creates "all" attribute; allows optional argument specifying table name -
RawSql
now has@use_brakets
attribute presenting whether SQL statement should be surrounded by brackets -
Criteria#sql
method now acceptsuse_brackets
argument which is passed toRawSql
Migration
- mysql got
#varchar
method for column definition - added invoking of
TableBuilder::CreateMaterializedView
in#create_materialized_view
method - now
Jennifer::TableBuilder::CreateMaterializedView
accepts onlyString
query - added
#drop_materialized_view
- added
CreateIndex
,DropIndex
,CreateView
,DropView
classes and corresponding methods
Record
- added
attribute(name : String, type : T.class)
method
Model
- added
::context
method which return expression builder for current model - added
::star
method which returns "all" criteria - moved scope definition to
Scoping
module - now scopes accepts
QueryBuilder::QueryObject
class name as a 2nd argument - now object inserting into db use old variant with inserting and grepping last inserted id (because of bug with pg crystal driver)
View
- added view support for both mysql and postgres - name of abstract class for inheritance
Jennifer::View::Base