Class: Seedfaker::SeedFaker

Inherits:
Object
  • Object
show all
Defined in:
lib/seedfaker.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(seed: nil, locale: nil, tz: nil, since: nil, until_time: nil) ⇒ SeedFaker

Returns a new instance of SeedFaker.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/seedfaker.rb', line 10

def initialize(seed: nil, locale: nil, tz: nil, since: nil, until_time: nil)
  lib = Seedfaker.find_library
  raise "seedfaker: native FFI library not found" unless lib

  @ffi = Fiddle.dlopen(lib)
  opts = JSON.generate({
    seed: seed, locale: locale, tz: tz,
    since: since&.to_i, until: until_time&.to_i
  }.compact)
  @sf_create = Fiddle::Function.new(@ffi["sf_create"], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
  @sf_destroy = Fiddle::Function.new(@ffi["sf_destroy"], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOID)
  @sf_field = Fiddle::Function.new(@ffi["sf_field"], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
  @sf_records = Fiddle::Function.new(@ffi["sf_records"], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
  @sf_record = Fiddle::Function.new(@ffi["sf_record"], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
  @sf_validate = Fiddle::Function.new(@ffi["sf_validate"], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
  @sf_free = Fiddle::Function.new(@ffi["sf_free"], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOID)
  @sf_last_error = Fiddle::Function.new(@ffi["sf_last_error"], [], Fiddle::TYPE_VOIDP)
  @handle = @sf_create.call(opts)
  raise "sf_create failed: #{last_error}" if @handle.null?

  ObjectSpace.define_finalizer(self, SeedFaker.invoke_release(@sf_destroy, @handle))
end

Class Method Details

.fieldsObject



72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/seedfaker.rb', line 72

def self.fields
  lib = Seedfaker.find_library
  raise "seedfaker: native FFI library not found" unless lib

  ffi = Fiddle.dlopen(lib)
  sf_fields = Fiddle::Function.new(ffi["sf_fields_json"], [], Fiddle::TYPE_VOIDP)
  sf_free = Fiddle::Function.new(ffi["sf_free"], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOID)
  ptr = sf_fields.call
  json = ptr.to_s
  sf_free.call(ptr)
  JSON.parse(json).map { |f| f["name"] }
end

.fingerprintObject



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/seedfaker.rb', line 85

def self.fingerprint
  lib = Seedfaker.find_library
  raise "seedfaker: native FFI library not found" unless lib

  ffi = Fiddle.dlopen(lib)
  sf_fp = Fiddle::Function.new(ffi["sf_fingerprint"], [], Fiddle::TYPE_VOIDP)
  sf_free = Fiddle::Function.new(ffi["sf_free"], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOID)
  ptr = sf_fp.call
  val = ptr.to_s
  sf_free.call(ptr)
  val
end

.invoke_release(sf_destroy, handle) ⇒ Object



33
34
35
# File 'lib/seedfaker.rb', line 33

def self.invoke_release(sf_destroy, handle)
  proc { sf_destroy.call(handle) }
end

Instance Method Details

#field(name, n: 1, **opts) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/seedfaker.rb', line 37

def field(name, n: 1, **opts)
  spec = build_spec(name, opts)
  if n == 1
    field_one(spec)
  else
    Array.new(n) { field_one(spec) }
  end
end

#record(fields, ctx: nil, corrupt: nil) ⇒ Object



46
47
48
49
50
51
52
53
# File 'lib/seedfaker.rb', line 46

def record(fields, ctx: nil, corrupt: nil)
  opts = JSON.generate({ fields: fields, ctx: ctx, corrupt: corrupt }.compact)
  ptr = @sf_record.call(@handle, opts)
  raise "sf_record failed: #{last_error}" if ptr.null?
  json = ptr.to_s
  @sf_free.call(ptr)
  JSON.parse(json)
end

#records(fields, n: 1, ctx: nil, corrupt: nil) ⇒ Object



55
56
57
58
59
60
61
62
# File 'lib/seedfaker.rb', line 55

def records(fields, n: 1, ctx: nil, corrupt: nil)
  opts = JSON.generate({ fields: fields, n: n, ctx: ctx, corrupt: corrupt }.compact)
  ptr = @sf_records.call(@handle, opts)
  raise "sf_records failed: #{last_error}" if ptr.null?
  json = ptr.to_s
  @sf_free.call(ptr)
  JSON.parse(json)
end

#validate(fields, ctx: nil, corrupt: nil) ⇒ Object



64
65
66
67
68
69
70
# File 'lib/seedfaker.rb', line 64

def validate(fields, ctx: nil, corrupt: nil)
  opts = JSON.generate({ fields: fields, ctx: ctx, corrupt: corrupt }.compact)
  ptr = @sf_validate.call(@handle, opts)
  raise "validate failed: #{last_error}" if ptr.null?
  @sf_free.call(ptr)
  nil
end