Пример #1
0
 /**
  * Execute the console command.
  *
  * @return mixed
  */
 public function fire()
 {
     $experiments = Experiment::active()->get();
     $goals = array_unique(Goal::active()->orderBy('name')->lists('name'));
     $columns = array_merge(['Experiment', 'Visitors', 'Engagement'], array_map('ucfirst', $goals));
     $writer = new Writer(new SplTempFileObject());
     $writer->insertOne($columns);
     foreach ($experiments as $experiment) {
         $engagement = $experiment->visitors ? $experiment->engagement / $experiment->visitors * 100 : 0;
         $row = [$experiment->name, $experiment->visitors, number_format($engagement, 2) . " % (" . $experiment->engagement . ")"];
         $results = $experiment->goals()->lists('count', 'name');
         foreach ($goals as $column) {
             $count = array_get($results, $column, 0);
             $percentage = $experiment->visitors ? $count / $experiment->visitors * 100 : 0;
             $row[] = number_format($percentage, 2) . " % ({$count})";
         }
         $writer->insertOne($row);
     }
     $output = (string) $writer;
     if ($file = $this->argument('file')) {
         $this->info("Creating {$file}");
         File::put($file, $output);
     } else {
         $this->line($output);
     }
 }
Пример #2
0
 public function testExport()
 {
     Artisan::call('ab:install');
     Experiment::find('a')->update(['visitors' => 153, 'engagement' => 35]);
     Goal::create(['name' => 'foo', 'experiment' => 'a', 'count' => 42]);
     $output = new Symfony\Component\Console\Output\BufferedOutput();
     Artisan::call('ab:export', [], $output);
     $report = $output->fetch();
     $this->assertContains('Foo', $report);
     $this->assertContains('153', $report);
     $this->assertContains('35', $report);
     $this->assertContains('42', $report);
     $output = new Symfony\Component\Console\Output\BufferedOutput();
     Artisan::call('ab:export', ['file' => '/tmp/test.csv'], $output);
     $report = $output->fetch();
     $this->assertContains('Creating /tmp/test.csv', $report);
 }
Пример #3
0
 /**
  * Execute the console command.
  *
  * @return mixed
  */
 public function fire()
 {
     $experiments = Experiment::active()->get();
     $goals = array_unique(Goal::active()->orderBy('name')->lists('name')->toArray());
     $columns = array_merge(['Experiment', 'Visitors', 'Engagement'], array_map('ucfirst', $goals));
     $table = new Table($this->output);
     $table->setHeaders($columns);
     foreach ($experiments as $experiment) {
         $engagement = $experiment->visitors ? $experiment->engagement / $experiment->visitors * 100 : 0;
         $row = [$experiment->name, $experiment->visitors, number_format($engagement, 2) . " % (" . $experiment->engagement . ")"];
         $results = $experiment->goals()->lists('count', 'name');
         foreach ($goals as $column) {
             $count = array_get($results, $column, 0);
             $percentage = $experiment->visitors ? $count / $experiment->visitors * 100 : 0;
             $row[] = number_format($percentage, 2) . " % ({$count})";
         }
         $table->addRow($row);
     }
     $table->render();
 }
Пример #4
0
 /**
  * Execute the console command.
  *
  * @return mixed
  */
 public function fire()
 {
     $connection = Config::get('ab::connection');
     // Create experiments table.
     if (!Schema::connection($connection)->hasTable('experiments')) {
         Schema::connection($connection)->create('experiments', function ($table) {
             $table->increments('id');
             $table->string('name');
             $table->integer('visitors')->unsigned()->default(0);
             $table->integer('engagement')->unsigned()->default(0);
             $table->timestamps();
         });
     }
     // Create goals table.
     if (!Schema::connection($connection)->hasTable('goals')) {
         Schema::connection($connection)->create('goals', function ($table) {
             $table->increments('id');
             $table->string('name');
             $table->string('experiment');
             $table->integer('count')->unsigned()->default(0);
             $table->timestamps();
         });
     }
     $this->info('Database schema initialized.');
     $experiments = Config::get('ab')['experiments'];
     if (!$experiments or empty($experiments)) {
         return $this->error('No experiments configured.');
     }
     $goals = Config::get('ab')['goals'];
     if (!$goals or empty($goals)) {
         return $this->error('No goals configured.');
     }
     // Populate experiments and goals.
     foreach ($experiments as $experiment) {
         Experiment::firstOrCreate(['name' => $experiment]);
         foreach ($goals as $goal) {
             Goal::firstOrCreate(['name' => $goal, 'experiment' => $experiment]);
         }
     }
     $this->info('Added ' . count($experiments) . ' experiments.');
 }
Пример #5
0
 /**
  * Mark a goal as completed for the current experiment.
  *
  * @return void
  */
 public function complete($name)
 {
     // Only complete once per experiment.
     if ($this->session->get("completed_{$name}")) {
         return;
     }
     $goal = Goal::firstOrCreate(['name' => $name, 'experiment' => $this->experiment()]);
     Goal::where('name', $name)->where('experiment', $this->experiment())->update(['count' => $goal->count + 1]);
     // Mark current experiment as completed.
     $this->session->set("completed_{$name}", 1);
 }
Пример #6
0
 public function testGoalWithoutReferer()
 {
     // Register fake named route
     Route::any('/foobar', ['as' => 'buy', function () {
         return 'hello world';
     }]);
     $headers = Request::instance()->server->getHeaders();
     $request = Request::create('http://localhost/foobar', 'get', [], [], [], $headers);
     Route::dispatch($request);
     $ab = App::make('ab');
     $ab->experiment();
     $ab->track($request);
     $this->assertEquals(1, Experiment::find('a')->visitors);
     $this->assertEquals(1, Experiment::find('a')->engagement);
     $this->assertEquals(1, Goal::where('name', 'buy')->where('experiment', 'a')->first()->count);
 }