All Versions
21
Latest Version
Avg Release Cycle
81 days
Latest Release
528 days ago
Changelog History
Page 1
Changelog History
Page 1
-
v0.12.0 Changes
December 15, 2021General
- โ 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
-
v0.11.1 Changes
August 24, 2021General
- switch to the
crimson-knight/i18n.cr
~> 0.4.1
Migration
- ๐ fix
TableBuilder::ChangeTable#drop_reference
dropping column before reference - โ add
TableBuilder::DropReference
- switch to the
-
v0.11.0 Changes
July 20, 2021General
- โ 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
- โ add crystal
-
v0.10.0 Changes
December 11, 2020๐ Changes
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 getter- ๐ป
CommonMapping#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 attribute Mapping#set_attribute
to acceptAttrType
- ๐ป
Mapping#set_attribute
raisesJennifer::UnknownAttribute
exception if model has no requested attribute - โก๏ธ
Mapping#update_columns
raisesJennifer::UnknownAttribute
if key-value pairs include unknown field Mapping#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
-
v0.9.0 Changes
May 24, 2020๐ Changelog
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
- 0๏ธโฃ
Resource.table_prefix
now returns underscored namespace name (if any) by default Base
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
- โ add Crystal
-
v0.8.4 Changes
November 15, 2019๐ Changes
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
- ๐ use adapter's
-
v0.8.3 Changes
October 19, 2019๐ Changes
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)
- 0๏ธโฃ 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 actions- โ
TableBuilder::CreateTable#reference
acceptson_delete
andon_update
options to specify corresponding actions TableBuilder::CreateTable#foreign_key
acceptson_delete
andon_update
keyword arguments to specify corresponding actions
- โ add crystal
-
v0.8.2 Changes
September 11, 2019General
- โฌ๏ธ upgrade
TechMagister/i18n.cr
dependency to0.3.1
- โฌ๏ธ upgrade
-
v0.8.1 Changes
September 04, 2019General
- โ 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.
- โ add
-
v0.8.0 Changes
June 11, 2019It has been a long time since previous release but expectation is worth it. 0.8.0 release brings a lot of new features such as:
- extended model mapping
- new properties to configure sql column name and autoincrementability of primary key
- opportunity to define mapping in modules and abstract super classes
Model.new
now respectsafter_initialize
callbacks- unify mapping for model and view
- extended querying functionality
- make SQL API more natural
- support of upsert operation
- add
CTE
๐ Also a lot of bugs were fixed and performance enhancements were made.
๐ API documentation is hugely increased so now almost all places are covered.
๐ Changelog
General
- 0๏ธโฃ 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 builder Query
'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 public- ๐
Function.define
macro acceptscomment
key to specify function class documentation comment - 0๏ธโฃ
Function.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 STI - ๐
Base.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 object- ๐
Resource::Supportable
alias is removed Resource.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
- extended model mapping